3

This is all very new too me and the question might be simple/stupid.

I have 2 USB microphones (with speakers) connected to a PC. Card 2 and 3 below.

arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: USB [Jabra SPEAK 410 USB], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 3: USB_1 [Jabra SPEAK 510 USB], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

I want to merge them into one combined stream, and I want that output to be the default microphone stream (I later want to use that stream within the Google Assistant SDK)

I need to do this in ALSA as that seems to be the way google expects things.

I created a file in .asoundrc in my home directory with the following content:

pcm.multitest {
    type multi

    slaves.a.pcm "hw:2,0"
    slaves.a.channels 2
    slaves.b.pcm "hw:3,0"
    slaves.b.channels 2

    bindings.0.slave a
    bindings.0.channel 0
    bindings.1.slave a
    bindings.1.channel 1
    bindings.2.slave b
    bindings.2.channel 0
    bindings.3.slave b
    bindings.3.channel 1
}

I really have no idea how to check if the content is correct and how to test it. I tested to restart the alsa-state.service but I am not sure how the output should be. I am trying to follow this documentation but without prior knowledge it is difficult to know if I am on the right track or not

I tried to achieve the same functionality using pactl with an script I found in another question.

The script successfully creates a combined channel, but opening an application like Audacity does not list that combined channel so I am a bit confused here as well.

#!/bin/bash

#    Script to map two pulseaudio hardware input sources as mono inputs
#    to left and right channel of a new loopback-sink respectively. This
#    sink can be used e.g. to use VoIP or record two microphones seperately.
#    Copyright (C) 2013, Henning Hollermann, [email protected]
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

do_activate() {
    while [ "x" = "x$LEFT" ]; do
        echo "Choose Source for left channel by ID"
        pactl list short sources
        read ID
        LEFT=$(pactl list short sources|awk '/^'$ID'/{print $2}')
    done
    while [ "x" = "x$RIGHT" ]; do
        echo "Choose Source for right channel by ID"
        pactl list short sources | grep -v $LEFT
        read ID
        RIGHT=$(pactl list short sources | grep -v $LEFT|awk '/^'$ID'/{print $2}')
    done
    # Create the name of the Combined sink
    NAME="Combined_Mics:_Left:_"$(echo $LEFT|awk -F'.' '$0=$2')"_Right:_"$(echo $RIGHT|awk -F'.' '$0=$2')

    echo "[LOAD] null sink as \"$NAME\" to connect the two mics to"
    pactl load-module module-null-sink \
            sink_name=combined channels=2 \
            sink_properties="device.description=$NAME"

    echo "[LOAD] map source 1 ($LEFT) to left channel of \"$NAME\""
    pactl load-module module-remap-source \
            source_name=${LEFT}_left_channel master=$LEFT channels=2 \
            master_channel_map=mono,mono channel_map=left,left
    pactl load-module module-loopback sink=combined source=${LEFT}_left_channel

    echo "[LOAD] map source 2 ($RIGHT) to right channel of \"$NAME\""
    pactl load-module module-remap-source \
            source_name=${RIGHT}_right_channel master=$RIGHT channels=2 \
            master_channel_map=mono,mono channel_map=right,right
    pactl load-module module-loopback sink=combined source=${RIGHT}_right_channel
    echo "[DONE] Now adjust the left and right channel volume of the new sink to be equally loud"


}

do_deactivate() {
    echo "[UNLOAD] pulseaudio modules..."
    echo "[UNLOAD] module-loopback"
    pactl unload-module module-loopback
    echo "[UNLOAD] module-remap-source"
    pactl unload-module module-remap-source
    echo "[UNLOAD] module-null-sink"
    pactl unload-module module-null-sink
}

init() {
    for exe in /usr/bin/pulseaudio /usr/bin/pactl; do
        if [ ! -x "$exe" ]; then
            echo "[ERROR] required file $exe not found or not executable"
            exit 1
        fi
    done
    [ ! -x /usr/bin/pavucontrol ] && echo "[NOTICE] pavucontrol might be very useful."
}

# MAIN
init;
case $1 in
activate|enable|start)
    do_activate;;
deactivate|disable|stop)
    do_deactivate;;
*)
    echo "Usage: $0 [enable|disable]";;
esac;
theAlse
  • 163
  • 1
  • 6
  • 1
    (1) Check if your computer uses PulseAudio (most modern distros do by default). In that case, use a PulseAudio module; don't do it in ALSA. (2) Test with the `-D` option of `arecord`, for example. Or by pointing an audio application to the new device. (3) ALSA doesn't really have a "service"; every application reads the configuration file on startup. – dirkt Feb 09 '21 at 13:28
  • @dirkt, I am using Ubuntu 18 LTS, but I need more information to understand what you mean. – theAlse Feb 09 '21 at 15:36
  • Do `ps axu | grep pulse`. Do you see a process named `pulseaudio`? If yes, don't do it in ALSA. And Ubuntu usually would have this running. – dirkt Feb 09 '21 at 21:19

0 Answers0