Welcome to the Linux Foundation Forum!

ALSA: 2 input channels, only one is recording

So here is my pickle. I am very new to linux and to make matters worse i am working on an embedded system and not a PC. i have been searching for this topic but almost everything i find shows just 1 recording device.

we have a codec/sound card that has 2 input channels and 2 output channels and i need all of them at the same time. when i run my code to capture the audio samples i am only getting 1 channel and not the other. when i do arecord it is the same result.

my first series of questions are: Does ALSA only do 1 input at a time by default? if so is there a way to change that? if not does it mix the 2 inputs when doing an arecord or do i have to specify which channel i want?

my other thought about my issue is that it isn't being routed properly and it is taking the samples off an input that is not connected to anything. the thing is i can't figure out, in the OS, which port it thinks it is connected to. i think that is too deep into the hardware for linux to have an idea about that.

thanks for any help you can give

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Answers

  • Posts: 368

    By default ALSA has all channels muted. Those have to be unmuted manually.

    Source - https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture

  • so here is more information:

    when i do "amixer" i get:
    ...
    Simple mixer control 'Left PGA Mixer Line1L',0
    Capabilities: pswitch pswitch-joined
    Playback channels: Mono
    Mono: Playback [on]
    ...

    which, if "Mono: Playback" means the samples are being collected is right

    and

    ...
    Simple mixer control 'Right PGA Mixer Line1L',0
    Capabilities: pswitch pswitch-joined
    Playback channels: Mono
    Mono: Playback [off]
    Simple mixer control 'Right PGA Mixer Line1R',0
    Capabilities: pswitch pswitch-joined
    Playback channels: Mono
    Mono: Playback [on]
    Simple mixer control 'Right PGA Mixer Line2R',0
    Capabilities: pswitch pswitch-joined
    Playback channels: Mono
    Mono: Playback [off]
    ...

    which looks like it is pulling from Line1R, which is wrong

    even though in my DTS file i have:

    simple-audio-card,widgets =
    "Speaker", "POTS Line Out",
    "Speaker", "Handset Speaker",
    "Line", "POTS Line In",
    "Microphone", "Handset Mic";
    simple-audio-card,routing =
    "POTS Line Out", "MONO_LOUT",
    "Handset Speaker", "LLOUT",
    "LINE2R", "POTS Line In",
    "LINE1L", "Handset Mic",
    "Handset Mic", "Mic Bias";

    it would appear to me it is pulling the samples in from the wrong port

    so when i do:
    amixer set 'Right PGA Mixer Line1R' off

    amixer set 'Right PGA Mixer Line2R' on

    and then do an arecord, i get the audio i was looking for. so it is routing the audio incorrectly

    hopefully somebody can help me with this: in code (c) is there a way to do the input switching like above? i have been using snd_mixer_* commands but i am not sure how to use something like that to achieve what i want. or am i stuck using "system" calls?

  • well i might have figured it out so nevermind:

    /****************************************************************************************
    * found @ https://alsa.opensrc.org/HowTo_access_a_mixer_control
    */
    void SetInputToLine2R(void)
    {

    1. const char *card = "default";
    2. const char *selem_name_line1r = "Right PGA Mixer Line1R Switch";
    3. const char *selem_name_line2r = "Right PGA Mixer Line2R Switch";
    4. int err;
    5.  
    6. snd_hctl_t *hctl;
    7. err = snd_hctl_open(&hctl, card, 0);
    8. err = snd_hctl_load(hctl);
    9.  
    10. snd_ctl_elem_id_t *id;
    11. snd_ctl_elem_id_alloca(&id);
    12. snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
    13. //snd_ctl_elem_id_set_id(id, 1);
    14.  
    15. snd_ctl_elem_id_set_name(id, selem_name_line1r);
    16. snd_hctl_elem_t *elem = snd_hctl_find_elem(hctl, id);
    17.  
    18. if(elem != 0)
    19. {
    20. snd_ctl_elem_value_t *control;
    21. snd_ctl_elem_value_alloca(&control);
    22. snd_ctl_elem_value_set_id(control, id);
    23.  
    24. snd_ctl_elem_value_set_integer(control, 0, 0);
    25. err = snd_hctl_elem_write(elem, control);
    26.  
    27. //turn on line2r
    28. snd_ctl_elem_id_set_name(id, selem_name_line2r);
    29. elem = snd_hctl_find_elem(hctl, id);
    30.  
    31. if(elem != 0)
    32. {
    33. snd_ctl_elem_value_set_integer(control, 0, 1);
    34. err = snd_hctl_elem_write(elem, control);
    35. }
    36. }
    37. snd_hctl_close(hctl);

    }

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Categories

Upcoming Training