【问题标题】:Set record device alsa设置记录设备alsa
【发布时间】:2013-01-18 19:03:40
【问题描述】:

我想将相同的功能从 oss 混合器移植到 alsa,但我现在不知道如何检查设备 通道有捕获掩码。 开源代码:

这些函数处理混音器设备

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()”用于检查通道混音器是否可以在用户激活录制时进行录制,其中settings.mixer是用户选择的通道。

if (!mixer_set_rec_device()) {
        fprintf(stderr, "Could not set \"%s\" as recording Source", settings.mixer);
        return -1;
    }

【问题讨论】:

  • 这个 API 是为 SoundBlaster 卡设计的;许多声音设备没有捕获掩码。那么你的程序应该做什么呢?
  • 如果我选择,例如频道 cd,检查我是否可以从中录制

标签: c alsa


【解决方案1】:

有些设备可以从多个来源捕获;这些设备通常有几个名为 xxxxx Capture Switch 的布尔混音器控件。

有些设备只能从一个来源捕获;这些设备通常有一个名为 Capture Source 的枚举混音器控件。

在一般情况下,设备的混音器可能会完全不同。

在任何情况下,通用应用程序都不应该修改用户的混音器配置,而只是从一些 PCM 设备中录制;配置混音器应该由用户完成,或者由一些了解硬件的专业混音器应用程序来完成。

【讨论】:

  • 好的。我的应用程序如何检查混音器选择通道是否可以捕获以及是否可以返回 0?谢谢
  • 搜索我提到的混音器控件。正如我已经说过的,许多声音设备没有这样的通道,如果有,您的应用程序不应该更改它们的配置。为什么您需要更改它们?
  • 我不想改变,只是发送一个关于该频道可以或不可以捕获的消息。
  • 捕获设备可以在您打开它们时进行捕获。
猜你喜欢
  • 2017-03-13
  • 2013-01-23
  • 2014-04-13
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2012-09-04
  • 2011-05-04
相关资源
最近更新 更多