c - 设置记录设备 alsa

标签 c alsa

我想将相同的功能从 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/

相关文章:

c++ - 最小对数

c++ - 如何以最高精度存储 double

c - 需要给初学者提供链表基本建议

c++ - 从 C++ 发送 MIDI 消息

c++ - 如何将写入标准输出的数据保存到本地缓冲区

c++ - 在 C++ 中使用 ALSA 捕获默认音频流

node.js - 在用 NodeJS 编写音频文件时读取它

ruby - Ruby可以在Linux ALSA系统中录制PCM麦克风输入吗?

audio - 使用 alsa_out 插孔音频和多个音频设备

C:读取文件以跟踪每个扩展的 ASCII 出现次数