Я унаследовал некоторый код ALSA, который работает на встроенной платформе Linux.Существующая реализация блокирует чтения и записи с использованием snd_pcm_readi()
и snd_pcm_writei()
.
Мне поручено выполнить этот запуск на процессоре ARM, но я обнаружил, что заблокированное чередованное чтение читает pushЦП на 99%, поэтому я изучаю неблокирующие операции чтения и записи.
Я открываю устройство, как и следовало ожидать:
snd_pcm_handle *handle;
const char* hwname = "plughw:0"; // example name
snd_pcm_open(&handle, hwname, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK);
Затем происходят другие вещи ALSA, которые я могу предоставитьпо запросу.Следует отметить, что:
- мы устанавливаем частоту дискретизации 48 000 [Гц]
- , тип выборки имеет 32-разрядное целое число со знаком
- устройство всегдапереопределяет запрошенный размер периода на 1024 кадра
Считывание потока следующим образом:
int32* buffer; // buffer set up to hold #period_size samples
int actual = snd_pcm_readi(handle, buffer, period_size);
Этот вызов занимает около 15 [мс] для завершения в режиме блокировки.Очевидно, переменная actual
будет возвращать 1024 по возвращении.
Проблема в том, что;в режиме неблокирующем эта функция также требует 15 мсек для завершения и actual
также всегда читает 1024 при возврате.
Я ожидаю, что функция вернется немедленно, с actual
быть <= 1024 и вполне возможно читать «EAGAIN» (-11). </p>
Между попытками чтения я планирую перевести поток в спящий режим на определенное время, уступая процессорное время другим процессам.
Я неправильно понимаю API ALSA?Или может быть, в моем коде отсутствует жизненно важный шаг?