diff options
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-2ch-generic-usb.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-ensoniq.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-intel.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-jabra.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-community/hal-4a-raspberry-pi-3.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-intel-minnow-bt.json | 203 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-intel-minnow.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-intel-qemu-bt.json | 217 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-intel-qemu.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-rcar-m3-bt.json | 228 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-rcar-m3.json | 11 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-rcar-m3kf-bt.json | 248 | ||||
-rw-r--r-- | 4a-hal-cfg-reference/hal-4a-rcar-m3kf.json | 11 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-mixer-link.h | 33 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt.c | 79 |
16 files changed, 215 insertions, 903 deletions
diff --git a/4a-hal-cfg-community/hal-4a-2ch-generic-usb.json b/4a-hal-cfg-community/hal-4a-2ch-generic-usb.json index 34820b8..efc59e3 100644 --- a/4a-hal-cfg-community/hal-4a-2ch-generic-usb.json +++ b/4a-hal-cfg-community/hal-4a-2ch-generic-usb.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json b/4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json index 61f9667..09bfcfa 100644 --- a/4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json +++ b/4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-09" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-community/hal-4a-ensoniq.json b/4a-hal-cfg-community/hal-4a-ensoniq.json index 4bc63ba..7d1dc80 100644 --- a/4a-hal-cfg-community/hal-4a-ensoniq.json +++ b/4a-hal-cfg-community/hal-4a-ensoniq.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-community/hal-4a-intel.json b/4a-hal-cfg-community/hal-4a-intel.json index f070c8b..1e27896 100644 --- a/4a-hal-cfg-community/hal-4a-intel.json +++ b/4a-hal-cfg-community/hal-4a-intel.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-community/hal-4a-jabra.json b/4a-hal-cfg-community/hal-4a-jabra.json index 64a245e..d9879d4 100644 --- a/4a-hal-cfg-community/hal-4a-jabra.json +++ b/4a-hal-cfg-community/hal-4a-jabra.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-community/hal-4a-raspberry-pi-3.json b/4a-hal-cfg-community/hal-4a-raspberry-pi-3.json index 65c134a..86be677 100644 --- a/4a-hal-cfg-community/hal-4a-raspberry-pi-3.json +++ b/4a-hal-cfg-community/hal-4a-raspberry-pi-3.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-07-20" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-reference/hal-4a-intel-minnow-bt.json b/4a-hal-cfg-reference/hal-4a-intel-minnow-bt.json deleted file mode 100644 index 0a17a4e..0000000 --- a/4a-hal-cfg-reference/hal-4a-intel-minnow-bt.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-path/pci-0000:00:1b.0", - "version": "0.9", - "api": "4a-hal-intel-minnow-bt", - "require": [ "alsacore", "smixer" ], - "info": "4a hal for Intel Minnow device", - "author": "Jonathan Aillet", - "date": "2018-06-13" - }, - "resources": [ - { - "uid": "hal-bt", - "info": "Bluetooth hal plugin to get selected bluetooth device as an input by tweaking softmixer configuration", - "libs": ["hal-bt.ctlso"] - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "alsa": { - "name": "IEC958 Playback Default", - "value": 100 - } - }, - { - "uid": "agl-pcm-playback-switch", - "alsa": { - "name": "IEC958 Playback Switch", - "value": 1 - } - } - ], - "halmixer": { - "uid": "intel-minnow", - "mixerapi": "smixer", - "prefix": "intel-minnow", - "ramps": [ - { - "uid": "ramp-very-fast", - "delay": 50, - "up": 6, - "down": 10 - }, - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 50, - "up": 2, - "down": 2 - }, - { - "uid": "ramp-very-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "INTEL-MINNOW", - "cardid": "hw:PCH", - "device": 3, - "params": { - "rate": 48000 - }, - "sink": { - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - } - ] - } - }, - "captures": [ - { - "uid": "bluetooth", - "pcmplug_params": "bluealsa_proxy", - "params": { - "channels": 2 - }, - "source": { - "channels": [ - { - "uid": "bluetooth-right", - "port": 0 - }, - { - "uid": "bluetooth-left", - "port": 1 - } - ] - } - } - ], - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - } - ], - "streams": [ - { - "uid": "multimedia", - "verb": "multimedia", - "zone": "full-stereo", - "volume": 60, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "navigation", - "verb": "navigation", - "zone": "front-seats", - "volume": 70, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "emergency", - "verb": "emergency", - "zone": "front-seats", - "volume": 60, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "bluetooth_stream", - "verb": "bluetooth_stream", - "zone": "front-seats", - "source" : "bluetooth", - "volume": 85, - "mute": false, - "params": { - "rate" : 48000, - "format": "S16_LE", - "channels": 2 - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000 - } - } - ] - } -} diff --git a/4a-hal-cfg-reference/hal-4a-intel-minnow.json b/4a-hal-cfg-reference/hal-4a-intel-minnow.json index 39276fc..9a5effb 100644 --- a/4a-hal-cfg-reference/hal-4a-intel-minnow.json +++ b/4a-hal-cfg-reference/hal-4a-intel-minnow.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-reference/hal-4a-intel-qemu-bt.json b/4a-hal-cfg-reference/hal-4a-intel-qemu-bt.json deleted file mode 100644 index f9b2948..0000000 --- a/4a-hal-cfg-reference/hal-4a-intel-qemu-bt.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-path/pci-0000:00:03.0", - "version": "0.9", - "api": "4a-hal-intel-qemu-bt", - "require": [ "alsacore", "smixer" ], - "info": "4a hal for QEMU Intel device", - "author": "Jonathan Aillet", - "date": "2018-07-10" - }, - "resources": [ - { - "uid": "hal-bt", - "info": "Bluetooth hal plugin to get selected bluetooth device as an input by tweaking softmixer configuration", - "libs": ["hal-bt.ctlso"] - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "alsa": { - "name": "Master Playback Volume", - "value": 100 - } - }, - { - "uid": "agl-master-playback-switch", - "alsa": { - "name": "Master Playback Switch", - "value": 1 - } - }, - { - "uid": "agl-capture-volume", - "alsa": { - "name": "Capture Volume" - } - } - ], - "halmixer": { - "uid": "intel", - "mixerapi": "smixer", - "prefix": "intel-qemu", - "ramps": [ - { - "uid": "ramp-very-fast", - "delay": 50, - "up": 6, - "down": 10 - }, - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 50, - "up": 2, - "down": 2 - }, - { - "uid": "ramp-very-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "INTEL-QEMU", - "path": "/dev/snd/by-path/pci-0000:00:03.0", - "params": { - "rate": 48000 - }, - "sink": { - "controls": { - "volume": { - "name": "Master Playback Volume", - "value": 80 - }, - "mute": { - "name": "Master Playback Switch" - } - }, - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - } - ] - } - }, - "captures": [ - { - "uid": "bluetooth", - "pcmplug_params": "bluealsa_proxy", - "params": { - "channels": 2 - }, - "source": { - "channels": [ - { - "uid": "bluetooth-right", - "port": 0 - }, - { - "uid": "bluetooth-left", - "port": 1 - } - ] - } - } - ], - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - } - ], - "streams": [ - { - "uid": "multimedia", - "verb": "multimedia", - "zone": "full-stereo", - "volume": 60, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "navigation", - "verb": "navigation", - "zone": "front-seats", - "volume": 70, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "emergency", - "verb": "emergency", - "zone": "front-seats", - "volume": 60, - "mute": false, - "params": { - "rate": 48000 - } - }, - { - "uid": "bluetooth_stream", - "verb": "bluetooth_stream", - "zone": "front-seats", - "source" : "bluetooth", - "volume": 85, - "mute": false, - "params": { - "rate" : 48000, - "format": "S16_LE", - "channels": 2 - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000 - } - } - ] - } -} diff --git a/4a-hal-cfg-reference/hal-4a-intel-qemu.json b/4a-hal-cfg-reference/hal-4a-intel-qemu.json index 3008a7a..eed75de 100644 --- a/4a-hal-cfg-reference/hal-4a-intel-qemu.json +++ b/4a-hal-cfg-reference/hal-4a-intel-qemu.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-07-10" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-reference/hal-4a-rcar-m3-bt.json b/4a-hal-cfg-reference/hal-4a-rcar-m3-bt.json deleted file mode 100644 index ebf7138..0000000 --- a/4a-hal-cfg-reference/hal-4a-rcar-m3-bt.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-path/platform-sound", - "version": "0.9", - "api": "4a-hal-rcar-m3-bt", - "require": [ "alsacore", "smixer" ], - "info": "4a hal for Rcar M3 device", - "author": "Jonathan Aillet", - "date": "2018-06-13" - }, - "resources": [ - { - "uid": "hal-bt", - "info": "Bluetooth hal plugin to get selected bluetooth device as an input by tweaking softmixer configuration", - "libs": ["hal-bt.ctlso"] - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "alsa": { - "name": "DVC Out Playback Volume", - "value": 80 - } - }, - { - "uid": "agl-pcm-playback-volume", - "alsa": { - "name": "DVC Out Playback Volume", - "value": 80 - } - }, - { - "uid": "agl-pcm-playback-switch", - "alsa": { - "name": "SRC Out Rate Switch", - "value": 1 - } - }, - { - "uid": "agl-capture-volume", - "alsa": { - "name": "DVC In Capture Volume" - } - } - ], - "halmixer": { - "uid": "rcar-m3", - "mixerapi": "smixer", - "prefix": "m3", - "ramps": [ - { - "uid": "ramp-very-fast", - "delay": 50, - "up": 6, - "down": 10 - }, - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 50, - "up": 2, - "down": 2 - }, - { - "uid": "ramp-very-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "RCAR-M3", - "path": "/dev/snd/by-path/platform-sound", - "params": { - "rate": 48000, - "format": "S24_LE" - }, - "sink": { - "controls": { - "volume": { - "name": "DVC Out Playback Volume", - "value": 80 - }, - "mute": { - "name": "SRC Out Rate Switch" - } - }, - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - } - ] - } - }, - "captures": [ - { - "uid": "bluetooth", - "pcmplug_params": "bluealsa_proxy", - "params": { - "channels": 2 - }, - "source": { - "channels": [ - { - "uid": "bluetooth-right", - "port": 0 - }, - { - "uid": "bluetooth-left", - "port": 1 - } - ] - } - } - ], - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - } - ], - "streams": [ - { - "uid": "multimedia", - "verb": "multimedia", - "zone": "full-stereo", - "volume": 60, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "navigation", - "verb": "navigation", - "zone": "front-seats", - "volume": 70, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "emergency", - "verb": "emergency", - "zone": "front-seats", - "volume": 60, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "bluetooth_stream", - "verb": "bluetooth_stream", - "zone": "front-seats", - "source" : "bluetooth", - "volume": 85, - "mute": false, - "params": { - "rate" : 48000, - "format": "S16_LE", - "channels": 2 - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000 - } - } - ] - } -}
\ No newline at end of file diff --git a/4a-hal-cfg-reference/hal-4a-rcar-m3.json b/4a-hal-cfg-reference/hal-4a-rcar-m3.json index d961111..5644262 100644 --- a/4a-hal-cfg-reference/hal-4a-rcar-m3.json +++ b/4a-hal-cfg-reference/hal-4a-rcar-m3.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet", "date": "2018-06-13" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/4a-hal-cfg-reference/hal-4a-rcar-m3kf-bt.json b/4a-hal-cfg-reference/hal-4a-rcar-m3kf-bt.json deleted file mode 100644 index 8336158..0000000 --- a/4a-hal-cfg-reference/hal-4a-rcar-m3kf-bt.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-path/platform-sound@1", - "version": "0.9", - "api": "4a-hal-rcar-m3kf-bt", - "require": [ "alsacore", "smixer" ], - "info": "4a hal for Rcar M3 device when plugged on Kingfisher board", - "author": "Jonathan Aillet, Stephane Desneux", - "date": "2018-06-15" - }, - "resources": [ - { - "uid": "hal-bt", - "info": "Bluetooth hal plugin to get selected bluetooth device as an input by tweaking softmixer configuration", - "libs": ["hal-bt.ctlso"] - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "alsa": { - "name": "DVC Out Playback Volume", - "value": 80 - } - }, - { - "uid": "agl-pcm-playback-volume", - "alsa": { - "name": "DVC Out Playback Volume", - "value": 80 - } - }, - { - "uid": "agl-pcm-playback-switch", - "alsa": { - "name": "SRC Out Rate Switch", - "value": 1 - } - }, - { - "uid": "agl-capture-volume", - "alsa": { - "name": "DVC In Capture Volume" - } - } - ], - "halmixer": { - "uid": "rcar-m3", - "mixerapi": "smixer", - "prefix": "m3kf", - "ramps": [ - { - "uid": "ramp-very-fast", - "delay": 50, - "up": 6, - "down": 10 - }, - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 50, - "up": 2, - "down": 2 - }, - { - "uid": "ramp-very-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "RCAR-M3", - "path": "/dev/snd/by-path/platform-sound@1", - "params": { - "rate": 48000, - "format": "S24_LE" - }, - "sink": { - "controls": { - "volume": { - "name": "DVC Out Playback Volume", - "value": 80 - }, - "mute": { - "name": "SRC Out Rate Switch" - } - }, - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - } - ] - } - }, - "captures": [ - { - "uid": "bluetooth", - "pcmplug_params": "bluealsa_proxy", - "params": { - "channels": 2 - }, - "source": { - "channels": [ - { - "uid": "bluetooth-right", - "port": 0 - }, - { - "uid": "bluetooth-left", - "port": 1 - } - ] - } - }, - { - "uid": "radio", - "path": "/dev/snd/by-path/platform-sound@2", - "params": { - "channels": 2 - }, - "source": { - "channels": [ - { - "uid": "radio-right", - "port": 0 - }, - { - "uid": "radio-left", - "port": 1 - } - ] - } - } - ], - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - } - ], - "streams": [ - { - "uid": "multimedia", - "verb": "multimedia", - "zone": "full-stereo", - "volume": 60, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "navigation", - "verb": "navigation", - "zone": "front-seats", - "volume": 70, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "emergency", - "verb": "emergency", - "zone": "front-seats", - "volume": 60, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "bluetooth_stream", - "verb": "bluetooth_stream", - "zone": "front-seats", - "source" : "bluetooth", - "volume": 85, - "mute": false, - "params": { - "rate" : 48000, - "format": "S16_LE", - "channels": 2 - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "source" : "radio", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000 - } - } - ] - } -} diff --git a/4a-hal-cfg-reference/hal-4a-rcar-m3kf.json b/4a-hal-cfg-reference/hal-4a-rcar-m3kf.json index e8200ce..d374fcf 100644 --- a/4a-hal-cfg-reference/hal-4a-rcar-m3kf.json +++ b/4a-hal-cfg-reference/hal-4a-rcar-m3kf.json @@ -9,6 +9,17 @@ "author": "Jonathan Aillet, Stephane Desneux", "date": "2018-06-15" }, + "resources": [ + { + "uid": "hal-bt", + "info": "Bluetooth hal plugin to get A2DP bluetooth device as an input by tweaking softmixer configuration", + "params": { + "channels": 2, + "zone": "front-seats" + }, + "libs": ["hal-bt.ctlso"] + } + ], "controls": [ { "uid": "ping", diff --git a/plugins/lib/bluetooth/hal-bt-mixer-link.h b/plugins/lib/bluetooth/hal-bt-mixer-link.h index a1a3ef6..6fc90f6 100644 --- a/plugins/lib/bluetooth/hal-bt-mixer-link.h +++ b/plugins/lib/bluetooth/hal-bt-mixer-link.h @@ -26,6 +26,39 @@ #define MIXER_SET_STREAMED_BT_DEVICE_VERB "bluezalsa_dev" +#define MIXER_BT_CAPTURE_JSON_SECTION "\ +{\ + \"uid\": \"bluetooth\",\ + \"pcmplug_params\": \"bluealsa_proxy\",\ + \"source\": {\ + \"channels\": [\ + {\ + \"uid\": \"bluetooth-right\",\ + \"port\": 0\ + },\ + {\ + \"uid\": \"bluetooth-left\",\ + \"port\": 1\ + }\ + ]\ + }\ +}\ +" +#define MIXER_BT_STREAM_JSON_SECTION "\ +{\ + \"uid\": \"bluetooth_stream\",\ + \"verb\": \"bluetooth_stream\",\ + \"source\" : \"bluetooth\",\ + \"volume\": 80,\ + \"mute\": false,\ + \"params\": {\ + \"rate\" : 48000,\ + \"format\": \"S16_LE\",\ + \"channels\": 2\ + }\ +}\ +" + // HAL controllers handle mixer bt calls functions int HalBtMixerLinkSetBtStreamingSettings(AFB_ApiT apiHandle, char *mixerApiName, unsigned int btStreamStatus, char *hci, char *btAddress); diff --git a/plugins/lib/bluetooth/hal-bt.c b/plugins/lib/bluetooth/hal-bt.c index bacf9d2..a145df3 100644 --- a/plugins/lib/bluetooth/hal-bt.c +++ b/plugins/lib/bluetooth/hal-bt.c @@ -51,13 +51,15 @@ CTLP_ONLOAD(plugin, callbacks) CTLP_INIT(plugin, callbacks) { + int btChannelsNumber; + unsigned int idx; - char *returnedInfo; + char *btStreamZone, *returnedInfo; CtlConfigT *ctrlConfig; - json_object *actionsToAdd, *returnedJ; + json_object *actionsToAdd, *returnedJ, *halMixerJ, *halOrigCaptureJ, *halNewCaptureJ, *halOrigStreamJ, *halNewStreamJ, *btCaptureJ, *btCaptureParamsJ, *btStreamJ; AFB_ApiInfo(plugin->api, "Plugin initialization of HAL-BT plugin"); @@ -76,6 +78,12 @@ CTLP_INIT(plugin, callbacks) return -2; } + if((! localHalBtPluginData.currentHalData->ctlHalSpecificData) || + (! (halMixerJ = localHalBtPluginData.currentHalData->ctlHalSpecificData->halMixerJ))) { + AFB_ApiError(plugin->api, "Can't get current hal mixer json section"); + return -3; + } + if(AFB_ServiceSync(plugin->api, BT_MANAGER_API, BT_MANAGER_GET_POWER_INFO, NULL, &returnedJ)) { if((! wrap_json_unpack(returnedJ, "{s:{s:s}}", "request", "info", &returnedInfo)) && (! strncmp(returnedInfo, "Unable to get power status", strlen(returnedInfo)))) { @@ -91,10 +99,16 @@ CTLP_INIT(plugin, callbacks) BT_MANAGER_GET_POWER_INFO, BT_MANAGER_API, json_object_get_string(returnedJ)); - return -3; + return -4; } } + if((! json_object_is_type(plugin->paramsJ, json_type_object)) || + (wrap_json_unpack(plugin->paramsJ, "{s:i, s:s}", "channels", &btChannelsNumber, "zone", &btStreamZone))) { + AFB_ApiError(plugin->api, "Can't get HAL-BT plugin parameters from json ('%s')", json_object_get_string(plugin->paramsJ)); + return -5; + } + wrap_json_pack(&actionsToAdd, "{s:s s:s}", "uid", "Bluetooth-Manager/device_updated", "action", "plugin://hal-bt#events"); @@ -106,13 +120,13 @@ CTLP_INIT(plugin, callbacks) if(! ctrlConfig->sections[idx].key) { AFB_ApiError(plugin->api, "Wasn't able to add '%s' as a new event, 'events' section not found", json_object_get_string(actionsToAdd)); json_object_put(actionsToAdd); - return -4; + return -6; } if(AddActionsToSectionFromPlugin(plugin->api, *ctrlConfig->ctlPlugins, &ctrlConfig->sections[idx], actionsToAdd, 0)) { AFB_ApiError(plugin->api, "Wasn't able to add '%s' as a new event to %s", json_object_get_string(actionsToAdd), ctrlConfig->sections[idx].key); json_object_put(actionsToAdd); - return -5; + return -7; } wrap_json_pack(&actionsToAdd, "{s:s s:s s:s}", @@ -127,13 +141,64 @@ CTLP_INIT(plugin, callbacks) if(! ctrlConfig->sections[idx].key) { AFB_ApiError(plugin->api, "Wasn't able to add '%s' as a new onload, 'onload' section not found", json_object_get_string(actionsToAdd)); json_object_put(actionsToAdd); - return -6; + return -8; } if(AddActionsToSectionFromPlugin(plugin->api, *ctrlConfig->ctlPlugins, &ctrlConfig->sections[idx], actionsToAdd, 0)) { AFB_ApiError(plugin->api, "Wasn't able to add '%s' as a new onload to %s", json_object_get_string(actionsToAdd), ctrlConfig->sections[idx].uid); json_object_put(actionsToAdd); - return -7; + return -9; + } + + btCaptureJ = json_tokener_parse(MIXER_BT_CAPTURE_JSON_SECTION); + wrap_json_pack(&btCaptureParamsJ, "{s:i}", "channels", btChannelsNumber); + json_object_object_add(btCaptureJ, "params", btCaptureParamsJ); + + if(! json_object_object_get_ex(halMixerJ, "captures", &halOrigCaptureJ)) { + halNewCaptureJ = json_object_new_array(); + json_object_array_add(halNewCaptureJ, btCaptureJ); + json_object_object_add(halMixerJ, "captures", halNewCaptureJ); + } + else if(json_object_is_type(halOrigCaptureJ, json_type_array)) { + halNewCaptureJ = halOrigCaptureJ; + json_object_array_add(halNewCaptureJ, btCaptureJ); + } + else if(json_object_is_type(halOrigCaptureJ, json_type_object)) { + json_object_get(halOrigCaptureJ); + json_object_object_del(halMixerJ, "captures"); + halNewCaptureJ = json_object_new_array(); + json_object_array_add(halNewCaptureJ, halOrigCaptureJ); + json_object_array_add(halNewCaptureJ, btCaptureJ); + json_object_object_add(halMixerJ, "captures", halNewCaptureJ); + } + else { + AFB_ApiError(plugin->api, "Unrecognized 'halmixer' captures format"); + return -10; + } + + btStreamJ = json_tokener_parse(MIXER_BT_STREAM_JSON_SECTION); + json_object_object_add(btStreamJ, "zone", json_object_new_string(btStreamZone)); + + if(! json_object_object_get_ex(halMixerJ, "streams", &halOrigStreamJ)) { + halNewStreamJ = json_object_new_array(); + json_object_array_add(halNewStreamJ, btStreamJ); + json_object_object_add(halMixerJ, "streams", halNewStreamJ); + } + else if(json_object_is_type(halOrigStreamJ, json_type_array)) { + halNewStreamJ = halOrigStreamJ; + json_object_array_add(halNewStreamJ, btStreamJ); + } + else if(json_object_is_type(halOrigStreamJ, json_type_object)) { + json_object_get(halOrigStreamJ); + json_object_object_del(halMixerJ, "streams"); + halNewStreamJ = json_object_new_array(); + json_object_array_add(halNewStreamJ, halOrigStreamJ); + json_object_array_add(halNewStreamJ, btStreamJ); + json_object_object_add(halMixerJ, "streams", halNewStreamJ); + } + else { + AFB_ApiError(plugin->api, "Unrecognized 'halmixer' streams format"); + return -11; } localHalBtPluginData.halBtPluginEnabled = 1; |