From 8dc6241c47e500a51afb3db1c77ac4c234f11b17 Mon Sep 17 00:00:00 2001 From: Tobias Jahnke Date: Tue, 20 Nov 2018 09:46:04 +0100 Subject: hal-unicens: introduced mutexes, update config Bug-AGL: SPEC-1505 - increase default volume - introduced mutexes to avoid conc. access - enable again message transmission which was disabled for debugging Signed-off-by: Tobias Jahnke --- cfg/hal-4a-unicens-118.json | 265 ------------------------------------------- cfg/hal-4a-unicens-210.json | 265 ------------------------------------------- cfg/hal-4a-unicens-coax.json | 265 +++++++++++++++++++++++++++++++++++++++++++ cfg/hal-4a-unicens-utp.json | 265 +++++++++++++++++++++++++++++++++++++++++++ plugin/most_unicens.c | 111 ++++++++++-------- 5 files changed, 596 insertions(+), 575 deletions(-) delete mode 100644 cfg/hal-4a-unicens-118.json delete mode 100644 cfg/hal-4a-unicens-210.json create mode 100644 cfg/hal-4a-unicens-coax.json create mode 100644 cfg/hal-4a-unicens-utp.json diff --git a/cfg/hal-4a-unicens-118.json b/cfg/hal-4a-unicens-118.json deleted file mode 100644 index a45867e..0000000 --- a/cfg/hal-4a-unicens-118.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-id/usb-Microchip-SMSC_OS81118_0000-0000004C-02", - "version": "0.9", - "api": "4a-hal-unicens", - "require": [ "alsacore", "UNICENS", "smixer" ], - "info": "4a HAL for UNICENS for OS81118", - "author": "Jonathan Aillet", - "date": "2018-06-15" - }, - "resources": [ - { - "uid": "hal-unicens", - "info": "UNICENS HAL plugin", - "spath": "./package/lib/plugins:./package/var:./lib/plugins:./var:/usr/libexec/agl/4a-hal", - "libs": ["hal-unicens.ctlso"] - } - ], - "onload": [ - { - "uid": "init-audio-hal", - "info": "Init current HAL", - "action": "plugin://hal-unicens#Init" - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "events": [ - { - "uid": "UNICENS/node-availibility", - "action": "plugin://hal-unicens#Events" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "info": "Sets master playback volume", - "alsa": { - "name": "Master Playback Volume", - "value": 80, - "create": - { - "type": "INTEGER", - "count": 1, - "minval": 0, - "maxval": 100, - "step": 1 - } - }, - "action": "plugin://hal-unicens#MasterVol" - }, - { - "uid": "agl-pcm-playback-volume", - "info": "Sets PCM playback volume", - "alsa": { - "name": "PCM Playback Volume", - "value": 100, - "create": - { - "type": "INTEGER", - "count": 1, - "minval": 0, - "maxval": 100, - "step": 1 - } - }, - "action": "plugin://hal-unicens#PCMVol" - } - ], - "halmixer": { - "uid": "unicens", - "mixerapi": "smixer", - "prefix": "ucs", - "ramps": [ - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "UNICENS", - "path": "/dev/snd/by-id/usb-Microchip-SMSC_OS81118_0000-0000004C-02", - "params": { - "rate": 48000, - "format": "S16_LE" - }, - "sink": { - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - }, - { - "uid": "middle-right", - "port": 2 - }, - { - "uid": "middle-left", - "port": 3 - }, - { - "uid": "back-right", - "port": 4 - }, - { - "uid": "back-left", - "port": 5 - } - ] - } - }, - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - }, - { - "target": "middle-right", - "channel": 0 - }, - { - "target": "middle-left", - "channel": 1 - }, - { - "target": "back-right", - "channel": 0 - }, - { - "target": "back-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "middle-seats", - "sink": [ - { - "target": "middle-right", - "channel": 0 - }, - { - "target": "middle-left", - "channel": 1 - } - ] - }, - { - "uid": "back-seats", - "sink": [ - { - "target": "back-right", - "channel": 0 - }, - { - "target": "back-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": "legacy", - "verb": "legacy", - "zone": "back-seats", - "source": "loop-legacy", - "volume": 50, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000, - "format": "S16_LE" - } - } - ] - } -} diff --git a/cfg/hal-4a-unicens-210.json b/cfg/hal-4a-unicens-210.json deleted file mode 100644 index 1782aad..0000000 --- a/cfg/hal-4a-unicens-210.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "/dev/snd/by-id/usb-Microchip-SMSC_OS81210_0200-0000000C-02", - "version": "0.9", - "api": "4a-hal-unicens", - "require": [ "alsacore", "UNICENS", "smixer" ], - "info": "4a HAL for UNICENS for OS81210", - "author": "Jonathan Aillet", - "date": "2018-06-15" - }, - "resources": [ - { - "uid": "hal-unicens", - "info": "UNICENS HAL plugin", - "spath": "./package/lib/plugins:./package/var:./lib/plugins:./var:/usr/libexec/agl/4a-hal", - "libs": ["hal-unicens.ctlso"] - } - ], - "onload": [ - { - "uid": "init-audio-hal", - "info": "Init current HAL", - "action": "plugin://hal-unicens#Init" - } - ], - "controls": [ - { - "uid": "ping", - "info": "Ping hal", - "action": "api://4a-hal-manager#ping" - } - ], - "events": [ - { - "uid": "UNICENS/node-availibility", - "action": "plugin://hal-unicens#Events" - } - ], - "halmap": [ - { - "uid": "agl-master-playback-volume", - "info": "Sets master playback volume", - "alsa": { - "name": "Master Playback Volume", - "value": 80, - "create": - { - "type": "INTEGER", - "count": 1, - "minval": 0, - "maxval": 100, - "step": 1 - } - }, - "action": "plugin://hal-unicens#MasterVol" - }, - { - "uid": "agl-pcm-playback-volume", - "info": "Sets PCM playback volume", - "alsa": { - "name": "PCM Playback Volume", - "value": 100, - "create": - { - "type": "INTEGER", - "count": 1, - "minval": 0, - "maxval": 100, - "step": 1 - } - }, - "action": "plugin://hal-unicens#PCMVol" - } - ], - "halmixer": { - "uid": "unicens", - "mixerapi": "smixer", - "prefix": "ucs", - "ramps": [ - { - "uid": "ramp-fast", - "delay": 50, - "up": 2, - "down": 10 - }, - { - "uid": "ramp-normal", - "delay": 50, - "up": 2, - "down": 4 - }, - { - "uid": "ramp-slow", - "delay": 100, - "up": 1, - "down": 1 - } - ], - "playbacks" : { - "uid": "UNICENS", - "path": "/dev/snd/by-id/usb-Microchip-SMSC_OS81210_0200-0000000C-02", - "params": { - "rate": 48000, - "format": "S16_LE" - }, - "sink": { - "channels": [ - { - "uid": "front-right", - "port": 0 - }, - { - "uid": "front-left", - "port": 1 - }, - { - "uid": "middle-right", - "port": 2 - }, - { - "uid": "middle-left", - "port": 3 - }, - { - "uid": "back-right", - "port": 4 - }, - { - "uid": "back-left", - "port": 5 - } - ] - } - }, - "zones": [ - { - "uid": "full-stereo", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - }, - { - "target": "middle-right", - "channel": 0 - }, - { - "target": "middle-left", - "channel": 1 - }, - { - "target": "back-right", - "channel": 0 - }, - { - "target": "back-left", - "channel": 1 - } - ] - }, - { - "uid": "front-seats", - "sink": [ - { - "target": "front-right", - "channel": 0 - }, - { - "target": "front-left", - "channel": 1 - } - ] - }, - { - "uid": "middle-seats", - "sink": [ - { - "target": "middle-right", - "channel": 0 - }, - { - "target": "middle-left", - "channel": 1 - } - ] - }, - { - "uid": "back-seats", - "sink": [ - { - "target": "back-right", - "channel": 0 - }, - { - "target": "back-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": "legacy", - "verb": "legacy", - "zone": "back-seats", - "source": "loop-legacy", - "volume": 50, - "mute": false, - "params": { - "rate": 48000, - "format": "S16_LE" - } - }, - { - "uid": "radio_stream", - "verb": "radio_stream", - "zone": "full-stereo", - "volume": 70, - "mute": true, - "params": { - "rate" : 48000, - "format": "S16_LE" - } - } - ] - } -} diff --git a/cfg/hal-4a-unicens-coax.json b/cfg/hal-4a-unicens-coax.json new file mode 100644 index 0000000..b199123 --- /dev/null +++ b/cfg/hal-4a-unicens-coax.json @@ -0,0 +1,265 @@ +{ + "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", + "metadata": { + "uid": "/dev/snd/by-id/usb-Microchip-SMSC_OS81118_0000-0000004C-02", + "version": "0.9", + "api": "4a-hal-unicens", + "require": [ "alsacore", "UNICENS", "smixer" ], + "info": "4a HAL for UNICENS for OS81118", + "author": "Jonathan Aillet", + "date": "2018-06-15" + }, + "resources": [ + { + "uid": "hal-unicens", + "info": "UNICENS HAL plugin", + "spath": "./package/lib/plugins:./package/var:./lib/plugins:./var:/usr/libexec/agl/4a-hal", + "libs": ["hal-unicens.ctlso"] + } + ], + "onload": [ + { + "uid": "init-audio-hal", + "info": "Init current HAL", + "action": "plugin://hal-unicens#Init" + } + ], + "controls": [ + { + "uid": "ping", + "info": "Ping hal", + "action": "api://4a-hal-manager#ping" + } + ], + "events": [ + { + "uid": "UNICENS/node-availibility", + "action": "plugin://hal-unicens#Events" + } + ], + "halmap": [ + { + "uid": "agl-master-playback-volume", + "info": "Sets master playback volume", + "alsa": { + "name": "Master Playback Volume", + "value": 90, + "create": + { + "type": "INTEGER", + "count": 1, + "minval": 0, + "maxval": 100, + "step": 1 + } + }, + "action": "plugin://hal-unicens#MasterVol" + }, + { + "uid": "agl-pcm-playback-volume", + "info": "Sets PCM playback volume", + "alsa": { + "name": "PCM Playback Volume", + "value": 100, + "create": + { + "type": "INTEGER", + "count": 1, + "minval": 0, + "maxval": 100, + "step": 1 + } + }, + "action": "plugin://hal-unicens#PCMVol" + } + ], + "halmixer": { + "uid": "unicens", + "mixerapi": "smixer", + "prefix": "ucs", + "ramps": [ + { + "uid": "ramp-fast", + "delay": 50, + "up": 2, + "down": 10 + }, + { + "uid": "ramp-normal", + "delay": 50, + "up": 2, + "down": 4 + }, + { + "uid": "ramp-slow", + "delay": 100, + "up": 1, + "down": 1 + } + ], + "playbacks" : { + "uid": "UNICENS", + "path": "/dev/snd/by-id/usb-Microchip-SMSC_OS81118_0000-0000004C-02", + "params": { + "rate": 48000, + "format": "S16_LE" + }, + "sink": { + "channels": [ + { + "uid": "front-right", + "port": 0 + }, + { + "uid": "front-left", + "port": 1 + }, + { + "uid": "middle-right", + "port": 2 + }, + { + "uid": "middle-left", + "port": 3 + }, + { + "uid": "back-right", + "port": 4 + }, + { + "uid": "back-left", + "port": 5 + } + ] + } + }, + "zones": [ + { + "uid": "full-stereo", + "sink": [ + { + "target": "front-right", + "channel": 0 + }, + { + "target": "front-left", + "channel": 1 + }, + { + "target": "middle-right", + "channel": 0 + }, + { + "target": "middle-left", + "channel": 1 + }, + { + "target": "back-right", + "channel": 0 + }, + { + "target": "back-left", + "channel": 1 + } + ] + }, + { + "uid": "front-seats", + "sink": [ + { + "target": "front-right", + "channel": 0 + }, + { + "target": "front-left", + "channel": 1 + } + ] + }, + { + "uid": "middle-seats", + "sink": [ + { + "target": "middle-right", + "channel": 0 + }, + { + "target": "middle-left", + "channel": 1 + } + ] + }, + { + "uid": "back-seats", + "sink": [ + { + "target": "back-right", + "channel": 0 + }, + { + "target": "back-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": "legacy", + "verb": "legacy", + "zone": "back-seats", + "source": "loop-legacy", + "volume": 50, + "mute": false, + "params": { + "rate": 48000, + "format": "S16_LE" + } + }, + { + "uid": "radio_stream", + "verb": "radio_stream", + "zone": "full-stereo", + "volume": 70, + "mute": true, + "params": { + "rate" : 48000, + "format": "S16_LE" + } + } + ] + } +} diff --git a/cfg/hal-4a-unicens-utp.json b/cfg/hal-4a-unicens-utp.json new file mode 100644 index 0000000..ff7dbbc --- /dev/null +++ b/cfg/hal-4a-unicens-utp.json @@ -0,0 +1,265 @@ +{ + "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", + "metadata": { + "uid": "/dev/snd/by-id/usb-Microchip-SMSC_OS81210_0200-0000000C-02", + "version": "0.9", + "api": "4a-hal-unicens", + "require": [ "alsacore", "UNICENS", "smixer" ], + "info": "4a HAL for UNICENS for OS81210", + "author": "Jonathan Aillet", + "date": "2018-06-15" + }, + "resources": [ + { + "uid": "hal-unicens", + "info": "UNICENS HAL plugin", + "spath": "./package/lib/plugins:./package/var:./lib/plugins:./var:/usr/libexec/agl/4a-hal", + "libs": ["hal-unicens.ctlso"] + } + ], + "onload": [ + { + "uid": "init-audio-hal", + "info": "Init current HAL", + "action": "plugin://hal-unicens#Init" + } + ], + "controls": [ + { + "uid": "ping", + "info": "Ping hal", + "action": "api://4a-hal-manager#ping" + } + ], + "events": [ + { + "uid": "UNICENS/node-availibility", + "action": "plugin://hal-unicens#Events" + } + ], + "halmap": [ + { + "uid": "agl-master-playback-volume", + "info": "Sets master playback volume", + "alsa": { + "name": "Master Playback Volume", + "value": 90, + "create": + { + "type": "INTEGER", + "count": 1, + "minval": 0, + "maxval": 100, + "step": 1 + } + }, + "action": "plugin://hal-unicens#MasterVol" + }, + { + "uid": "agl-pcm-playback-volume", + "info": "Sets PCM playback volume", + "alsa": { + "name": "PCM Playback Volume", + "value": 100, + "create": + { + "type": "INTEGER", + "count": 1, + "minval": 0, + "maxval": 100, + "step": 1 + } + }, + "action": "plugin://hal-unicens#PCMVol" + } + ], + "halmixer": { + "uid": "unicens", + "mixerapi": "smixer", + "prefix": "ucs", + "ramps": [ + { + "uid": "ramp-fast", + "delay": 50, + "up": 2, + "down": 10 + }, + { + "uid": "ramp-normal", + "delay": 50, + "up": 2, + "down": 4 + }, + { + "uid": "ramp-slow", + "delay": 100, + "up": 1, + "down": 1 + } + ], + "playbacks" : { + "uid": "UNICENS", + "path": "/dev/snd/by-id/usb-Microchip-SMSC_OS81210_0200-0000000C-02", + "params": { + "rate": 48000, + "format": "S16_LE" + }, + "sink": { + "channels": [ + { + "uid": "front-right", + "port": 0 + }, + { + "uid": "front-left", + "port": 1 + }, + { + "uid": "middle-right", + "port": 2 + }, + { + "uid": "middle-left", + "port": 3 + }, + { + "uid": "back-right", + "port": 4 + }, + { + "uid": "back-left", + "port": 5 + } + ] + } + }, + "zones": [ + { + "uid": "full-stereo", + "sink": [ + { + "target": "front-right", + "channel": 0 + }, + { + "target": "front-left", + "channel": 1 + }, + { + "target": "middle-right", + "channel": 0 + }, + { + "target": "middle-left", + "channel": 1 + }, + { + "target": "back-right", + "channel": 0 + }, + { + "target": "back-left", + "channel": 1 + } + ] + }, + { + "uid": "front-seats", + "sink": [ + { + "target": "front-right", + "channel": 0 + }, + { + "target": "front-left", + "channel": 1 + } + ] + }, + { + "uid": "middle-seats", + "sink": [ + { + "target": "middle-right", + "channel": 0 + }, + { + "target": "middle-left", + "channel": 1 + } + ] + }, + { + "uid": "back-seats", + "sink": [ + { + "target": "back-right", + "channel": 0 + }, + { + "target": "back-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": "legacy", + "verb": "legacy", + "zone": "back-seats", + "source": "loop-legacy", + "volume": 50, + "mute": false, + "params": { + "rate": 48000, + "format": "S16_LE" + } + }, + { + "uid": "radio_stream", + "verb": "radio_stream", + "zone": "full-stereo", + "volume": 70, + "mute": true, + "params": { + "rate" : 48000, + "format": "S16_LE" + } + } + ] + } +} diff --git a/plugin/most_unicens.c b/plugin/most_unicens.c index 2a36954..e34ef63 100644 --- a/plugin/most_unicens.c +++ b/plugin/most_unicens.c @@ -23,27 +23,29 @@ #include #include #include +#include #include - #include #include "wrap_unicens.h" #include "wrap_volume.h" -CTLP_CAPI_REGISTER("hal-unicens") - #define PCM_MAX_CHANNELS 6 +CTLP_CAPI_REGISTER("hal-unicens") AFB_ApiT unicensHalApiHandle; static uint8_t initialized = 0; +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -// Call at initialisation time +// Call at initialization time CTLP_ONLOAD(plugin, callbacks) -{ +{ + pthread_mutex_lock(&mutex); unicensHalApiHandle = plugin->api; AFB_ApiNotice(unicensHalApiHandle, "4A-HAL-UNICENS: Plugin Register: uid='%s' 'info='%s'", plugin->uid, plugin->info); + pthread_mutex_unlock(&mutex); return 0; } @@ -51,54 +53,60 @@ CTLP_ONLOAD(plugin, callbacks) CTLP_CAPI(MasterVol, source, argsJ, queryJ) { int master_volume; - json_object *valueJ; + int err = 0; - AFB_ApiNotice(source->api, "4A-HAL-UNICENS: MasterVolume=%s", json_object_to_json_string(queryJ)); + pthread_mutex_lock(&mutex); - //debug - return 0; + AFB_ApiNotice(source->api, "4A-HAL-UNICENS: MasterVolume=%s", json_object_to_json_string(queryJ)); if(! initialized) { AFB_ApiWarning(source->api, "%s: Link to unicens binder is not initialized, can't set master volume, value=%s", __func__, json_object_get_string(queryJ)); - return -1; + err = -1; + goto Abort_Exit; } if(! json_object_is_type(queryJ, json_type_array) || json_object_array_length(queryJ) <= 0) { AFB_ApiError(source->api, "%s: invalid json (should be a non empty json array) value=%s", __func__, json_object_get_string(queryJ)); - return -2; + err = -2; + goto Abort_Exit; } valueJ = json_object_array_get_idx(queryJ, 0); if(! json_object_is_type(valueJ, json_type_int)) { AFB_ApiError(source->api, "%s: invalid json (should be an array of int) value=%s", __func__, json_object_get_string(queryJ)); - return -3; + err = -3; + goto Abort_Exit; } master_volume = json_object_get_int(valueJ); wrap_volume_master(source->api, master_volume); + +Abort_Exit: + pthread_mutex_unlock(&mutex); - return 0; + return err; } CTLP_CAPI(MasterSwitch, source, argsJ, queryJ) { json_bool master_switch; json_object *valueJ; - + int err = 0; + + pthread_mutex_lock(&mutex); AFB_ApiNotice(source->api, "4A-HAL-UNICENS: MasterSwitch=%s", json_object_to_json_string(queryJ)); - - //debug - return 0; if(! initialized) { AFB_ApiWarning(source->api, "%s: Link to unicens binder is not initialized, can't set master switch, value=%s", __func__, json_object_get_string(queryJ)); - return -1; + err = -1; + goto Abort_Exit; } if(! json_object_is_type(queryJ, json_type_array) || json_object_array_length(queryJ) <= 0) { AFB_ApiError(source->api, "%s: invalid json (should be a non empty json array) value=%s", __func__, json_object_get_string(queryJ)); - return -2; + err = -2; + goto Abort_Exit; } // In case if alsa doesn't return a proper json boolean @@ -114,26 +122,34 @@ CTLP_CAPI(MasterSwitch, source, argsJ, queryJ) default: AFB_ApiError(source->api, "%s: invalid json (should be an array of boolean/int) value=%s", __func__, json_object_get_string(queryJ)); - return -3; + err = -3; + goto Abort_Exit; } // TBD: implement pause action for Unicens AFB_ApiWarning(source->api, "%s: Try to set master switch to %i, but function is not implemented", __func__, (int) master_switch); - return 0; +Abort_Exit: + pthread_mutex_unlock(&mutex); + + return err; } +CTLP_CAPI(PCMVol, source, argsJ, queryJ) +{ + AFB_ApiNotice(source->api, "4A-HAL-UNICENS: PCMVolume=%s", json_object_to_json_string(queryJ)); + return 0; +} + +#if 0 +// PCM volume not provided yet CTLP_CAPI(PCMVol, source, argsJ, queryJ) { int idx; int pcm_volume[PCM_MAX_CHANNELS]; - json_object *valueJ; - + AFB_ApiNotice(source->api, "4A-HAL-UNICENS: PCMVolume=%s", json_object_to_json_string(queryJ)); - - //debug - return 0; if(! initialized) { AFB_ApiWarning(source->api, "%s: Link to unicens binder is not initialized, can't set PCM volume, value=%s", __func__, json_object_get_string(queryJ)); @@ -163,37 +179,39 @@ CTLP_CAPI(PCMVol, source, argsJ, queryJ) return 0; } +#endif /* initializes ALSA sound card, UNICENS API */ CTLP_CAPI(Init, source, argsJ, queryJ) { int err = 0; - //int pcm_volume[PCM_MAX_CHANNELS] = { 80, 80, 80, 80, 80, 80 }; + int pcm_volume[PCM_MAX_CHANNELS] = { 100, 100, 100, 100, 100, 100 }; + pthread_mutex_lock(&mutex); AFB_ApiNotice(source->api, "4A-HAL-UNICENS: Initializing 4a plugin"); - - // debug - return 0; -#if 1 + if((err = wrap_volume_init())) { AFB_ApiError(source->api, "Failed to initialize wrapper for volume library"); - return err; + goto Abort_Exit; } - + if((err = wrap_ucs_subscribe_sync(source->api))) { AFB_ApiError(source->api, "Failed to subscribe to UNICENS binding"); - return err; + goto Abort_Exit; } // Set output volume to pre-defined level in order to // avoid muted volume to be persistent after boot. //wrap_volume_master(source->api, 80); - //wrap_volume_pcm(source->api, pcm_volume, PCM_MAX_CHANNELS); -#endif + wrap_volume_pcm(source->api, pcm_volume, PCM_MAX_CHANNELS); + AFB_ApiNotice(source->api, "4A-HAL-UNICENS: Initializing plugin done.."); initialized = 1; + +Abort_Exit: + pthread_mutex_unlock(&mutex); - return 0; + return err; } // This receive UNICENS events @@ -201,38 +219,41 @@ CTLP_CAPI(Events, source, argsJ, queryJ) { uint16_t node = 0U; bool available = false; - int error = false; + int err = 0; json_object *j_tmp = NULL; - //debug - return 0; + pthread_mutex_lock(&mutex); if (initialized == 0) { AFB_ApiError(source->api, "4A-HAL-UNICENS: Not initialized while receiving event query=%s", json_object_to_json_string(queryJ)); - return 0; + err = 0; + goto Abort_Exit; } if (json_object_object_get_ex(queryJ, "node", &j_tmp)) { node = (uint16_t)json_object_get_int(j_tmp); } else { - error = -1; + err = -1; } if (json_object_object_get_ex(queryJ, "available", &j_tmp)) { available = (bool)json_object_get_boolean(j_tmp); } else { - error = -2; + err = -2; } - if(!error) { + if(err == 0) { AFB_ApiNotice(source->api, "4A-HAL-UNICENS: Node-Availability: node=0x%03X, available=%d", node, available); wrap_volume_node_avail(source->api, node, available); } else { AFB_ApiError(source->api, "4A-HAL-UNICENS: Failed to parse events query=%s", json_object_to_json_string(queryJ)); } + +Abort_Exit: + pthread_mutex_unlock(&mutex); - return error; + return err; } -- cgit 1.2.3-korg