OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7005|回复: 20

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

[复制链接]

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-6-13 15:49:10 | 显示全部楼层 |阅读模式
5金钱
      探索者407开发板的声卡实验里面这两个指针不太明白是什么意思,读完代码我理解因为接收的音频流是48KHz,而片内IIS的分频只能做不到48KHz,直接透传会造成音频混叠。所以才在出现混叠帧的时候要抛弃一帧内容。不知道原子的最初设计是不是这样
      我还发现声卡实验视频里最后演示的实验用的两个歌曲“大海”“i can‘t tell you why”的音频文件格式是44.1KHz和92KHz。所以我认为只要播放设备的标识符设置为48KHz,PC在下发音频流的时候会自动转成48KHz。
      所以我假设我的设备和codec声卡都设置为同样的采样频率和格式比如都是16K采样,24bit。那么不需要在arm里面把不同采样的音频流进行裁剪。@正点原子
QQ图片20160613154054.png
QQ图片20160613154707.png

最佳答案

查看完整内容[请看2#楼]

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

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-6-13 15:49:11 | 显示全部楼层
本帖最后由 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
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-14 09:17:24 | 显示全部楼层
lvehe 发表于 2016-6-13 20:50
在usbd_audio_DataOut函数中,IsocOutWrPtr首先指向IsocOutBuff起始位置,并开始接收电脑传传输过来的音频 ...

这位大哥给我的提示不少,都很受用,我这方面还要多想你取经。如果usb会进行重采样的话,那我其实不需要修改描述符为指定采样率,直接将buff的数据进行3取一或者二取一就可以获得16K或者24K的输出。然后只要把iis的总线和dma中断的搬运buf的长度做相应的修改就可以了。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-16 09:56:38 | 显示全部楼层
lvehe 发表于 2016-6-13 15:49
在usbd_audio_DataOut函数中,IsocOutWrPtr首先指向IsocOutBuff起始位置,并开始接收电脑传传输过来的音频 ...

呵呵,其实直接描述符那个频率的宏定义改成16K,然后卸载掉原来的驱动重新插拔一下装置就可以以16K音质播放了。不要把数据进行3取1那么麻烦的步骤。之前没成功是因为设备pid一直没修改,所以PC没有重新更新驱动,卸了重装就可以了。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-16 10:03:05 | 显示全部楼层
lvehe 发表于 2016-6-13 15:49
在usbd_audio_DataOut函数中,IsocOutWrPtr首先指向IsocOutBuff起始位置,并开始接收电脑传传输过来的音频 ...

另外打搅您,想请教一个问题,我们录音或者播放的音量调节范围应该是在描述符里面修改吧。就是截图这个地方。公司之前用ti的85xx系列都是调节到+12db,目前这个30db太大了,一般说话录音只要+3~+6就可以了。现在想保持一致,我在usb 描述符的文档也找了vol 调节的介绍,但是描述符里面没有找到相应修改的地方。不知道您对这个修改有什么建议。
QQ图片20160616095814.png
QQ图片20160616095840.png
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-6-16 10:07:59 | 显示全部楼层
czdspeed 发表于 2016-6-16 10:03
另外打搅您,想请教一个问题,我们录音或者播放的音量调节范围应该是在描述符里面修改吧。就是截图这个地 ...

描述符里面没有。枚举的时候主机会发送GET_MIN、GET_MAX和GET_RES来获取音量的范围和步进值的。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-16 10:51:50 | 显示全部楼层
lvehe 发表于 2016-6-16 10:07
描述符里面没有。枚举的时候主机会发送GET_MIN、GET_MAX和GET_RES来获取音量的范围和步进值的。

这几个和set max set min在驱动程序里面都没有被引用过。我之前试着直接修改了init里面vol,但是发现这个只是改了默认音量,这个范围还是不清楚在哪里修改。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-16 10:53:55 | 显示全部楼层
lvehe 发表于 2016-6-16 10:07
描述符里面没有。枚举的时候主机会发送GET_MIN、GET_MAX和GET_RES来获取音量的范围和步进值的。

usbd_audio_Setup有类似的修改,我试着把这里改一下看看有没有效果。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-17 09:36:06 | 显示全部楼层
lvehe 发表于 2016-6-16 10:07
描述符里面没有。枚举的时候主机会发送GET_MIN、GET_MAX和GET_RES来获取音量的范围和步进值的。

hehe,这个好像不行没有跟踪到pc发过来的请求。我猜可能是直接断点跟踪跟踪不到。我用bus hub看发过来的都是“GET DESCRIPTOR”。我对了usb命令的描述表。不太确定GET_MAX和SET_MAX是是不是获取描述符里面取得的信息。
QQ图片20160617093321.png
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-6-17 10:06:17 | 显示全部楼层
QQ截图20160617100529.png
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-17 10:17:32 | 显示全部楼层

你用的usb trace是吧。那我再试试。
QQ图片20160617101627.png
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-23 10:22:54 | 显示全部楼层

ivehe:我忘记说了。那天我回去用usbtrace进行了数据抓取,抓取的数据都是URB TYPE的没有AUDIO type的命令。也没有在过滤器看到这个audio的抓取设置。这个是不是usbtrace的版本问题。
QQ图片20160623102133.png
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-6-23 10:31:05 | 显示全部楼层
czdspeed 发表于 2016-6-23 10:22
ivehe:我忘记说了。那天我回去用usbtrace进行了数据抓取,抓取的数据都是URB TYPE的没有AUDIO type的命 ...

我用的版本是3.0.1.82。应该不是版本问题。USB Request Blocks里面的你全部选中试试。同时选中那个插头形状的图标“Capture Hot Plugged Devices”(对刚刚插入的USB设备进行捕获)。又或者是你的程序改动了,导致USB主机没有产生SET_CUR之类的请求。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-23 11:59:37 | 显示全部楼层
lvehe 发表于 2016-6-23 10:31
我用的版本是3.0.1.82。应该不是版本问题。USB Request Blocks里面的你全部选中试试。同时选中那个插头形 ...

我重新看了一下,没有发现audio get_max  get_min。你的程序不修改直接跑的话,音量的增益范围是多少。

QQ图片20160623115013.png
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-6-23 12:19:06 | 显示全部楼层
czdspeed 发表于 2016-6-23 11:59
我重新看了一下,没有发现audio get_max  get_min。你的程序不修改直接跑的话,音量的增益范围是多少。
...

你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-23 15:02:52 | 显示全部楼层
lvehe 发表于 2016-6-23 12:19
你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。

我是把你的driver 和 otg的文件拿出来放到我的文件里面的。不太记得下的是你哪个工程。我这里的增益调节范围是-192~30DB,最大是30DB。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-6-23 15:19:04 | 显示全部楼层
lvehe 发表于 2016-6-23 12:19
你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。

我回去再重新下一个你的多频率的工程,参考设置一下。最近一段要改一个降噪算法,这块会让我同事帮我改一下。谢谢你了。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-7-1 16:50:18 | 显示全部楼层
lvehe 发表于 2016-6-23 12:19
你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。

我这里有一个探索者407开发板的录音和放音的demo,是我同事在声卡实验的基础上改的。双向都通了,但是我把算法加进去就识别不了,之前把算法加在录音那个demo'上是没有问题的。这个问题我还需要调一下。你之前也在做二合一,这个你拿去参考参考。官方那个二合一的有点复杂不是很好作参考。

speaker_record_ok_01.zip

6.29 MB, 下载次数: 336

回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-7-1 17:05:07 | 显示全部楼层
lvehe 发表于 2016-6-23 12:19
你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。

我按照你的思路改了增益,目前我把面板的范围调整到了-6~6DB,数据源也做了缩放的接口。不过今天看了看,好像volume这个变量一直没有根据我的调整去更新。
我是在static uint8_t  usbd_audio_EP0_RxReady (void  *pdev)加入了获得PC设置volume的操作
        if (AudioCtlCmd == AUDIO_REQ_SET_CUR)
        {
                switch (setup_req.bmRequest & USB_REQ_RECIPIENT_MASK)
                {
                        case USB_REQ_RECIPIENT_INTERFACE:
                                switch (HIBYTE(setup_req.wValue))
                                {

                                case AUDIO_CONTROL_VOLUME:
                                        Volume = *((uint16_t *)AudioCtl);
                                        break;
                                }
                                break;
                        case USB_REQ_RECIPIENT_ENDPOINT:
                                switch (HIBYTE(setup_req.wValue))
                                {
                                case AUDIO_SAMPLING_FREQ_CONTROL:

                                        break;
                                }
                                break;
                }

是不是哪里漏了什么步骤?@Ivehe
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-7-1 19:50:36 | 显示全部楼层
lvehe 发表于 2016-6-23 12:19
你是下的支持多频的那个程序吗?支持多频的那个最大增益20dB。

Ivehe,找到问题了我set+current那个地方改错了文件,应该是在usbd_audio_core里面修改,我改到usbd_core里面了。
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-7-1 20:06:09 | 显示全部楼层
czdspeed 发表于 2016-7-1 19:50
Ivehe,找到问题了我set+current那个地方改错了文件,应该是在usbd_audio_core里面修改,我改到usbd_core ...

那就好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 17:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表