声卡实验里面IsocOutWrPtr和IsocOutRdPtr两个指针的用处?

2019-07-20 21:31发布

      探索者407开发板的声卡实验里面这两个指针不太明白是什么意思,读完代码我理解因为接收的音频流是48KHz,而片内IIS的分频只能做不到48KHz,直接透传会造成音频混叠。所以才在出现混叠帧的时候要抛弃一帧内容。不知道原子的最初设计是不是这样
      我还发现声卡实验视频里最后演示的实验用的两个歌曲“大海”“i can‘t tell you why”的音频文件格式是44.1KHz和92KHz。所以我认为只要播放设备的标识符设置为48KHz,PC在下发音频流的时候会自动转成48KHz。
      所以我假设我的设备和codec声卡都设置为同样的采样频率和格式比如都是16K采样,24bit。那么不需要在arm里面把不同采样的音频流进行裁剪。@正点原子
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
lvehe
2019-07-20 23:32
本帖最后由 lvehe 于 2016-6-13 20:53 编辑

在usbd_audio_DataOut函数中,IsocOutWrPtr首先指向IsocOutBuff起始位置,并开始接收电脑传传输过来的音频数据。
当其指向IsocOutBuff的中间位置时,设置PlayFlag = 1。
函数usbd_audio_SOF判断PlayFlag有效后,从IsocOutRdPtr开始播放音频数据。而此时IsocOutRdPtr指向IsocOutBuff的起始位置。
就这样以类似双缓冲的机制周而复始,IsocRdPtr永远追随着IsocOutWrPtr,直到IsocOutWrPtr与之相等,此时应该是电脑的音频数据播放完毕。

与录音类似,放音似乎也会对采样率进行重新处理。比如USB麦克风录音采样率为48kHz,实际电脑录音为44.1kHz。

分享一下让采样率精确接近实际采样率的时钟设置。如8MHz晶振足够精确,那么除44.1kHz和22.05kHz外,192kHz、96KHz、48kHz、32kHz、16kHz、8kHz都是0误差的。如要44.1kHz和22.05kHz精确,则要修改I2SN和I2SR。详见USB麦克风源码中的system_stm32f4xx.c。
STM32F407 8MHz-12.288MHz.png

一周热门 更多>