Here's my latest configs. Removed all references to real hardware from
/etc/asound.conf and now have stereo audio duplicated across all 8
loopback channels. Still not really sure about all the settings here
and my feeling is this could be greatly simplified somehow but for now
this is tested and works:
Code:
--------------------
# duplicate audio to all Loopback channels
pcm.!default plug:aloopx
pcm.aloopx {
type route;
slave.pcm {
type multi;
slaves.a.pcm "aloop0";
slaves.b.pcm "aloop1";
slaves.c.pcm "aloop2";
slaves.d.pcm "aloop3";
slaves.e.pcm "aloop4";
slaves.f.pcm "aloop5";
slaves.g.pcm "aloop6";
slaves.h.pcm "aloop7";
slaves.a.channels 2;
slaves.b.channels 2;
slaves.c.channels 2;
slaves.d.channels 2;
slaves.e.channels 2;
slaves.f.channels 2;
slaves.g.channels 2;
slaves.h.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;
bindings.4.slave c;
bindings.4.channel 0;
bindings.5.slave c;
bindings.5.channel 1;
bindings.6.slave d;
bindings.6.channel 0;
bindings.7.slave d;
bindings.7.channel 1;
bindings.8.slave e;
bindings.8.channel 0;
bindings.9.slave e;
bindings.9.channel 1;
bindings.10.slave f;
bindings.10.channel 0;
bindings.11.slave f;
bindings.11.channel 1;
bindings.12.slave g;
bindings.12.channel 0;
bindings.13.slave g;
bindings.13.channel 1;
bindings.14.slave h;
bindings.14.channel 0;
bindings.15.slave h;
bindings.15.channel 1;
}
ttable.0.0 1;
ttable.1.1 1;
ttable.0.2 1;
ttable.1.3 1;
ttable.0.4 1;
ttable.1.5 1;
ttable.0.6 1;
ttable.1.7 1;
ttable.0.8 1;
ttable.1.9 1;
ttable.0.10 1;
ttable.1.11 1;
ttable.0.12 1;
ttable.1.13 1;
ttable.0.14 1;
ttable.1.15 1;
}
pcm.aloop0 {
type dmix
ipc_key 1024
slave {
pcm "hw:Loopback,0,0"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop1 {
type dmix
ipc_key 2048
slave {
pcm "hw:Loopback,0,1"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop2 {
type dmix
ipc_key 4096
slave {
pcm "hw:Loopback,0,2"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop3 {
type dmix
ipc_key 8092
slave {
pcm "hw:Loopback,0,3"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop4 {
type dmix
ipc_key 16184
slave {
pcm "hw:Loopback,0,4"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop5 {
type dmix
ipc_key 32368
slave {
pcm "hw:Loopback,0,5"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop6 {
type dmix
ipc_key 64736
slave {
pcm "hw:Loopback,0,6"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
pcm.aloop7 {
type dmix
ipc_key 129472
slave {
pcm "hw:Loopback,0,7"
period_time 0
period_size 2048
buffer_size 65536
buffer_time 0
periods 128
rate 48000
channels 2
}
bindings {
0 0
1 1
}
}
--------------------
These are the three commands I have under /etc/local.d/AudioConfig.start
to run at boot:
Code:
--------------------
bluetoothctl discoverable off
bluealsa-aplay 00:00:00:00:00:00 &
/home/sodface/alsaloop.sh true &
--------------------
Contents of the alsaloop.sh script which starts an instance for each
sound card it finds except for the Loopback device then sits and waits
for bluetooth audio sink device connections and starts an alsaloop
instance for them as required:
Code:
--------------------
#!/bin/sh
if [ $1 ]
then
for card in $(cat /proc/asound/cards | cut -d' ' -f3 | tr -d '[' | grep -v
Loopback | tr -s '\n')
do
for i in $(seq 0 7)
do
if ! ps | grep -q "[L]oopback,1,${i}"
then
break
fi
done
alsaloop -d -C hw:Loopback,1,${i} -P "hw:${card},0" -t 250000
done
fi
while :
do
if inotifywait -qq -r -e create /dev/input/
then
pdevs=$(bluetoothctl paired-devices | cut -d' ' -f2)
for pdev in ${pdevs}
do
if bluetoothctl info "${pdev}" | tr -d '\n' | grep -Eq 'Connected: yes.*Audio
Sink'
then
if ! ps | grep "[D]EV=${pdev}"
then
for i in $(seq 0 7)
do
if ! ps | grep -q "[L]oopback,1,${i}"
then
break
fi
done
alsaloop -d -S 1 -C hw:Loopback,1,${i} -P
bluealsa:SRV=org.bluealsa,DEV=${pdev},PROFILE=a2dp -t 450000
fi
fi
done
fi
done
--------------------
And the contents of the bt-pair.sh script which is fired on a
squeezelite power command and decides what to do based on the title of
the currently playing squeezelite track:
Code:
--------------------
#!/bin/sh
if [ $1 -eq 0 ]
then
exit
fi
echo "hello"
uptime=$(cat /proc/uptime | cut -d'.' -f1)
if [ ${uptime} -le 60 ]
then
exit
fi
lmsip=$(netstat -tn | grep 3483 | tr -s ' ' | cut -d ' ' -f5 | cut -d ':' -f1)
iface=$(arp -an | grep ${lmsip} | tr -s ' ' | cut -d' ' -f7)
read mac < /sys/class/net/${iface}/address
btplayer="bluetooth-player"
btspeaker="bluetooth-speaker"
rssi="-60"
post=$(cat <<END_HEREDOC
POST /jsonrpc.js HTTP/1.1
HOST: ${lmsip}:9000
Content-Type: application/json; charset=utf-8
Content-Length: 97
{"id":1,"method":"slim.request","params":["${mac}",["status","-","1","tags:acgltys"]]}
END_HEREDOC
)
if (echo -e "${post}"; sleep .2) | nc ${lmsip} 9000 | grep -q "${btplayer}"
then
i=0
bluetoothctl discoverable on
prepair=$(bluetoothctl paired-devices | cut -d' ' -f2)
while [ $i -le 30 ]
do
sleep 2
newpair=$(bluetoothctl paired-devices | cut -d' ' -f2)
newdev=$(printf "${prepair}\n${newpair}\n" | sort | uniq -u)
if [ "${newdev}" ]
then
#bluetoothctl pair ${newdev}
bluetoothctl trust ${newdev}
bluetoothctl connect ${newdev}
break
else
i=$(( $i +1 ))
fi
done
bluetoothctl discoverable off
elif (echo -e "${post}"; sleep .2) | nc ${lmsip} 9000 | grep -q "${btspeaker}"
then
i=0
prescan=$(bluetoothctl devices)
while [ $i -le 6 ]
do
(printf "scan.rssi ${rssi}\nscan.rssi\nscan on\n"; sleep 10) | bluetoothctl
sleep .2
newscan=$(bluetoothctl devices)
newdev=$(printf "${prescan}\n${newscan}\n" | sort | uniq -u | cut -d' ' -f2)
if [ "${newdev}" ]
then
bluetoothctl pair ${newdev}
bluetoothctl trust ${newdev}
bluetoothctl connect ${newdev}
break
fi
i=$(( $i +1 ))
done
fi
--------------------
This is working ok for now. Probably won't update this thread unless I
have any major changes but I'm going to continue to tinker with it.
Only real "issue" now is the audio sync between the local sound card
outputs and a connected BT speaker. I can tweak the alsaloop -t values
manually and dial them in pretty close but it seems to need adjustments
on every connect/disconnect. Not really an issue for me since I'm using
a headset and not trying to listed to all the outputs at the same time.
------------------------------------------------------------------------
sodface's Profile: http://forums.slimdevices.com/member.php?userid=19057
View this thread: http://forums.slimdevices.com/showthread.php?t=112536
_______________________________________________
unix mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/unix