Linux 找到所有我可以用 ALSA 播放 PCM 的设备
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6866103/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Finding all the devices I can use to play PCM with ALSA
提问by Luca Carlon
I use ALSA to play PCM samples. I open the PCM stream with this function:
我使用 ALSA 来播放 PCM 样本。我用这个函数打开 PCM 流:
int snd_pcm_open(snd_pcm_t** pcmp,
const char* name,
snd_pcm_stream_t stream,
int mode);
I'm currently using "default" as the name parameter. I would like to be able to choose other devices. What I cannot understand is how I can determine what are the names of the other available devices.
我目前使用“默认”作为名称参数。我希望能够选择其他设备。我无法理解的是如何确定其他可用设备的名称。
I attached a USB microphone to my system and aplay and amixer seems to detect the new device. How do I determine the name of that device? Is there any ALSA function to get a list of available devices with their respective names?
我将一个 USB 麦克风连接到我的系统,并且 aplay 和 amixer 似乎检测到了新设备。如何确定该设备的名称?是否有任何 ALSA 功能来获取可用设备及其各自名称的列表?
采纳答案by O.C.
I think you can use snd_device_name_hintfor enumerating devices. Here is an example. Beware that I haven't compiled it !
我认为您可以使用snd_device_name_hint来枚举设备。这是一个例子。请注意,我还没有编译它!
char **hints;
/* Enumerate sound devices */
int err = snd_device_name_hint(-1, "pcm", (void***)&hints);
if (err != 0)
return;//Error! Just return
char** n = hints;
while (*n != NULL) {
char *name = snd_device_name_get_hint(*n, "NAME");
if (name != NULL && 0 != strcmp("null", name)) {
//Copy name to another buffer and then free it
free(name);
}
n++;
}//End of while
//Free hint buffer too
snd_device_name_free_hint((void**)hints);
回答by Robel Sharma
It was my first requirements to a linux/unix projects where I need to know about all of the available audio devices capability and name. Then I need to use these devices to capture and plaback the audio. What I have done is pretty simple. There is a linux/unix command which is used to find the devices through alsa utility in linux.
这是我对 linux/unix 项目的第一个要求,我需要了解所有可用的音频设备功能和名称。然后我需要使用这些设备来捕获和播放音频。我所做的非常简单。有一个 linux/unix 命令用于通过 linux 中的 alsa 实用程序查找设备。
It is:
这是:
aplay -l
Now what I did is just make a programme to give the out as like as this by alsa.
现在我所做的只是制作一个程序来像这样由 alsa 发出。
For everyone's help I have made a (.so) library and a sample Application demonstrating the use of this library in c++.
为了大家的帮助,我制作了一个 (.so) 库和一个示例应用程序,演示了该库在 C++ 中的使用。
The output of my library is like-
我的图书馆的输出就像 -
[root@~]# ./IdeaAudioEngineTest
HDA Intel plughw:0,0
HDA Intel plughw:0,2
USB Audio Device plughw:1,0
This library can also capture and playback the real-time audio data.
该库还可以捕获和回放实时音频数据。
It is available with documentation in IdeaAudio library with Duplex Alsa Audio
回答by Scott Franco
Just for grins, your program reformatted:
只是为了咧嘴笑,你的程序重新格式化:
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <alsa/asoundlib.h>
void listdev(char *devname)
{
char** hints;
int err;
char** n;
char* name;
char* desc;
char* ioid;
/* Enumerate sound devices */
err = snd_device_name_hint(-1, devname, (void***)&hints);
if (err != 0) {
fprintf(stderr, "*** Cannot get device names\n");
exit(1);
}
n = hints;
while (*n != NULL) {
name = snd_device_name_get_hint(*n, "NAME");
desc = snd_device_name_get_hint(*n, "DESC");
ioid = snd_device_name_get_hint(*n, "IOID");
printf("Name of device: %s\n", name);
printf("Description of device: %s\n", desc);
printf("I/O type of device: %s\n", ioid);
printf("\n");
if (name && strcmp("null", name)) free(name);
if (desc && strcmp("null", desc)) free(desc);
if (ioid && strcmp("null", ioid)) free(ioid);
n++;
}
//Free hint buffer too
snd_device_name_free_hint((void**)hints);
}
int main(void)
{
printf("PCM devices:\n");
printf("\n");
listdev("pcm");
printf("MIDI devices:\n");
printf("\n");
listdev("rawmidi");
return 0;
}