в чем разница между порогом ALSA, avail_min и периодом?

Я работаю над процедурой захвата ALSA на четырехъядерном компьютере Debian, и я сбит с толку.

Базовый захват ALSA, интерфейс hw:0, 16 бит, 44,1 кГц, использование блокирующего потока с poll(), управляемого snd_pcm_start() и snd_pcm_drop(). Я проверяю возвращаемые значения всех вызовов ALSA API. Базовый захват работает нормально, но я не могу понять, как установить частоту опроса (то есть, как часто ALSA уведомляет мою процедуру poll() о возврате, поскольку кадры доступны для чтения).

Я использую snd_pcm_sw_params_set_avail_min(), чтобы установить это значение на 2048 кадров, и poll() возвращает значение, когда для чтения доступно около 2048 кадров. Я звоню snd_pcm_avail_delay() перед тем, как позвонить snd_pcm_readi(), и все кажется разумным. Но если я установлю значение меньше 2048, я получу противоречивые результаты. Если я установлю avail_min на 1024, в половине случаев poll() будет возвращаться, когда будет доступно около 1024 кадров, а в половине случаев — только после того, как будет доступно 1500 кадров. Когда я устанавливаю avail_min на 512, самое первое чтение — 512, но затем 95% последующих чтений составляют 1024 кадра или больше. Когда я вызываю snd_pcm_hw_params_get_period_size_min/max(), это устройство сообщает допустимый диапазон от 16 до 8192 кадров, поэтому период в 512 кадров не кажется необоснованным — драйвер сообщает, что аппаратное обеспечение поддерживает его.

Я перепробовал все комбинации snd_pcm_sw_params_set_avail_min(), snd_pcm_hw_params_set_period_size() и snd_pcm_sw_params_set_start_threshold(), но все еще не могу получить приемлемых результатов.

Я попытался привязать этот поток к одному ядру ЦП с помощью pthread setaffinity. Я попытался sched_setschedule() дать процессу "мягкие" приоритеты в реальном времени. Кажется, ничто не позволяет мне получать согласованные результаты опроса(), кроме установки avail_min как минимум на 2048.

Итак, вот несколько вопросов ALSA:

  1. Является ли начальный порог (с использованием snd_pcm_sw_params_set_start_threshold()) релевантным только для асинхронного захвата? То есть начальный порог неприменим для захвата на основе poll(). Это правильно?

  2. В чем разница между размером периода в кадрах и размером avail_min в кадрах? Документация, по-видимому, подразумевает, что avail_min устанавливает точку, в которой poll() вернется, потому что для чтения доступно как минимум столько же кадров. Размер периода является аппаратным параметром, но API по-прежнему предоставляет минимальное и максимальное значение и способ его установки. Мне кажется, что это действительно одно и то же, но я не могу заставить свой опрос() возвращаться в соответствии с установленным периодом.

  3. Я неправильно прочитал документацию, когда интерпретировал намерение snd_pcm_sw_params_set_avail_min() установить целевое количество доступных захваченных кадров для запуска подпрограммы poll()?

  4. Разумно ли ожидать, что poll() будет возвращаться более последовательно, чем когда для чтения доступно от 500 до 1500 кадров? или это нормальное поведение, и я должен ожидать больших различий в количестве кадров, доступных для чтения?

  5. Если ожидаются большие вариации, лучше ли всегда считывать общее количество доступных фреймов, как сообщает snd_pcm_avail(), или лучше считывать заданное количество фреймов каждый раз, когда poll() возвращает значение?


person Andres Gonzalez    schedule 24.12.2013    source источник
comment
еще интересует ответ на пункт №5...   -  person PypeBros    schedule 23.07.2015


Ответы (1)


Порог запуска не имеет особого смысла для устройств захвата; просто установите его на 1.

Аппаратное обеспечение непрерывно заполняет буфер захвата, но вызывает прерывание только в конце каждого периода. Когда ALSA ожидает доступности некоторых данных (в опросе или в snd_pcm_read*), она не вернется до тех пор, пока не станут доступны кадры avail_min. Однако эта проверка выполняется только в начале функции или когда она пробуждается прерыванием.

Поэтому, если вы не хотите ждать слишком долго, вам нужно сделать размер периода достаточно коротким.

person CL.    schedule 25.12.2013