From c2f4db8199040877055635669b971d3e68898bea Mon Sep 17 00:00:00 2001
From: j1nx
Date: Wed, 12 May 2021 11:26:35 +0200
Subject: [PATCH] [WIP] More sound architecture changes
---
.../etc/modules-load.d/i2c.conf | 1 +
.../etc/pulse/mycroft-sj201-daemon.conf | 99 +++++++++++++++++
.../etc/pulse/mycroft-sj201-default.pa | 74 ++++++++++++
.../rootfs-overlay/usr/libexec/ovos-i2csound | 105 +++++++++---------
4 files changed, 225 insertions(+), 54 deletions(-)
create mode 100644 buildroot-external/board/raspberrypi/rootfs-overlay/etc/modules-load.d/i2c.conf
create mode 100644 buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-daemon.conf
create mode 100644 buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-default.pa
diff --git a/buildroot-external/board/raspberrypi/rootfs-overlay/etc/modules-load.d/i2c.conf b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/modules-load.d/i2c.conf
new file mode 100644
index 00000000..0cdf71fd
--- /dev/null
+++ b/buildroot-external/board/raspberrypi/rootfs-overlay/etc/modules-load.d/i2c.conf
@@ -0,0 +1 @@
+i2c-dev
diff --git a/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-daemon.conf b/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-daemon.conf
new file mode 100644
index 00000000..2b50a60c
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-daemon.conf
@@ -0,0 +1,99 @@
+# 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
+; avoid-resampling = false
+; enable-remixing = yes
+; remixing-use-all-sink-channels = 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 = 44100
+; 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
+
+# OpenVoiceOS Audio Settings
+resample-method = ffmpeg
+default-sample-format = s32le
+default-sample-rate = 48000
+alternate-sample-rate = 44100
+default-sample-channels = 2
+default-channel-map = front-left,front-right
+avoid-resampling = true
+flat-volumes = no
diff --git a/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-default.pa b/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-default.pa
new file mode 100644
index 00000000..5fafa0d9
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/pulse/mycroft-sj201-default.pa
@@ -0,0 +1,74 @@
+#!/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 in system
+# mode.
+
+### Automatically restore the volume of streams and devices
+load-module module-device-restore
+load-module module-stream-restore
+load-module module-card-restore
+
+### Automatically load driver modules depending on the hardware available
+.ifexists module-udev-detect.so
+load-module module-udev-detect tsched=0
+.else
+### Use the static hardware detection module (for systems that lack udev/hal support)
+load-module module-detect
+.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
+
+### 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
+
+### Automatically suspend sinks/sources that become idle for too long
+load-module module-suspend-on-idle
+
+### Enable positioned event sounds
+load-module module-position-event-sounds
+
+### OpenVoiceOS Audio Settings
+unload-module module-suspend-on-idle
+load-module module-role-ducking
+load-module module-combine-sink sink_name=OpenVoiceOS
+set-default-sink OpenVoiceOS
+
+### 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/rootfs-overlay/usr/libexec/ovos-i2csound b/buildroot-external/rootfs-overlay/usr/libexec/ovos-i2csound
index ae615800..6fb77d20 100644
--- a/buildroot-external/rootfs-overlay/usr/libexec/ovos-i2csound
+++ b/buildroot-external/rootfs-overlay/usr/libexec/ovos-i2csound
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
##########################################################################
# ovos-i2csound
#
@@ -15,12 +15,7 @@
# limitations under the License.
##########################################################################
-set -e
-exec 1>/var/log/$(basename $0).log 2>&1
-
# Set default configurations
-OVERLAYS=/boot/overlays
-OVERLAY=""
ASOUND_STATE=/var/lib/alsa/default-asound.state
PULSE_SYSTEM=/etc/pulse/pulseaudio-system.pa
PULSE_DAEMON=/etc/pulse/pulseaudio-daemon.conf
@@ -29,57 +24,59 @@ PULSE_DAEMON=/etc/pulse/pulseaudio-daemon.conf
RPI_HATS="seeed-2mic-voicecard seeed-4mic-voicecard seeed-8mic-voicecard"
# Scanning the I2C bus for know addresses
-is_1a=$(i2cdetect -y 1 0x1a 0x1a | egrep "(1a|UU)" | awk '{print $2}') # ReSpeaker 2-mic / WM8960
-if [ is_1a == "1a" ] || [ is_1a == "UU" ] ; then
- 0x1a="found"
+is_1a=$(i2cdetect -y 1 0x1a 0x1a | egrep "(1a|UU)" | awk '{print $2}') # ReSpeaker 2-mic / WM8960
+if [ $is_1a == "1a" ] || [ $is_1a == "UU" ] ; then
+ RESPEAKER2=found
fi
-is_35=$(i2cdetect -y 1 0x35 0x35 | egrep "(35|UU)" | awk '{print $2}') # ReSpeaker 4-mic squared
-if [ is_35 == "35" ] || [ is_35 == "UU" ] ; then
- 0x35="found"
+is_35=$(i2cdetect -y 1 0x35 0x35 | egrep "(35|UU)" | awk '{print $2}') # ReSpeaker 4-mic squared
+if [ $is_35 == "35" ] || [ $is_35 == "UU" ] ; then
+ RESPEAKER4=found
fi
-is_3b=$(i2cdetect -y 1 0x3b 0x3b | egrep "(3b|UU)" | awk '{print $2}') # ReSpeaker 4-mic lineair / 6-mic
-if [ is_3b == "3b" ] || [ is_3b == "UU" ] ; then
- 0x3b="found"
+is_3b=$(i2cdetect -y 1 0x3b 0x3b | egrep "(3b|UU)" | awk '{print $2}') # ReSpeaker 4-mic lineair / 6-mic
+if [ $is_3b == "3b" ] || [ $is_3b == "UU" ] ; then
+ RESPEAKER6=found
fi
-is_4b=$(i2cdetect -y -a 1 0x4b 0x4b | egrep "(4b|UU)" | awk '{print $2}') # Adafruit
-if [ is_4b == "4b" ] || [ is_4b == "UU" ] ; then
- 0x4b="found"
+is_4b=$(i2cdetect -y 1 0x4b 0x4b | egrep "(4b|UU)" | awk '{print $2}') # Adafruit
+if [ $is_4b == "4b" ] || [ $is_4b == "UU" ] ; then
+ ADAFRUIT=found
fi
-is_2c=$(i2cdetect -y 1 0x2c 0x2c | egrep "(2c|UU)" | awk '{print $2}') # XMOS XVF3510
-if [ is_2c == "2c" ] || [ is_2c == "UU" ] ; then
- 0x2c="found"
+is_2f=$(i2cdetect -y 1 0x2f 0x2f | egrep "(2f|UU)" | awk '{print $2}') # TAS5806
+if [ $is_2f == "2f" ] || [ $is_2f == "UU" ] ; then
+ TAS5806=found
fi
-is_2f=$(i2cdetect -y 1 0x2f 0x2f | egrep "(2f|UU)" | awk '{print $2}') # TAS5860
-if [ is_2f == "2f" ] || [ is_2f == "UU" ] ; then
- 0x2f="found"
-fi
-
-is_04=$(i2cdetect -y 1 0x04 0x04 | egrep "(04|UU)" | awk '{print $2}') # SJ201 Led Ring
-if [ is_04 == "04" ] || [ is_04 == "UU" ] ; then
- 0x04="found"
+is_04=$(i2cdetect -y -a 1 0x04 0x04 | egrep "(04|UU)" | awk '{print $2}') # SJ201 Led Ring
+if [ $is_04 == "04" ] || [ $is_04 == "UU" ] ; then
+ SJ201LED=found
fi
# Remove old configurations
-rm /var/lib/alsa/asound.state
-rm /etc/ovos_asound.state
-rm /etc/pulse/system.pa
-rm /etc/pulse/daemon.conf
+if [ -f /var/lib/alsa/asound.state ] ; then
+ rm /var/lib/alsa/asound.state
+fi
+if [ -f /etc/ovos_asound.state ] ; then
+ rm /etc/ovos_asound.state
+fi
+if [ -f /etc/pulse/system.pa ] ; then
+ rm /etc/pulse/system.pa
+fi
+if [ -f /etc/pulse/daemon.conf ] ; then
+ rm /etc/pulse/daemon.conf
+fi
-
-if [ 0x1a == "found" ] && [ 0x35 != "found" ] ; then
+if [ $RESPEAKER2 == "found" ] && [ $RESPEAKER4 != "found" ] ; then
echo "Installing and configuring ReSpeaker 2-mic"
- modprobe snd-soc-wm8960
+ modprobe snd-soc-wm8960
OVERLAY=seeed-2mic-voicecard
ASOUND_STATE=/etc/voicecard/wm8960_asound.state
fi
-if [ 0x3b == "found" ] && [ 0x35 != "found" ] ; then
+if [ $RESPEAKER6 == "found" ] && [ $RESPEAKER4 != "found" ] ; then
echo "Installing and configuring ReSpeaker 4-mic"
modprobe snd-soc-seeed-voicecard
modprobe snd-soc-ac108
@@ -89,8 +86,8 @@ if [ 0x3b == "found" ] && [ 0x35 != "found" ] ; then
PULSE_DAEMON=/etc/pulse/seeed-voicecard-4mic-daemon.conf
fi
-if [ 0x3b == "found" ] && [ 0x35 == "found" ] ; then
- echo "Installing and configuring 6mic"
+if [ $RESPEAKER6 == "found" ] && [ $RESPEAKER4 == "found" ] ; then
+ echo "Installing and configuring ReSpeaker 6mic"
modprobe snd-soc-seeed-voicecard
modprobe snd-soc-ac108
OVERLAY=seeed-8mic-voicecard
@@ -99,19 +96,19 @@ if [ 0x3b == "found" ] && [ 0x35 == "found" ] ; then
PULSE_DAEMON=/etc/pulse/seeed-voicecard-8mic-daemon.conf
fi
-if [ 0x4b == "found" ] ; then
+if [ $ADAFRUIT == "found" ] ; then
echo "Installing and configuring Adafruit"
- /usr/sbin/i2cset -y 1 0x4b 30 # Set maximum volume to 30
+ /usr/sbin/i2cset -y 1 0x4b 30 # Set maximum volume to 30
fi
-if [ 0x2c == "found" ] && [ 0x2f == "found" ] && [ 0x04 == "found" ]; then
+if [ $TAS5860 == "found" ] && [ $SJ201LED == "found" ]; then
echo "Installing and configuring SJ201"
# Initializing XMOS xvf3510
- /usr/sbin/xvf3510-start
- # Initializing Texas Instruments 5860 DAC
- /usr/bin/tas5806-init
- # Initializing and resetting LED ring
- /usr/bin/sj201-reset-led
+ /usr/sbin/xvf3510-start
+ # Initializing Texas Instruments 5806 Amplifier
+ /usr/bin/tas5806-init
+ # Initializing and resetting LED ring
+ /usr/bin/sj201-reset-led
PULSE_SYSTEM=/etc/pulse/mycroft-sj201-default.pa
PULSE_DAEMON=/etc/pulse/mycroft-sj201-daemon.conf
fi
@@ -121,18 +118,18 @@ if [ "$OVERLAY" ]; then
echo Loading $OVERLAY ...
# Make sure the driver loads correctly
- dtoverlay -d $OVERLAYS $overlay || true
+ dtoverlay $OVERLAY || true
fi
# Install soundstate
-echo "create $overlay asound status file"
-ln -s $asound_state /etc/ovos_asound.state
+echo "create asound status file"
+ln -s $ASOUND_STATE /etc/ovos_asound.state
# Install pulseaudio files
-echo "create $overlay pulse system file"
-ln -s $pulse_default /etc/pulse/system.pa
-echo "create $overlay pulse daemon file"
-ln -s $pulse_daemon /etc/pulse/daemon.conf
+echo "create pulse system file"
+ln -s $PULSE_SYSTEM /etc/pulse/system.pa
+echo "create pulse daemon file"
+ln -s $PULSE_DAEMON /etc/pulse/daemon.conf
# Restore sound levels
alsactl -E HOME=/run/alsa -f /etc/ovos_asound.state restore