Debian上的音频采样

时间:2013-04-12 00:53:00

标签: c++ audio debian alsa

我们正在使用ALSA运行Debian,我们需要从音频输入线中提取音频样本。我们希望能够使用这些样本填充缓冲区,因此在它们到来时对它们执行操作。

我们已经尝试过直接查看ALSA调用但我们遇到了折旧功能的问题,因为很多资源已经很久了。

关于这个问题的方向有哪些好的参考或建议?

2 个答案:

答案 0 :(得分:1)

查看http://jackaudio.org/

根据维基百科:

  

JACK Audio Connection Kit(或JACK)是一款专业的声音服务器守护程序,可为两种音频提供实时,低延迟的连接   和实现其API的应用程序之间的MIDI数据。杰克是一个   递归的缩写。 JACK由开放社区开发   由Paul Davis领导的源代码开发人员(曾在2006年获得开源奖)   2004年这项工作)[3]并且一直是基础设施的关键部分   Linux以来专业音频软件的事实标准   它于2002年成立。该服务器是免费软件,根据该许可证授权   GNU GPL,而库是在更宽松的GNU下获得许可的   LGPL。

答案 1 :(得分:1)

使用一些最新的示例,如下所示:

#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;
}