Как использовать snd_pcm_writei ALSA ()?

Может кто-то объяснять как snd_pcm_writei

snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer,
                                 snd_pcm_uframes_t size)

работы?

Я использовал его как так:

for (int i = 0; i < 1; i++) {
   f = snd_pcm_writei(handle, buffer, frames);

   ...
}

Полный исходный код по http://pastebin.com/m2f28b578

Делает это означает, который я не должен давать snd_pcm_writei() количество всех кадров в buffer, но только

sample_rate * задержка = frames

?

Таким образом, если я, например, имею: sample_rate = 44 100 задержек = 0.5 [s] all_frames = 100000

Количество кадров, которым я должен дать snd_pcm_writei() был бы

sample_rate * задержка = структурирует 44100*0.5 = 22050

и количество повторений для цикла должно быть?:

(интервал) 100000/22050 = 4; с frames=22050

и одно дополнительное, но только с

100 000 модификаций 22050 = 11800

кадры?

Это то, как это работает?

Louise

http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#gf13067c0ebde29118ca05af76e5b17a9

5
задан Louise 1 February 2010 в 23:43
поделиться

1 ответ

фреймы должны быть тем количеством фреймов (сэмплов), которое вы хотите записать из буфера. Звуковой драйвер Вашей системы сразу же начнёт передавать эти сэмплы на звуковую карту, и они будут проигрываться с постоянной частотой.

Задержка введена в нескольких местах. Есть задержка от данных, буферизированных драйвером в ожидании передачи на звуковую карту. Есть, по крайней мере, один буфер, полный данных, которые передаются на карту в любой момент времени, и есть буферизация на стороне приложения, что, похоже, вас и беспокоит.

Для уменьшения латентности на стороне приложения необходимо записать наименьший буфер, который будет работать на вас. Если ваше приложение выполняет задачу DSP, то, как правило, это одно окно с данными.

Нет никакого преимущества в записи маленьких буферов в цикле - просто идите и записывайте все за один раз, но есть важный момент, который необходимо понять: чтобы минимизировать задержки, ваше приложение должно записывать в драйвер не быстрее, чем драйвер записывает данные на звуковую карту, иначе в итоге вы будете накапливать больше данных и накапливать все больше и больше латентности.

Для конструкции, позволяющей относительно легко производить данные в блокировке со звуковым драйвером, посмотрите на разъем (http://jackaudio.org/), который основан на регистрации функции обратного вызова в звуковом движке воспроизведения. На самом деле, вам, вероятно, просто лучше использовать jack вместо того, чтобы пытаться сделать это самостоятельно, если вы действительно беспокоитесь о задержке.

7
ответ дан 18 December 2019 в 13:14
поделиться