11

是否有 C 语言中全双工 ALSA 连接的示例?我已经读到它是受支持的,但是我看到的所有介绍性示例都记录或播放了声音样本,但我希望有一个处理程序可以为我的 VoIP 应用程序做这两者。

非常感谢您的帮助,延斯

4

4 回答 4

5

一个叫 Alan 的人发布了这个很好(但很老)的教程,Full Duplex ALSA,它是用 C语言编写的。

于 2011-03-09T02:15:42.380 回答
3

这是我对 Linux/Unix VoIP 项目的第一个要求,我需要了解所有可用的音频设备功能和名称。然后我需要使用这些设备来捕获和播放音频。

为了大家的帮助,我制作了一个 (.so) 库和一个示例应用程序,演示了在 c++ 中如何使用这个库。

我的图书馆的输出就像 -

[root@~]# ./IdeaAudioEngineTest
HDA Intel plughw:0,0
HDA Intel plughw:0,2
USB Audio Device plughw:1,0

该库提供捕获和播放实时音频数据的功能。

带有文档的完整源代码可在带有 Duplex Alsa Audio 的 IdeaAudio 库中获得

库源现已在github.com开放

于 2013-08-04T20:22:57.993 回答
3

您提供两个手柄的链接并依次泵送它们。这是艾伦的代码被省略和注释。

// the device plughw handle dynamic sample rate and type conversion.
// there are a range of alternate devices defined in your alsa.conf
// try: 
// locate alsa.conf
// and check out what devices you have in there
//  
// The following device is PLUG:HW:Device:0:Subdevice:0
// Often simply plug, plughw, plughw:0, will have the same effect 
//
char           *snd_device_in  = "plughw:0,0";
char           *snd_device_out = "plughw:0,0";

// handle constructs to populate with our links
snd_pcm_t      *playback_handle;
snd_pcm_t      *capture_handle;

//this is the usual construct... If not fail BLAH
if ((err = snd_pcm_open(&playback_handle, snd_device_out, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf(stderr, "cannot open output audio device %s: %s\n", snd_device_in, snd_strerror(err));
exit(1);
}

// And now the CAPTURE
if ((err = snd_pcm_open(&capture_handle, snd_device_in, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf(stderr, "cannot open input audio device %s: %s\n", snd_device_out, snd_strerror(err));
exit(1);
}

然后配置并泵送它们。

环形模组可以完成这项工作:http : //soundprogramming.net/programming_and_apis/creating_a_ring_buffer 或者您可以使用上面概述的alans方式。

于 2012-07-09T21:24:27.997 回答
2

另见latency.c,包含在alsa-lib源代码中;在 ALSA 维基上:

于 2013-09-18T06:03:47.260 回答