如何设置Alsa播放缓冲区的大小?

时间:2019-07-09 13:48:17

标签: c alsa buildroot

我的应用程序无法在使用buildroot创建的嵌入式系统中设置alsa回放缓冲区的大小。但是在Ubuntu桌面下,同一应用程序可以将缓冲区大小设置为正常。

snd_pcm_hw_params_t *params;
snd_pcm_hw_params_alloca(&params);
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系统怎么了?

0 个答案:

没有答案