我想将相同的功能从 oss Mixer 移植到 alsa,但我现在不知道如何检查设备是否 channel 有捕获掩码。 OSS代码:
这些函数处理混音器设备
static int mixer_fd = -1, mixer_src = -1;
int mixer_init(char *mixer_device, char *mixer_source)
{
int i;
mixer_src = -1;
for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
if (strcmp(mixer_source, devices[i]) == 0)
mixer_src = i;
mixer_fd = open(mixer_device, O_RDWR);
if (mixer_src < 0)
return -1;
if (mixer_fd < 0)
return 0;
return 1;
}
char** mixer_get_rec_devices(void)
{
int i, o, devmask, res;
char** result;
if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
return NULL;
else
{
result = malloc(sizeof(char*)*SOUND_MIXER_NRDEVICES);
o = 0;
for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
{
res = (devmask >> i)%2;
if (res)
{
result[o] = malloc(strlen(devices[i])+1);
sprintf(result[o], "%s", devices[i]);
o++;
}
result[o] = NULL;
}
}
return result;
}
int mixer_set_rec_device(void)
{
int devmask, recmask;
if (mixer_fd <= 0)
return 0;
if (mixer_src < 0)
return 0;
if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
return 0;
recmask = 1 << mixer_src;
if (!(recmask & devmask))
return 0;
if ((ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC, &recmask)) == -1)
return 0;
return 1;
}
我需要帮助将此代码移植到 ALSA 混合器。
函数“mixer_set_rec_device()”用于检查用户激活录音后 channel 混音器是否可以录音,其中settings.mixer是用户选择的 channel 。
if (!mixer_set_rec_device()) {
fprintf(stderr, "Could not set \"%s\" as recording Source", settings.mixer);
return -1;
}
最佳答案
某些设备可以从多个源捕获;这些设备通常有几个名为 xxxxx Capture Switch
的 bool 混音器控件。
某些设备只能从一个来源捕获;这些设备通常有一个名为Capture Source
的枚举混音器控件。
一般情况下,设备的混音器的工作方式可能完全不同。
无论如何,通用应用程序永远不应该修改用户的混音器配置,而只是从某些 PCM 设备进行录制;配置混音器应该由用户或某些了解硬件的专用混音器应用程序来完成。
关于c - 设置记录设备 alsa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680669/