Как использовать API библиотеки alsa для работы с наушниками и динамиком? - PullRequest
1 голос
/ 25 апреля 2019

Я хочу реализовать (отключение / включение звука и увеличение / уменьшение громкости) для динамика и наушников с помощью программы c. Использование утилиты командной строки amixer, как показано в этой ссылке https://askubuntu.com/questions/371970/how-to-switch-between-headphones-and-speakers-manually-from-command-line, работает, те же вещи, которые мне нужно реализоватьс помощью программы на Си.

Поэтому я попытался разными способами.Я видел этот пример для регулировки громкости Master Установка общей громкости ALSA из кода C

и для отключения / включения Master Linux ALSA / Sound-API Вопросы - Как вы отключаете звук??

оба решения идеально подходят для конфигурации Master.Но здесь, в моем случае, я хочу реализовать ту же функциональность для динамика и наушников. Так что вместо «Мастер», если я заменил selem_name на «Динамик или Наушники + L0», который я нашел с помощью команды amixer, он выдает ошибку.

Здесь мне нужно отключить / включить звук «Динамик» или «Наушники».

Если я использую * selem_name = «Динамик» или «Наушники» в приведенном ниже коде, выдается ошибка, показанная ниже:

Является ли данное имя_селма недействительным?Если да, как я могу перечислить действительное имя_семена для динамика и наушников?Тот, который я использовал, выяснил из утилиты командной строки amixer.

Какой API я должен использовать для динамика и наушников?

Errorr eturn by test.c program:

alsa: simple.c:346: snd_mixer_selem_has_playback_switch: Assertion 
`elem' failed.
Aborted

//test.c

#include<stdio.h>
#include<alsa/asoundlib.h>

void SetAlsaSpeakerMute()
{
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";

    const char *selem_name = "Speaker";

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, card);
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);

    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, selem_name);
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, 0);
    }

    snd_mixer_close(handle);
}

int main()
{
    SetAlsaSpeakerMute();
    return 0;
}
//For const char *selem_name = "Master" this program works fine.
//This can mute Mixer of default sound card

void SetAlsaMasterMute()
{
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";
    const char *selem_name = "Master";

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, card);
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);

    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, selem_name);
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, 0);
    }

    snd_mixer_close(handle);
}

Есть ли решение дляОтключение звука / включение определенного устройства (динамик и наушники)? Спасибо всем за помощь.

1 Ответ

1 голос
/ 30 апреля 2019

Опять же, переменная elem кажется NULL для имени элемента управления, который вы используете.

Необходимо проверить идентификатор элемента управления (имя, индекс, интерфейс) и устройство управления для подключения микшера.Имя устройства «по умолчанию» обычно перенаправляет на импульсный звук (только элементы управления Master / PCM).Если вы используете '-c 0' для amixer, правильное имя устройства будет 'hw: 0' (const char * card = "hw: 0";).

...