From df2ee2d4a5df4214a032144117aaf6cf1fc82d6f Mon Sep 17 00:00:00 2001 From: j1nx Date: Thu, 27 Aug 2020 14:11:58 +0200 Subject: [PATCH] MycroftOS: (experimental) respeaker 2mic pulseaudio support. --- .../pulse/seeed-voicecard-2mic-daemon.conf | 94 ++++++ .../etc/pulse/seeed-voicecard-2mic-default.pa | 153 +++++++++ .../0001-Add-2mic-pulse-support.patch | 317 ++++++++++++++++++ .../package/respeaker/respeaker.mk | 6 + .../package/respeaker/seeed-voicecard | 2 + 5 files changed, 572 insertions(+) create mode 100644 buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-daemon.conf create mode 100644 buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-default.pa create mode 100644 buildroot-external/package/respeaker/0001-Add-2mic-pulse-support.patch diff --git a/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-daemon.conf b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-daemon.conf new file mode 100644 index 00000000..7b6a036f --- /dev/null +++ b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-daemon.conf @@ -0,0 +1,94 @@ +# 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 = 96000 +; 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 + +# MycroftOS Audio Settings +avoid-resampling = yes +default-sample-format = s24le +default-sample-rate = 48000 +alternate-sample-rate = 44100 +default-sample-channels = 2 diff --git a/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-default.pa b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-default.pa new file mode 100644 index 00000000..f570dae2 --- /dev/null +++ b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/pulse/seeed-voicecard-2mic-default.pa @@ -0,0 +1,153 @@ +#!/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 tsched=0 +#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 auth-anonymous=1 + +### 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 auth-ip-acl=127.0.0.1;192.168.0.0/16;172.16.0.0/12;10.0.0.0/8 auth-anonymous=1 +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 +#set-default-sink alsa_output.platform-soc_sound.seeed-sink + +### MycroftOS Audio Settings +unload-module module-suspend-on-idle +unload-module module-role-cork +load-module module-role-ducking + +### Enable Echo/Noise-Cancellation +#load-module module-echo-cancel aec_method=webrtc source_name=echoCancel_source sink_name=echoCancel_sink +#set-default-source echoCancel_source +#set-default-sink echoCancel_sink diff --git a/buildroot-external/package/respeaker/0001-Add-2mic-pulse-support.patch b/buildroot-external/package/respeaker/0001-Add-2mic-pulse-support.patch new file mode 100644 index 00000000..1c8c9ec9 --- /dev/null +++ b/buildroot-external/package/respeaker/0001-Add-2mic-pulse-support.patch @@ -0,0 +1,317 @@ +From 10fb065c9735e4a04cfc251a31529083f55c16fd Mon Sep 17 00:00:00 2001 +From: j1nx +Date: Thu, 27 Aug 2020 13:33:47 +0200 +Subject: [PATCH 1/1] Add 2mic pulse support + +--- + pulseaudio/91-seeedvoicecard.rules | 3 +- + pulseaudio/pulse_config_2mic/daemon.conf | 87 +++++++++++ + pulseaudio/pulse_config_2mic/default.pa | 143 ++++++++++++++++++ + .../pulse_config_2mic/seeed-voicecard.conf | 36 +++++ + 4 files changed, 268 insertions(+), 1 deletion(-) + create mode 100644 pulseaudio/pulse_config_2mic/daemon.conf + create mode 100644 pulseaudio/pulse_config_2mic/default.pa + create mode 100644 pulseaudio/pulse_config_2mic/seeed-voicecard.conf + +diff --git a/pulseaudio/91-seeedvoicecard.rules b/pulseaudio/91-seeedvoicecard.rules +index 8b41dd1..b253459 100644 +--- a/pulseaudio/91-seeedvoicecard.rules ++++ b/pulseaudio/91-seeedvoicecard.rules +@@ -2,7 +2,8 @@ SUBSYSTEM!="sound", GOTO="seeedvoicecard_end" + ACTION!="change", GOTO="seeedvoicecard_end" + KERNEL!="card*", GOTO="seeedvoicecard_end" + ++ATTR{id}=="seeed4micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard-2mic.conf" + ATTR{id}=="seeed4micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard-4mic.conf" + ATTR{id}=="seeed8micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard-8mic.conf" + +-LABEL="seeedvoicecard_end" +\ No newline at end of file ++LABEL="seeedvoicecard_end" +diff --git a/pulseaudio/pulse_config_2mic/daemon.conf b/pulseaudio/pulse_config_2mic/daemon.conf +new file mode 100644 +index 0000000..067a55e +--- /dev/null ++++ b/pulseaudio/pulse_config_2mic/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 = 96000 ++; alternate-sample-rate = 48000 ++default-sample-channels = 2 ++; 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_2mic/default.pa b/pulseaudio/pulse_config_2mic/default.pa +new file mode 100644 +index 0000000..a99faff +--- /dev/null ++++ b/pulseaudio/pulse_config_2mic/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-source ++set-default-sink alsa_output.platform-soc_sound.seeed-sink +diff --git a/pulseaudio/pulse_config_2mic/seeed-voicecard.conf b/pulseaudio/pulse_config_2mic/seeed-voicecard.conf +new file mode 100644 +index 0000000..a050002 +--- /dev/null ++++ b/pulseaudio/pulse_config_2mic/seeed-voicecard.conf +@@ -0,0 +1,36 @@ ++# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voiced.conf ++ ++[General] ++auto-profiles = no ++[Mapping seeed-source] ++device-strings = hw:%f ++channel-map = front-left,front-right ++exact-channels = false ++fallback = yes ++paths-input = seeed-source ++priority = 3 ++direction = input ++ ++[Mapping seeed-sink] ++device-strings = hw:%f ++channel-map = front-left,front-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 +-- +2.20.1 + diff --git a/buildroot-external/package/respeaker/respeaker.mk b/buildroot-external/package/respeaker/respeaker.mk index b7d78052..76106128 100644 --- a/buildroot-external/package/respeaker/respeaker.mk +++ b/buildroot-external/package/respeaker/respeaker.mk @@ -29,6 +29,8 @@ define RESPEAKER_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0644 $(@D)/seeed-8mic-voicecard.dtbo $(BINARIES_DIR)/overlays/ mkdir -p $(TARGET_DIR)/usr/share/pulseaudio/alsa-mixer/profile-sets/ + $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_2mic/seeed-voicecard.conf \ + $(TARGET_DIR)/usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voicecard-2mic.conf $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_4mic/seeed-voicecard.conf \ $(TARGET_DIR)/usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voicecard-4mic.conf $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_6mic/seeed-voicecard.conf \ @@ -36,6 +38,10 @@ define RESPEAKER_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0644 $(@D)/pulseaudio/91-seeedvoicecard.rules \ $(TARGET_DIR)/etc/udev/rules.d/91-seeedvoicecard.rules + $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_2mic/default.pa \ + $(TARGET_DIR)/etc/pulse/seeed-voicecard-2mic-default.pa + $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_2mic/daemon.conf \ + $(TARGET_DIR)/etc/pulse/seeed-voicecard-2mic-daemon.conf $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_4mic/default.pa \ $(TARGET_DIR)/etc/pulse/seeed-voicecard-4mic-default.pa $(INSTALL) -D -m 0644 $(@D)/pulseaudio/pulse_config_4mic/daemon.conf \ diff --git a/buildroot-external/package/respeaker/seeed-voicecard b/buildroot-external/package/respeaker/seeed-voicecard index 83bcd724..9ffe70b4 100755 --- a/buildroot-external/package/respeaker/seeed-voicecard +++ b/buildroot-external/package/respeaker/seeed-voicecard @@ -79,6 +79,8 @@ if [ "x${is_1a}" != "x" ] && [ "x${is_35}" == "x" ] ; then echo "install 2mic" overlay=seeed-2mic-voicecard asound_state=/etc/voicecard/wm8960_asound.state + pulse_default=/etc/pulse/seeed-voicecard-2mic-default.pa + pulse_daemon=/etc/pulse/seeed-voicecard-2mic-daemon.conf fi if [ "x${is_3b}" != "x" ] && [ "x${is_35}" == "x" ] ; then