summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;