aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2018-09-19 12:23:59 +0200
committerJonathan Aillet <jonathan.aillet@iot.bzh>2018-10-08 15:57:27 +0200
commit04bb36a2bf5eac8d605c9e63b5cc9c1cf79be905 (patch)
treecd1bb95ecc7afadcbfa892312cf2701e7f958be0
parente1b9634b554d91012edef2a564a9dcfb25cae503 (diff)
hal-bt: Enrich 'halmixer' section in plugin init
Enrich 'halmixer' section with bluetooth specific 'source' and 'stream' during hal-bt plugin initialization. Some parameters must be passed to plugin using 'params' key in controller json plugin section. This allows to get rid of must of the additional configuration when using bluetooth in a hal. Change-Id: I5820e75307a3394eca80cf783e7bc4c31c2d7659 Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
-rw-r--r--4a-hal-cfg-community/hal-4a-2ch-generic-usb.json11
-rw-r--r--4a-hal-cfg-community/hal-4a-csl-cm106-8ch-usb.json11
-rw-r--r--4a-hal-cfg-community/hal-4a-ensoniq.json11
-rw-r--r--4a-hal-cfg-community/hal-4a-intel.json11
-rw-r--r--4a-hal-cfg-community/hal-4a-jabra.json11
-rw-r--r--4a-hal-cfg-community/hal-4a-raspberry-pi-3.json11
-rw-r--r--4a-hal-cfg-reference/hal-4a-intel-minnow-bt.json203
-rw-r--r--4a-hal-cfg-reference/hal-4a-intel-minnow.json11
-rw-r--r--4a-hal-cfg-reference/hal-4a-intel-qemu-bt.json217
-rw-r--r--4a-hal-cfg-reference/hal-4a-intel-qemu.json11
-rw-r--r--4a-hal-cfg-reference/hal-4a-rcar-m3-bt.json228
-rw-r--r--4a-hal-cfg-reference/hal-4a-rcar-m3.json11
-rw-r--r--4a-hal-cfg-reference/hal-4a-rcar-m3kf-bt.json248
-rw-r--r--4a-hal-cfg-reference/hal-4a-rcar-m3kf.json11
-rw-r--r--plugins/lib/bluetooth/hal-bt-mixer-link.h33
-rw-r--r--plugins/lib/bluetooth/hal-bt.c79
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;