diff --git a/pulseaudio/README.md b/pulseaudio/README.md new file mode 100644 index 0000000..160987c --- /dev/null +++ b/pulseaudio/README.md @@ -0,0 +1,223 @@ +# PulseAudio Configuration for seeed-voicecard + +Following this guide if you want to use your seeed-voicecard as a default source/sink of pulseaudio. + +### ReSpeaker 4 Mic Array + + +1. Download pulseaudio +``` +sudo apt install pulseaudio +pulseaudio --k +``` + +2. First, you need to write [a profile for pulse](https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/) +``` +cd seeed-voicecard +cd pulseaudio +cd pulse_config_4mic +sudo cp seeed-voicecard.conf /usr/share/pulseaudio/alsa-mixer/profile-sets/ +``` + +3. Edit `udev rules` + + During the system start, when the card "seeed4micvoicec" is detected, the PULSE_PROFILE_SET variable will be set in the udev database, and PulseAudio will be forced to use `seeed-voicecard.conf`. + + ``` + # have a look at /lib/udev/rules.d/90-pulseaudio.rules + sudo vim /lib/udev/rules.d/90-pulseaudio.rules + # add the following lines at about line 87(behind the setting for some laptops and before the line GOTO="pulseaudio_end") + # Seeed Voicecard + ATTR{id}=="seeed4micvoicec",ATTR{number}=="1",ENV{PULSE_PROFILE_SET}="seeed-voicecard.conf" + ``` + ![](./udev_rules_4mic.png) + + The value of `ATTR{number}` can be found with: + + ``` + udevadm info -a -p /sys/class/sound/card0/ + # or udevadm info -a -p /sys/class/sound/card1/ + ``` + + For example, in Raspberry Pi, we can find `ATTR{id}=="seeed4micvoicec"` and `ATTR{number}=="1"` with command `udevadm info -a -p /sys/class/sound/card1/`: + + ``` + pi@raspberrypi:~ $ udevadm info -a -p /sys/class/sound/card1/ + + Udevadm info starts with the device specified by the devpath and then + walks up the chain of parent devices. It prints for every device + found, all possible attributes in the udev rules key format. + A rule to match, can be composed by the attributes of the device + and the attributes from one single parent device. + + looking at device '/devices/platform/soc/soc:sound/sound/card1': + KERNEL=="card1" + SUBSYSTEM=="sound" + DRIVER=="" + ATTR{id}=="seeed4micvoicec" + ATTR{number}=="1" + + looking at parent device '/devices/platform/soc/soc:sound': + KERNELS=="soc:sound" + SUBSYSTEMS=="platform" + DRIVERS=="seeed-voicecard" + ATTRS{driver_override}=="(null)" + + looking at parent device '/devices/platform/soc': + KERNELS=="soc" + SUBSYSTEMS=="platform" + DRIVERS=="" + ATTRS{driver_override}=="(null)" + + looking at parent device '/devices/platform': + KERNELS=="platform" + SUBSYSTEMS=="" + DRIVERS=="" + ``` + +4. config `default.pa` and `daemon.conf` +``` +sudo cp default.pa /etc/pulse/ +sudo cp daemon.conf /etc/pulse/ +``` + +5. reboot raspberry pi and check +``` +sudo reboot +pulseaudio --start # start pulse at first +pactl info # check the setting + +Server String: /run/user/1000/pulse/native +Library Protocol Version: 32 +Server Protocol Version: 32 +Is Local: yes +Client Index: 18 +Tile Size: 65496 +User Name: pi +Host Name: raspberrypi +Server Name: pulseaudio +Server Version: 10.0 +Default Sample Specification: s16le 4ch 16000Hz +Default Channel Map: front-left,front-center,front-right,rear-center +Default Sink: alsa_output.platform-soc_audio.analog-stereo +Default Source: alsa_input.platform-soc_sound.seeed-source +Cookie: 3b12:70b3 +``` + +### 6-Mics Circular Array Kit and 4-Mics Linear Array + + +1. Download pulseaudio +``` +sudo apt install pulseaudio +pulseaudio --k +``` + +2. First, you need to write [a profile for pulse](https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/) +``` +cd seeed-voicecard +cd pulseaudio +cd pulse_config_6mic +sudo cp seeed-voicecard.conf /usr/share/pulseaudio/alsa-mixer/profile-sets/ +``` + +3. Edit `udev rules` + + During the system start, when the card "seeed8micvoicec" is detected, the PULSE_PROFILE_SET variable will be set in the udev database, and PulseAudio will be forced to use `seeed-voicecard.conf`. + + ``` + # have a look at /lib/udev/rules.d/90-pulseaudio.rules + sudo vim /lib/udev/rules.d/90-pulseaudio.rules + # add the following lines at about line 87(behind the setting for some laptops and before the line GOTO="pulseaudio_end") + # Seeed Voicecard + ATTR{id}=="seeed8micvoicec",ATTR{number}=="1",ENV{PULSE_PROFILE_SET}="seeed-voicecard.conf" + ``` + ![](./udev_rules_6mic.png) + + The value of `ATTR{number}` can be found with: + + ``` + udevadm info -a -p /sys/class/sound/card0/ + # or udevadm info -a -p /sys/class/sound/card1/ + ``` + + For example, in Raspberry Pi, we can find `ATTR{id}=="seeed8micvoicec"` and `ATTR{number}=="1"` with command `udevadm info -a -p /sys/class/sound/card1/`: + + ``` + pi@raspberrypi:~ $ udevadm info -a -p /sys/class/sound/card1/ + + Udevadm info starts with the device specified by the devpath and then + walks up the chain of parent devices. It prints for every device + found, all possible attributes in the udev rules key format. + A rule to match, can be composed by the attributes of the device + and the attributes from one single parent device. + + looking at device '/devices/platform/soc/soc:sound/sound/card1': + KERNEL=="card1" + SUBSYSTEM=="sound" + DRIVER=="" + ATTR{id}=="seeed8micvoicec" + ATTR{number}=="1" + + looking at parent device '/devices/platform/soc/soc:sound': + KERNELS=="soc:sound" + SUBSYSTEMS=="platform" + DRIVERS=="seeed-voicecard" + ATTRS{driver_override}=="(null)" + + looking at parent device '/devices/platform/soc': + KERNELS=="soc" + SUBSYSTEMS=="platform" + DRIVERS=="" + ATTRS{driver_override}=="(null)" + + looking at parent device '/devices/platform': + KERNELS=="platform" + SUBSYSTEMS=="" + DRIVERS=="" + ``` + +4. config `default.pa` and `daemon.conf` +``` +sudo cp default.pa /etc/pulse/ +sudo cp daemon.conf /etc/pulse/ +``` + +5. reboot raspberry pi and check +``` +sudo reboot +pulseaudio --start # start pulse at first +pactl info # check the setting + +# The output should be like this +# You could see the default sink is seeed-2ch and default source is seeed-8ch +pi@raspberrypi:~ $ pactl info +Server String: /run/user/1000/pulse/native +Library Protocol Version: 32 +Server Protocol Version: 32 +Is Local: yes +Client Index: 6 +Tile Size: 65496 +User Name: pi +Host Name: raspberrypi +Server Name: pulseaudio +Server Version: 10.0 +Default Sample Specification: s32le 8ch 48000Hz +Default Channel Map: front-left,front-left-of-center,front-center,front-right,front-right-of-center,rear-center,aux0,aux1 +Default Sink: alsa_output.platform-soc_sound.seeed-2ch +Default Source: alsa_input.platform-soc_sound.seeed-8ch +Cookie: 3523:e5af +``` + +### FAQ + +1. Default Sink/Source not right + + Make sure there is no any other daemon or using the audio device. Then check profile and udev rules. + + `pacmd list-sinks` and `pacmd list-sources` can be used to show the avaiable sinks/sources, after pulseaudio is started. + +2. Can't start PulseAudio + + Check `default.pa` and `daemon.conf` + \ No newline at end of file diff --git a/pulseaudio/pulse_config_4mic/daemon.conf b/pulseaudio/pulse_config_4mic/daemon.conf new file mode 100644 index 0000000..1fdec4c --- /dev/null +++ b/pulseaudio/pulse_config_4mic/daemon.conf @@ -0,0 +1,87 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for +## more information. Default values are commented out. Use either ; or # for +## commenting. + +; daemonize = no +; fail = yes +; allow-module-loading = yes +; allow-exit = yes +; use-pid-file = yes +; system-instance = no +; local-server-type = user +; enable-shm = yes +; enable-memfd = yes +; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB +; lock-memory = no +; cpu-limit = no + +; high-priority = yes +; nice-level = -11 + +; realtime-scheduling = yes +; realtime-priority = 5 + +; exit-idle-time = 20 +; scache-idle-time = 20 + +; dl-search-path = (depends on architecture) + +; load-default-script-file = yes +; default-script-file = /etc/pulse/default.pa + +; log-target = auto +; log-level = notice +; log-meta = no +; log-time = no +; log-backtrace = 0 + +; resample-method = speex-float-1 +; enable-remixing = yes +; enable-lfe-remixing = no +; lfe-crossover-freq = 0 + +; flat-volumes = yes + +; rlimit-fsize = -1 +; rlimit-data = -1 +; rlimit-stack = -1 +; rlimit-core = -1 +; rlimit-as = -1 +; rlimit-rss = -1 +; rlimit-nproc = -1 +; rlimit-nofile = 256 +; rlimit-memlock = -1 +; rlimit-locks = -1 +; rlimit-sigpending = -1 +; rlimit-msgqueue = -1 +; rlimit-nice = 31 +; rlimit-rtprio = 9 +; rlimit-rttime = 200000 + +default-sample-format = s16le +default-sample-rate = 16000 +; alternate-sample-rate = 48000 +default-sample-channels = 4 +; default-channel-map = front-left,front-right + +; default-fragments = 4 +; default-fragment-size-msec = 25 + +; enable-deferred-volume = yes +; deferred-volume-safety-margin-usec = 8000 +; deferred-volume-extra-delay-usec = 0 diff --git a/pulseaudio/pulse_config_4mic/default.pa b/pulseaudio/pulse_config_4mic/default.pa new file mode 100644 index 0000000..e2a355d --- /dev/null +++ b/pulseaudio/pulse_config_4mic/default.pa @@ -0,0 +1,142 @@ +#!/usr/bin/pulseaudio -nF +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +# This startup script is used only if PulseAudio is started per-user +# (i.e. not in system mode) + +.fail + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically augment property information from .desktop files +### stored in /usr/share/application +load-module module-augment-properties + +### Should be after module-*-restore but before module-*-detect +load-module module-switch-on-port-available + +### Load audio drivers statically +### (it's probably better to not load these drivers manually, but instead +### use module-udev-detect -- see below -- for doing this automatically) +#load-module module-alsa-sink device="hw:1,0" channels=8 rate=48000 format=s32le +#load-module module-alsa-source device="hw:1,0" channels=8 rate=48000 format=s32le +#load-module module-oss device="/dev/dsp" sink_name=output source_name=input +#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input +#load-module module-null-sink +#load-module module-pipe-sink + +### Automatically load driver modules depending on the hardware available +.ifexists module-udev-detect.so +load-module module-udev-detect +#channels=8 rate=48000 format=s32le +.else +### Use the static hardware detection module (for systems that lack udev support) +load-module module-detect +.endif + +### Automatically connect sink and source if JACK server is present +.ifexists module-jackdbus-detect.so +.nofail +load-module module-jackdbus-detect channels=2 +.fail +.endif + +### Automatically load driver modules for Bluetooth hardware +.ifexists module-bluetooth-policy.so +load-module module-bluetooth-policy +.endif + +.ifexists module-bluetooth-discover.so +load-module module-bluetooth-discover +.endif + +### Load several protocols +.ifexists module-esound-protocol-unix.so +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +### Network access (may be configured with paprefs, so leave this commented +### here if you plan to use paprefs) +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +#load-module module-zeroconf-publish + +### Load the RTP receiver module (also configured via paprefs, see above) +#load-module module-rtp-recv + +### Load the RTP sender module (also configured via paprefs, see above) +#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'" +#load-module module-rtp-send source=rtp.monitor + +### Load additional modules from GConf settings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gconf.so +.nofail +load-module module-gconf +.fail +.endif + +### Automatically restore the default sink/source when changed by the user +### during runtime +### NOTE: This should be loaded as early as possible so that subsequent modules +### that look up the default sink/source get the right value +load-module module-default-device-restore + +### Automatically move streams to the default sink if the sink they are +### connected to dies, similar for sources +load-module module-rescue-streams + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Honour intended role device property +load-module module-intended-roles + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### If autoexit on idle is enabled we want to make sure we only quit +### when no local session needs us anymore. +.ifexists module-console-kit.so +load-module module-console-kit +.endif +.ifexists module-systemd-login.so +load-module module-systemd-login +.endif + +### Enable positioned event sounds +load-module module-position-event-sounds + +### Cork music/video streams when a phone stream is active +load-module module-role-cork + +### Modules to allow autoloading of filters (such as echo cancellation) +### on demand. module-filter-heuristics tries to determine what filters +### make sense, and module-filter-apply does the heavy-lifting of +### loading modules and rerouting streams. +load-module module-filter-heuristics +load-module module-filter-apply + +### Make some devices default +#set-default-sink output +#set-default-source input +set-default-source alsa_input.platform-soc_sound.seeed-source diff --git a/pulseaudio/pulse_config_4mic/seeed-voicecard.conf b/pulseaudio/pulse_config_4mic/seeed-voicecard.conf new file mode 100644 index 0000000..aaca00b --- /dev/null +++ b/pulseaudio/pulse_config_4mic/seeed-voicecard.conf @@ -0,0 +1,33 @@ +# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voicecard.conf + +[General] +auto-profiles = no +[Mapping seeed-source] +device-strings = ac108 +channel-map = front-left,front-right,rear-left,rear-right +exact-channels = false +fallback = yes +paths-input = seeed-source +priority = 3 +direction = input +[Mapping seeed-sink] +device-strings = playback +channel-map = front-left,front-right,rear-left,rear-right +exact-channels = false +fallback = yes +paths-output = seeed-sink +direction = output +priority = 2 +[Profile output:seeed-sink+input:seeed-source] +output-mappings = seeed-sink +input-mappings = seeed-source +priority = 100 +skip-probe = yes +[Profile output:seeed-sink] +output-mappings = seeed-sink +priority = 4 +skip-probe = yes +[Profile input:seeed-source] +input-mappings = seeed-source +priority = 5 +skip-probe = yes diff --git a/pulseaudio/pulse_config_6mic/daemon.conf b/pulseaudio/pulse_config_6mic/daemon.conf new file mode 100644 index 0000000..9d87aba --- /dev/null +++ b/pulseaudio/pulse_config_6mic/daemon.conf @@ -0,0 +1,87 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for +## more information. Default values are commented out. Use either ; or # for +## commenting. + +; daemonize = no +; fail = yes +; allow-module-loading = yes +; allow-exit = yes +; use-pid-file = yes +; system-instance = no +; local-server-type = user +; enable-shm = yes +; enable-memfd = yes +; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB +; lock-memory = no +; cpu-limit = no + +; high-priority = yes +; nice-level = -11 + +; realtime-scheduling = yes +; realtime-priority = 5 + +; exit-idle-time = 20 +; scache-idle-time = 20 + +; dl-search-path = (depends on architecture) + +; load-default-script-file = yes +; default-script-file = /etc/pulse/default.pa + +; log-target = auto +; log-level = notice +; log-meta = no +; log-time = no +; log-backtrace = 0 + +; resample-method = speex-float-1 +; enable-remixing = yes +; enable-lfe-remixing = no +; lfe-crossover-freq = 0 + +; flat-volumes = yes + +; rlimit-fsize = -1 +; rlimit-data = -1 +; rlimit-stack = -1 +; rlimit-core = -1 +; rlimit-as = -1 +; rlimit-rss = -1 +; rlimit-nproc = -1 +; rlimit-nofile = 256 +; rlimit-memlock = -1 +; rlimit-locks = -1 +; rlimit-sigpending = -1 +; rlimit-msgqueue = -1 +; rlimit-nice = 31 +; rlimit-rtprio = 9 +; rlimit-rttime = 200000 + +default-sample-format = s32le +default-sample-rate = 48000 +; alternate-sample-rate = 48000 +default-sample-channels = 8 +; default-channel-map = front-left,front-right + +; default-fragments = 4 +; default-fragment-size-msec = 25 + +; enable-deferred-volume = yes +; deferred-volume-safety-margin-usec = 8000 +; deferred-volume-extra-delay-usec = 0 diff --git a/pulseaudio/pulse_config_6mic/default.pa b/pulseaudio/pulse_config_6mic/default.pa new file mode 100644 index 0000000..aed78bd --- /dev/null +++ b/pulseaudio/pulse_config_6mic/default.pa @@ -0,0 +1,143 @@ +#!/usr/bin/pulseaudio -nF +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +# This startup script is used only if PulseAudio is started per-user +# (i.e. not in system mode) + +.fail + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically augment property information from .desktop files +### stored in /usr/share/application +load-module module-augment-properties + +### Should be after module-*-restore but before module-*-detect +load-module module-switch-on-port-available + +### Load audio drivers statically +### (it's probably better to not load these drivers manually, but instead +### use module-udev-detect -- see below -- for doing this automatically) +#load-module module-alsa-sink device="hw:1,0" channels=8 rate=48000 format=s32le +#load-module module-alsa-source device="hw:1,0" channels=8 rate=48000 format=s32le +#load-module module-oss device="/dev/dsp" sink_name=output source_name=input +#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input +#load-module module-null-sink +#load-module module-pipe-sink + +### Automatically load driver modules depending on the hardware available +.ifexists module-udev-detect.so +load-module module-udev-detect +#channels=8 rate=48000 format=s32le +.else +### Use the static hardware detection module (for systems that lack udev support) +load-module module-detect +.endif + +### Automatically connect sink and source if JACK server is present +.ifexists module-jackdbus-detect.so +.nofail +load-module module-jackdbus-detect channels=2 +.fail +.endif + +### Automatically load driver modules for Bluetooth hardware +.ifexists module-bluetooth-policy.so +load-module module-bluetooth-policy +.endif + +.ifexists module-bluetooth-discover.so +load-module module-bluetooth-discover +.endif + +### Load several protocols +.ifexists module-esound-protocol-unix.so +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +### Network access (may be configured with paprefs, so leave this commented +### here if you plan to use paprefs) +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +#load-module module-zeroconf-publish + +### Load the RTP receiver module (also configured via paprefs, see above) +#load-module module-rtp-recv + +### Load the RTP sender module (also configured via paprefs, see above) +#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'" +#load-module module-rtp-send source=rtp.monitor + +### Load additional modules from GConf settings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gconf.so +.nofail +load-module module-gconf +.fail +.endif + +### Automatically restore the default sink/source when changed by the user +### during runtime +### NOTE: This should be loaded as early as possible so that subsequent modules +### that look up the default sink/source get the right value +load-module module-default-device-restore + +### Automatically move streams to the default sink if the sink they are +### connected to dies, similar for sources +load-module module-rescue-streams + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Honour intended role device property +load-module module-intended-roles + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### If autoexit on idle is enabled we want to make sure we only quit +### when no local session needs us anymore. +.ifexists module-console-kit.so +load-module module-console-kit +.endif +.ifexists module-systemd-login.so +load-module module-systemd-login +.endif + +### Enable positioned event sounds +load-module module-position-event-sounds + +### Cork music/video streams when a phone stream is active +load-module module-role-cork + +### Modules to allow autoloading of filters (such as echo cancellation) +### on demand. module-filter-heuristics tries to determine what filters +### make sense, and module-filter-apply does the heavy-lifting of +### loading modules and rerouting streams. +load-module module-filter-heuristics +load-module module-filter-apply + +### Make some devices default +#set-default-sink output +#set-default-source input +set-default-source alsa_input.platform-soc_sound.seeed-8ch +set-default-sink alsa_output.platform-soc_sound.seeed-2ch diff --git a/pulseaudio/pulse_config_6mic/seeed-voicecard.conf b/pulseaudio/pulse_config_6mic/seeed-voicecard.conf new file mode 100644 index 0000000..5712a67 --- /dev/null +++ b/pulseaudio/pulse_config_6mic/seeed-voicecard.conf @@ -0,0 +1,34 @@ +# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voiced.conf + +[General] +auto-profiles = no +[Mapping seeed-8ch] +device-strings = hw:1,0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +exact-channels = false +fallback = yes +paths-input = seeed-8ch +priority = 3 +direction = input +[Mapping seeed-2ch] +device-strings = hw:1,0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +exact-channels = false +exact-channels = false +fallback = yes +paths-output = seeed-2ch +direction = output +priority = 2 +[Profile output:seeed-2ch+input:seeed-8ch] +output-mappings = seeed-2ch +input-mappings = seeed-8ch +priority = 100 +skip-probe = yes +[Profile output:seeed-2ch] +output-mappings = seeed-2ch +priority = 4 +skip-probe = yes +[Profile input:seeed-8ch] +input-mappings = seeed-8ch +priority = 5 +skip-probe = yes \ No newline at end of file diff --git a/pulseaudio/udev_rules_4mic.png b/pulseaudio/udev_rules_4mic.png new file mode 100644 index 0000000..dd585ec Binary files /dev/null and b/pulseaudio/udev_rules_4mic.png differ diff --git a/pulseaudio/udev_rules_6mic.png b/pulseaudio/udev_rules_6mic.png new file mode 100644 index 0000000..ec2d81f Binary files /dev/null and b/pulseaudio/udev_rules_6mic.png differ