Мы запускаем Debian с ALSA, и нам нужно извлечь аудиосэмплы из нашей строки аудиовхода. Мы хотим иметь возможность заполнить буфер этими образцами, поэтому выполняйте операции с ними по мере их поступления.
Мы пытались напрямую изучать вызовы ALSA, но сталкиваемся с проблемами с устаревшими функциями, так как многие ресурсы довольно старые.
Любые хорошие рекомендации или советы с точки зрения руководства по этой проблеме?
Используйте какой-нибудь современный пример, например:
#include <alsa/asoundlib.h>
static char *device = "default"; /* capture device */
unsigned short buffer[2 * 24000];
int main(void)
{
int err;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
printf("open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_S16,
SND_PCM_ACCESS_RW_INTERLEAVED,
2,
48000,
1,
500000)) < 0) { /* 0.5 sec */
printf(" open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
for (;;) {
frames = snd_pcm_readi(handle, buffer, 24000);
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_readi failed: %s\n", snd_strerror(err));
break;
}
// ...
}
snd_pcm_close(handle);
return 0;
}
посмотри на http://jackaudio.org/
согласно википедии:
JACK Audio Connection Kit (или JACK) — это профессиональный демон звукового сервера, который обеспечивает в реальном времени соединения с низкой задержкой для обоих аудио
и MIDI-данные между приложениями, которые реализуют его API. Джек это
рекурсивная аббревиатура. JACK был разработан сообществом открытых
разработчики исходного кода во главе с Полом Дэвисом (который выиграл награду Open Source в
2004 для этой работы) [3] и был ключевым элементом инфраструктуры и
стандарт де-факто для профессионального аудио программного обеспечения в Linux, так как
его начало в 2002 году. Сервер является свободным программным обеспечением, под лицензией
GNU GPL, в то время как библиотека лицензируется в соответствии с более разрешительной GNU
LGPL.