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