Как установить размер буфера воспроизведения alsa? - PullRequest
0 голосов
/ 09 июля 2019

Мое приложение не может установить размер буфера воспроизведения alsa во встроенной системе, созданной с помощью buildroot. Но под рабочим столом 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);

Последняя версия printf под рабочим столом Ubuntu Actual Audio Freq 22050 Period 220 bufsize 131120 но в моей встроенной системе, созданной с помощью buildroot Actual Audio Freq 22050 Period 470 bufsize 7526

Так что определенно ALSA работает по-разному под моей Ubuntu и моей встроенной системой. Как я могу увеличить размер буфера воспроизведения alsa, если snd_pcm_hw_params_set_buffer_size_near () не работает? Кроме того, функция snd_pcm_hw_params_set_period_size_near () должна установить период равным 220 (и это происходит в Ubuntu x64-86), но в моей встроенной системе, которая также является сборкой root x86, это 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

но любое число, которое я напишу, может увеличить playbuffer, показанный в приложении printf, только до 7526 Или если я сделаю

$echo "64" > /proc/asound/card0/pcm0p/sub0/prealloc

тогда приложение printf говорит, что мой размер буфера равен 3763:

Actual Audio Freq 22050 Period 470 bufsize 3763

Как увеличить размер буфера воспроизведения до 64K или 120K? На рабочем столе Ubuntu это легко, но что не так с моей встроенной системой x86, созданной в buildroot?

...