我的应用程序无法在使用buildroot创建的嵌入式系统中设置alsa回放缓冲区的大小。但是在Ubuntu桌面下,同一应用程序可以将缓冲区大小设置为正常。
snd_pcm_hw_params_t *params;
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_hw_params_any(m_DeviceHandle, params);
err = snd_pcm_hw_params_set_access(m_DeviceHandle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
if(err<0) printf("fail snd_pcm_hw_params_set_access()\n");
snd_pcm_format_t f = SND_PCM_FORMAT_S16_LE;
err = snd_pcm_hw_params_set_format(m_DeviceHandle, params, f);
if(err<0) printf("fail snd_pcm_hw_params_set_format()\n");
err = snd_pcm_hw_params_set_channels(m_DeviceHandle, params, nChanels);
if(err<0) printf("fail snd_pcm_hw_params_set_channels()\n");
unsigned int Freq = 22050;
err = snd_pcm_hw_params_set_rate_near(m_DeviceHandle, params, &Freq, &dir);
if(err<0) printf("fail snd_pcm_hw_params_set_rate_near()\n");
snd_pcm_uframes_t frames = Freq / 100;
err = snd_pcm_hw_params_set_period_size_near(m_DeviceHandle, params, &frames, &dir);
if(err<0) printf("fail snd_pcm_hw_params_set_period_size_near()\n");
snd_pcm_uframes_t buf_size = 128*1024;
err = snd_pcm_hw_params_set_buffer_size_near(m_DeviceHandle, params, &buf_size );
if(err<0) printf("fail snd_pcm_hw_params_set_buffer_size_near()\n");
printf("Actual Audio Freq %d Period %d bufsize %d\n",Freq, frames,buf_size);
Ubuntu桌面上的最后一个printf显示
Actual Audio Freq 22050 Period 220 bufsize 131120
但是在我用buildroot创建的嵌入式系统中
Actual Audio Freq 22050 Period 470 bufsize 7526
因此,在我的Ubuntu和嵌入式系统下,ALSA的工作原理肯定有所不同。 如果snd_pcm_hw_params_set_buffer_size_near()不起作用,如何增加alsa播放缓冲区的大小? 同样,函数snd_pcm_hw_params_set_period_size_near()应该将周期设置为220(在x64-86 Ubuntu下也是如此),但是在我的嵌入式系统(也是x86 buildroot)下,它的周期为470。
我正在用buildroot构建嵌入式系统,我自己选择内核选项。好了,我已将所有声音相关的内核选项从Ubuntu .config复制到buildroot内核配置(然后重新构建Lunux内核和buildroot映像)。但这无济于事。行为完全一样是错误的-无法设置缓冲区大小。
我正在搜索允许设置应用程序播放缓冲区大小的任何alsa.conf选项,但是在/etc/asound.conf或/usr/share/alsa/*.conf中都看不到任何选项,甚至〜/ asoundrc .conf
我看到的奇怪差异是
$ cat /proc/asound/card0/pcm0p/sub0/prealloc_max
128
在Ubuntu上 但在我的嵌入式系统上
$ cat /proc/asound/card0/pcm0p/sub0/prealloc_max
32768
但是我无法以某种方式设置此限制,它是不可更改的。
我可以修改其他文件 / proc / asound / card0 / pcm0p / sub0 / prealloc
$echo "128" > /proc/asound/card0/pcm0p/sub0/prealloc
但是我写的任何数字只能将应用程序printf中显示的播放缓冲区增加到7526 或者如果我这样做
$echo "64" > /proc/asound/card0/pcm0p/sub0/prealloc
然后应用程序printf说我的缓冲区大小为3763:
Actual Audio Freq 22050 Period 470 bufsize 3763
如何将播放缓冲区的大小增加到64K样本或120K样本? 在Ubuntu桌面上,这很容易,但是在buildroot下创建的嵌入式x86系统怎么了?