aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/lib/bluetooth
diff options
context:
space:
mode:
authorThierry Bultel <thierry.bultel@iot.bzh>2018-12-05 14:05:10 +0100
committerThierry Bultel <thierry.bultel@iot.bzh>2018-12-20 16:55:46 +0000
commit01d55ed8cdd01ca4a7b391ca61c80084bd5a6f2f (patch)
treed73ce778a2177e82e07e9d31891a827467fbadd4 /plugins/lib/bluetooth
parentdbe555be80dd10bb315b14bbebcb42f8b883e2c9 (diff)
Adds support for bluetooth audio through bluez-alsaguppy_6.99.4guppy_6.99.3guppy/6.99.4guppy/6.99.36.99.46.99.3
Implements a new bluealsa plugin to the HAL manager, reacting to the changes of the available transports. This plugin is linked with the new bluealsa.so shared library. New transports (SCO & A2DP) result in softmixer invocations of the "attach" verb, that creates the new capture (eg, A2DP capture from bluealsa ioplug PCM, SCO microphone capture), playbacks (SCO playback to a softmixer zone, and SCO output to bluealsa iogplug PCM). When a transport disappears, the hal manager calls the transaction deletion verb that will tell the softmixer to remove the created streams and associated objects. Change-Id: I36037a4f14ef7fee38070fc0df66c40b4ce46e8b Signed-off-by: Thierry Bultel <thierry.bultel@iot.bzh>
Diffstat (limited to 'plugins/lib/bluetooth')
-rw-r--r--plugins/lib/bluetooth/CMakeLists.txt47
-rw-r--r--plugins/lib/bluetooth/hal-bt-cb.c209
-rw-r--r--plugins/lib/bluetooth/hal-bt-cb.h40
-rw-r--r--plugins/lib/bluetooth/hal-bt-data.c277
-rw-r--r--plugins/lib/bluetooth/hal-bt-data.h64
-rw-r--r--plugins/lib/bluetooth/hal-bt-mixer-link.c80
-rw-r--r--plugins/lib/bluetooth/hal-bt-mixer-link.h65
-rw-r--r--plugins/lib/bluetooth/hal-bt.c437
-rw-r--r--plugins/lib/bluetooth/hal-bt.h34
9 files changed, 0 insertions, 1253 deletions
diff --git a/plugins/lib/bluetooth/CMakeLists.txt b/plugins/lib/bluetooth/CMakeLists.txt
deleted file mode 100644
index ae9f5ab..0000000
--- a/plugins/lib/bluetooth/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-###########################################################################
-# Copyright 2015, 2016, 2017, 2018 IoT.bzh
-#
-# author: Jonathan Aillet <jonathan.aillet@iot.bzh>
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-###########################################################################
-
-PROJECT_TARGET_ADD(hal-bt)
-
- # Define targets
- ADD_LIBRARY(${TARGET_NAME} MODULE
- hal-bt.c
- hal-bt-cb.c
- hal-bt-data.c
- hal-bt-mixer-link.c
- )
-
- # Alsa Plugin properties
- SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
- LABELS "PLUGIN"
- PREFIX ""
- SUFFIX ".ctlso"
- OUTPUT_NAME ${TARGET_NAME}
- )
-
- # Library dependencies (include updates automatically)
- TARGET_LINK_LIBRARIES(${TARGET_NAME}
- afb-helpers
- ctl-utilities
- ${link_libraries}
- )
-
- target_include_directories(${TARGET_NAME}
- PRIVATE "${CMAKE_SOURCE_DIR}/app-controller/ctl-lib"
- PRIVATE "${CMAKE_SOURCE_DIR}/4a-hal/4a-hal-utilities"
- )
diff --git a/plugins/lib/bluetooth/hal-bt-cb.c b/plugins/lib/bluetooth/hal-bt-cb.c
deleted file mode 100644
index 0638d50..0000000
--- a/plugins/lib/bluetooth/hal-bt-cb.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <wrap-json.h>
-
-#include <ctl-config.h>
-
-#include "hal-bt-data.h"
-#include "hal-bt-mixer-link.h"
-
-/*******************************************************************************
- * HAL Bluetooth plugin verbs functions *
- ******************************************************************************/
-
-void HalBtGetStreamingStatus(AFB_ReqT request)
-{
- struct HalBtPluginData *localHalBtPluginData;
-
- if(! (localHalBtPluginData = (struct HalBtPluginData *) AFB_ReqVCBData(request))) {
- AFB_ReqFail(request, "bt_plugin_data", "Can't get bluetooth plugin data");
- return;
- }
-
- AFB_ReqSuccess(request, json_object_new_string(localHalBtPluginData->btStreamEnabled ? "enabled" : "disabled"), "Bluetooth streaming status");
-}
-
-void HalBtSetStreamingStatus(AFB_ReqT request)
-{
- unsigned int requestedBtStreamingStatus;
-
- struct HalBtPluginData *localHalBtPluginData;
-
- json_object *requestJson;
-
- AFB_ApiT apiHandle;
-
- if(! (localHalBtPluginData = (struct HalBtPluginData *) AFB_ReqVCBData(request))) {
- AFB_ReqFail(request, "bt_plugin_data", "Can't get bluetooth plugin data");
- return;
- }
-
- if(! (requestJson = AFB_ReqJson(request))) {
- AFB_ReqFail(request, "request_json", "Can't get request json");
- return;
- }
-
- if(! (apiHandle = (AFB_ApiT ) AFB_ReqGetApi(request))) {
- AFB_ReqFail(request, "api_handle", "Can't get current hal controller api handle");
- return;
- }
-
- if(wrap_json_unpack(requestJson, "{s:b}", "status", &requestedBtStreamingStatus)) {
- AFB_ReqFail(request, "requested_status", "Can't get requested bluetooth streaming status");
- return;
- }
-
- localHalBtPluginData->btStreamEnabled = requestedBtStreamingStatus;
-
- if(HalBtMixerLinkSetBtStreamingSettings(apiHandle,
- localHalBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName,
- localHalBtPluginData->btStreamEnabled,
- localHalBtPluginData->selectedBtDevice ? localHalBtPluginData->selectedBtDevice->hci : NULL,
- localHalBtPluginData->selectedBtDevice ? localHalBtPluginData->selectedBtDevice->address : NULL)) {
- AFB_ApiError(apiHandle,
- "Couldn't set bluetooth streaming settings during call to verb '%s' of api '%s'",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- localHalBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName);
- AFB_ReqFail(request, "requested_device_to_select", "Error happened during set of streamed bt device");
- return;
- }
-
- AFB_ReqSuccess(request, NULL, "Bluetooth streaming status successfully set");
-}
-
-void HalBtGetA2DPBluetoothDevices(AFB_ReqT request)
-{
- struct HalBtPluginData *localHalBtPluginData;
- struct HalBtDeviceData *currentBtDeviceData;
-
- json_object *requestAnswer, *currentBtDeviceObjectJ;
-
- if(! (localHalBtPluginData = (struct HalBtPluginData *) AFB_ReqVCBData(request))) {
- AFB_ReqFail(request, "bt_plugin_data", "Can't get bluetooth plugin data");
- return;
- }
-
- if(! (currentBtDeviceData = localHalBtPluginData->first)) {
- AFB_ReqSuccess(request, NULL, "No A2DP bluetooth device connected");
- return;
- }
-
- requestAnswer = json_object_new_array();
- if(! requestAnswer) {
- AFB_ReqFail(request, "json_answer", "Can't generate json answer");
- return;
- }
-
- while(currentBtDeviceData) {
- wrap_json_pack(&currentBtDeviceObjectJ,
- "{s:s s:s s:s}",
- "Interface", currentBtDeviceData->hci,
- "Name", currentBtDeviceData->name,
- "Address", currentBtDeviceData->address);
- json_object_array_add(requestAnswer, currentBtDeviceObjectJ);
-
- currentBtDeviceData = currentBtDeviceData->next;
- }
-
- AFB_ReqSuccess(request, requestAnswer, "Connected A2DP bluetooth devices list");
-}
-
-void HalBtGetSelectedA2DPBluetoothDevice(AFB_ReqT request)
-{
- struct HalBtPluginData *localHalBtPluginData;
-
- json_object *selectedBtDeviceObject;
-
- if(! (localHalBtPluginData = (struct HalBtPluginData *) AFB_ReqVCBData(request))) {
- AFB_ReqFail(request, "bt_plugin_data", "Can't get bluetooth plugin data");
- return;
- }
-
- if(! localHalBtPluginData->selectedBtDevice) {
- AFB_ReqSuccess(request, NULL, "No bluetooth device selected");
- return;
- }
-
- wrap_json_pack(&selectedBtDeviceObject,
- "{s:s s:s s:s}",
- "Interface", localHalBtPluginData->selectedBtDevice->hci,
- "Name", localHalBtPluginData->selectedBtDevice->name,
- "Address", localHalBtPluginData->selectedBtDevice->address);
-
- AFB_ReqSuccess(request, selectedBtDeviceObject, "Selected Bluetooth device");
-}
-
-void HalBtSetSelectedA2DPBluetoothDevice(AFB_ReqT request)
-{
- char *requestedBtDeviceToSelect;
-
- struct HalBtPluginData *localHalBtPluginData;
- struct HalBtDeviceData *selectedBtDeviceData;
-
- json_object *requestJson;
-
- AFB_ApiT apiHandle;
-
- if(! (localHalBtPluginData = (struct HalBtPluginData *) AFB_ReqVCBData(request))) {
- AFB_ReqFail(request, "bt_plugin_data", "Can't get bluetooth plugin data");
- return;
- }
-
- if(! (requestJson = AFB_ReqJson(request))) {
- AFB_ReqFail(request, "request_json", "Can't get request json");
- return;
- }
-
- if(! (apiHandle = (AFB_ApiT ) AFB_ReqGetApi(request))) {
- AFB_ReqFail(request, "api_handle", "Can't get current hal controller api handle");
- return;
- }
-
- if(wrap_json_unpack(requestJson, "{s:s}", "Address", &requestedBtDeviceToSelect)) {
- AFB_ReqFail(request, "requested_device_to_select", "Can't get requested bluetooth device to select");
- return;
- }
-
- if(! (selectedBtDeviceData = HalBtDataSearchBtDeviceByAddress(&localHalBtPluginData->first, requestedBtDeviceToSelect))) {
- AFB_ReqFail(request, "requested_device_to_select", "Requested A2DP bluetooth device to select is not currently connected");
- return;
- }
-
- localHalBtPluginData->selectedBtDevice = selectedBtDeviceData;
-
- if(HalBtMixerLinkSetBtStreamingSettings(apiHandle,
- localHalBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName,
- localHalBtPluginData->btStreamEnabled,
- localHalBtPluginData->selectedBtDevice->hci,
- localHalBtPluginData->selectedBtDevice->address)) {
- AFB_ApiError(apiHandle,
- "Couldn't set bluetooth streaming settings during call to verb '%s' of api '%s'",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- localHalBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName);
- AFB_ReqFail(request, "requested_device_to_select", "Error happened during set of streamed bt device");
- return;
- }
-
- AFB_ReqSuccess(request, NULL, "Selected bluetooth device successfully set");
-} \ No newline at end of file
diff --git a/plugins/lib/bluetooth/hal-bt-cb.h b/plugins/lib/bluetooth/hal-bt-cb.h
deleted file mode 100644
index f0f1052..0000000
--- a/plugins/lib/bluetooth/hal-bt-cb.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _HAL_BT_CB_INCLUDE_
-#define _HAL_BT_CB_INCLUDE_
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <ctl-config.h>
-
-#define HAL_BT_GET_STREAMING_STATUS_VERB "get_bt_streaming_status"
-#define HAL_BT_SET_STREAMING_STATUS_VERB "set_bt_streaming_status"
-#define HAL_BT_GET_CONNECTED_A2DP_DEVICES_VERB "get_connected_bt_a2dp_devices"
-#define HAL_BT_GET_SELECTED_A2DP_DEVICE_VERB "get_selected_bt_a2dp_device"
-#define HAL_BT_SET_SELECTED_A2DP_DEVICE_VERB "set_selected_bt_a2dp_device"
-
-// HAL Bluetooth plugin verbs functions
-void HalBtGetStreamingStatus(AFB_ReqT request);
-void HalBtSetStreamingStatus(AFB_ReqT request);
-void HalBtGetA2DPBluetoothDevices(AFB_ReqT request);
-void HalBtGetSelectedA2DPBluetoothDevice(AFB_ReqT request);
-void HalBtSetSelectedA2DPBluetoothDevice(AFB_ReqT request);
-
-#endif /* _HAL_BT_CB_INCLUDE_ */ \ No newline at end of file
diff --git a/plugins/lib/bluetooth/hal-bt-data.c b/plugins/lib/bluetooth/hal-bt-data.c
deleted file mode 100644
index f3cb0e4..0000000
--- a/plugins/lib/bluetooth/hal-bt-data.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <wrap-json.h>
-
-#include "hal-bt-data.h"
-
-/*******************************************************************************
- * Bt device data handling functions *
- ******************************************************************************/
-
-int HalBtDataRemoveSelectedBtDeviceFromList(struct HalBtDeviceData **firstBtDeviceData, struct HalBtDeviceData *btDeviceDataToRemove)
-{
- struct HalBtDeviceData *currentBtDevice, *matchingBtDevice;
-
- if(! firstBtDeviceData || ! btDeviceDataToRemove)
- return -1;
-
- currentBtDevice = *firstBtDeviceData;
-
- if(currentBtDevice == btDeviceDataToRemove) {
- *firstBtDeviceData = currentBtDevice->next;
- matchingBtDevice = currentBtDevice;
- }
- else {
- while(currentBtDevice && currentBtDevice->next != btDeviceDataToRemove)
- currentBtDevice = currentBtDevice->next;
-
- if(currentBtDevice) {
- matchingBtDevice = currentBtDevice->next;
- currentBtDevice->next = currentBtDevice->next->next;
- }
- else {
- return -2;
- }
- }
-
- free(matchingBtDevice->hci);
- free(matchingBtDevice->uid);
- free(matchingBtDevice->name);
- free(matchingBtDevice->address);
-
- free(matchingBtDevice);
-
- return 0;
-}
-
-struct HalBtDeviceData *HalBtDataAddBtDeviceToBtDeviceList(struct HalBtDeviceData **firstBtDeviceData, json_object *currentSingleBtDeviceDataJ)
-{
- char *currentBtDeviceName, *currentBtDeviceAddress, *currentBtDevicePath, *currentBtDeviceHci;
-
- struct HalBtDeviceData *currentBtDeviceData;
-
- if(! firstBtDeviceData || ! currentSingleBtDeviceDataJ)
- return NULL;
-
- currentBtDeviceData = *firstBtDeviceData;
-
- if(! currentBtDeviceData) {
- currentBtDeviceData = (struct HalBtDeviceData *) calloc(1, sizeof(struct HalBtDeviceData));
- if(! currentBtDeviceData)
- return NULL;
-
- *firstBtDeviceData = currentBtDeviceData;
- }
- else {
- while(currentBtDeviceData->next)
- currentBtDeviceData = currentBtDeviceData->next;
-
- currentBtDeviceData->next = calloc(1, sizeof(struct HalBtDeviceData));
- if(! currentBtDeviceData)
- return NULL;
-
- currentBtDeviceData = currentBtDeviceData->next;
- }
-
- if(wrap_json_unpack(currentSingleBtDeviceDataJ,
- "{s:s s:s s:s}",
- "Name", &currentBtDeviceName,
- "Address", &currentBtDeviceAddress,
- "Path", &currentBtDevicePath)) {
- HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData);
- return NULL;
- }
-
- if(asprintf(&currentBtDeviceData->uid, "BT#%s", currentBtDeviceAddress) == -1) {
- HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData);
- return NULL;
- }
-
- currentBtDeviceHci = strtok(currentBtDevicePath, "/");
- while(currentBtDeviceHci && strncmp(currentBtDeviceHci, "hci", 3))
- currentBtDeviceHci = strtok(NULL, "/");
-
- if((! currentBtDeviceHci) || (! (currentBtDeviceData->hci = strdup(currentBtDeviceHci)))) {
- HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData);
- return NULL;
- }
-
- if(! (currentBtDeviceData->name = strdup(currentBtDeviceName))) {
- HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData);
- return NULL;
- }
-
- if(! (currentBtDeviceData->address = strdup(currentBtDeviceAddress))) {
- HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData);
- return NULL;
- }
-
- return currentBtDeviceData;
-}
-
-int HalBtDataGetNumberOfBtDeviceInList(struct HalBtDeviceData **firstBtDeviceData)
-{
- unsigned int btDeviceNb = 0;
-
- struct HalBtDeviceData *currentBtDeviceData;
-
- if(! firstBtDeviceData)
- return -1;
-
- currentBtDeviceData = *firstBtDeviceData;
-
- while(currentBtDeviceData) {
- currentBtDeviceData = currentBtDeviceData->next;
- btDeviceNb++;
- }
-
- return btDeviceNb;
-}
-
-struct HalBtDeviceData *HalBtDataSearchBtDeviceByAddress(struct HalBtDeviceData **firstBtDeviceData, char *btAddress)
-{
- struct HalBtDeviceData *currentBtDevice;
-
- if(! firstBtDeviceData || ! btAddress)
- return NULL;
-
- currentBtDevice = *firstBtDeviceData;
-
- while(currentBtDevice) {
- if(! strcmp(btAddress, currentBtDevice->address))
- return currentBtDevice;
-
- currentBtDevice = currentBtDevice->next;
- }
-
- return NULL;
-}
-
-int HalBtDataHandleReceivedSingleBtDeviceData(struct HalBtPluginData *halBtPluginData, json_object *currentSingleBtDeviceDataJ)
-{
- int btProfilesCount;
-
- unsigned int idx = 0, currentBtDeviceIsConnected, currentBtDeviceIsA2DP;
-
- char *currentBtDeviceAddress, *currentBtDeviceIsConnectedString, *currentBtDeviceIsAVPConnectedString;
-
- json_object *currentBtAllProfilesJ = NULL, *currentBtCurrentProfileJ;
-
- struct HalBtDeviceData *currentBtDevice;
- if(! halBtPluginData || ! currentSingleBtDeviceDataJ)
- return -1;
-
- if(wrap_json_unpack(currentSingleBtDeviceDataJ,
- "{s:s s:s s:s s?:o}",
- "Address", &currentBtDeviceAddress,
- "Connected", &currentBtDeviceIsConnectedString,
- "AVPConnected", &currentBtDeviceIsAVPConnectedString,
- "UUIDs", &currentBtAllProfilesJ)) {
- return -2;
- }
-
- if(! currentBtAllProfilesJ) {
- AFB_ApiInfo(halBtPluginData->currentHalApiHandle, "Bluetooth device (address = %s) has no specified profiles, ignore it", currentBtDeviceAddress);
- return 0;
- }
-
- if(json_object_is_type(currentBtAllProfilesJ, json_type_array)) {
- btProfilesCount = json_object_array_length(currentBtAllProfilesJ);
-
- while(idx < btProfilesCount) {
- currentBtCurrentProfileJ = json_object_array_get_idx(currentBtAllProfilesJ, idx);
-
- if(json_object_is_type(currentBtCurrentProfileJ, json_type_string) &&
- ! strncasecmp(json_object_get_string(currentBtCurrentProfileJ), A2DP_AUDIOSOURCE_UUID, sizeof(A2DP_AUDIOSOURCE_UUID))) {
- currentBtDeviceIsA2DP = 1;
- break;
- }
-
- idx++;
- }
- }
- else if(json_object_is_type(currentBtAllProfilesJ, json_type_string) &&
- ! strncasecmp(json_object_get_string(currentBtAllProfilesJ), A2DP_AUDIOSOURCE_UUID, sizeof(A2DP_AUDIOSOURCE_UUID))) {
- currentBtDeviceIsA2DP = 1;
- }
-
- if(! currentBtDeviceIsA2DP)
- return 0;
-
- currentBtDeviceIsConnected = ((! strncmp(currentBtDeviceIsConnectedString, "True", strlen(currentBtDeviceIsConnectedString))) &&
- (! strncmp(currentBtDeviceIsAVPConnectedString, "True", strlen(currentBtDeviceIsAVPConnectedString))));
-
- currentBtDevice = HalBtDataSearchBtDeviceByAddress(&halBtPluginData->first, currentBtDeviceAddress);
-
- if(currentBtDevice && ! currentBtDeviceIsConnected) {
- if(HalBtDataRemoveSelectedBtDeviceFromList(&halBtPluginData->first, currentBtDevice))
- return -3;
-
- AFB_ApiInfo(halBtPluginData->currentHalApiHandle, "Bluetooth device (address = %s) successfully removed from list", currentBtDeviceAddress);
-
- if(halBtPluginData->selectedBtDevice == currentBtDevice) {
- halBtPluginData->selectedBtDevice = halBtPluginData->first;
- AFB_ApiDebug(halBtPluginData->currentHalApiHandle,
- "Bluetooth selected device changed to '%s'",
- halBtPluginData->selectedBtDevice ? halBtPluginData->selectedBtDevice->address : "none");
- }
- }
- else if(! currentBtDevice && currentBtDeviceIsConnected) {
- if(! HalBtDataAddBtDeviceToBtDeviceList(&halBtPluginData->first, currentSingleBtDeviceDataJ))
- return -4;
-
- AFB_ApiInfo(halBtPluginData->currentHalApiHandle, "Bluetooth device (address = %s) successfully added to list", currentBtDeviceAddress);
-
- if(! halBtPluginData->selectedBtDevice) {
- halBtPluginData->selectedBtDevice = halBtPluginData->first;
- AFB_ApiDebug(halBtPluginData->currentHalApiHandle,
- "Bluetooth selected device changed to '%s'",
- halBtPluginData->selectedBtDevice ? halBtPluginData->selectedBtDevice->address : "none");
- }
- }
-
- return 0;
-}
-
-int HalBtDataHandleReceivedMutlipleBtDeviceData(struct HalBtPluginData *halBtPluginData, json_object *currentMultipleBtDeviceDataJ)
-{
- int err = 0;
- size_t idx, btDeviceNumber;
-
- if(! halBtPluginData || ! currentMultipleBtDeviceDataJ)
- return -1;
-
- if(! json_object_is_type(currentMultipleBtDeviceDataJ, json_type_array))
- return -2;
-
- btDeviceNumber = json_object_array_length(currentMultipleBtDeviceDataJ);
-
- for(idx = 0; idx < btDeviceNumber; idx++) {
- if((err = HalBtDataHandleReceivedSingleBtDeviceData(halBtPluginData, json_object_array_get_idx(currentMultipleBtDeviceDataJ, (unsigned int) idx)))) {
- return ((int) idx * err * 10);
- }
- }
-
- return 0;
-}
diff --git a/plugins/lib/bluetooth/hal-bt-data.h b/plugins/lib/bluetooth/hal-bt-data.h
deleted file mode 100644
index 36e0430..0000000
--- a/plugins/lib/bluetooth/hal-bt-data.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _HAL_BT_DATA_INCLUDE_
-#define _HAL_BT_DATA_INCLUDE_
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <json-c/json.h>
-
-#include <4a-hal-utilities-data.h>
-
-#define A2DP_AUDIOSOURCE_UUID "0000110a-0000-1000-8000-00805f9b34fb"
-#define HSP_GATEAWAY_UUID "00001112-0000-1000-8000-00805f9b34fb"
-#define HFP_GATEAWAY_UUID "0000111f-0000-1000-8000-00805f9b34fb"
-
-// Structure to store bluetooth device data
-struct HalBtDeviceData {
- char *uid;
-
- char *hci;
- char *name;
- char *address;
-
- struct HalBtDeviceData *next;
-};
-
-// Structure to store hal bluetooth plugin data
-struct HalBtPluginData {
- unsigned int halBtPluginEnabled;
-
- AFB_ApiT currentHalApiHandle;
-
- struct SpecificHalData *currentHalData;
-
- unsigned int btStreamEnabled;
-
- struct HalBtDeviceData *selectedBtDevice;
- struct HalBtDeviceData *first;
-};
-
-// Exported verbs for 'struct HalBtDeviceData' list (available in 'struct HalBtPluginData') handling
-int HalBtDataGetNumberOfBtDeviceInList(struct HalBtDeviceData **firstBtDeviceData);
-struct HalBtDeviceData *HalBtDataSearchBtDeviceByAddress(struct HalBtDeviceData **firstBtDeviceData, char *btAddress);
-int HalBtDataHandleReceivedSingleBtDeviceData(struct HalBtPluginData *halBtPluginData, json_object *currentSingleBtDeviceDataJ);
-int HalBtDataHandleReceivedMutlipleBtDeviceData(struct HalBtPluginData *halBtPluginData, json_object *currentMultipleBtDeviceDataJ);
-
-#endif /* _HAL_BT_DATA_INCLUDE_ */ \ No newline at end of file
diff --git a/plugins/lib/bluetooth/hal-bt-mixer-link.c b/plugins/lib/bluetooth/hal-bt-mixer-link.c
deleted file mode 100644
index abbd1b7..0000000
--- a/plugins/lib/bluetooth/hal-bt-mixer-link.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <wrap-json.h>
-
-#include <ctl-config.h>
-
-#include "hal-bt-mixer-link.h"
-
-/*******************************************************************************
- * HAL controllers handle mixer bt calls functions *
- ******************************************************************************/
-
-int HalBtMixerLinkSetBtStreamingSettings(AFB_ApiT apiHandle, char *mixerApiName, unsigned int btStreamStatus, char *hci, char *btAddress)
-{
- char *returnedError = NULL;
-
- json_object *toSendJ, *returnedJ;
-
- if(! apiHandle || ! mixerApiName)
- return -1;
-
- if(! btStreamStatus) {
- AFB_ApiDebug(apiHandle, "Will try to disable bluetooth streamed device");
- toSendJ = NULL;
- }
- else if(btStreamStatus == 1 && hci && btAddress) {
- AFB_ApiDebug(apiHandle, "Will try to change bluetooth streamed device to hci='%s' address='%s'", hci, btAddress);
- wrap_json_pack(&toSendJ, "{s:s s:s s:s}", "interface", hci, "device", btAddress, "profile", "a2dp");
- }
- else {
- return -2;
- }
-
- if(AFB_ServiceSync(apiHandle, mixerApiName, MIXER_SET_STREAMED_BT_DEVICE_VERB, toSendJ, &returnedJ)) {
- AFB_ApiError(apiHandle,
- "Error during call to verb %s of %s api",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- mixerApiName);
- return -3;
- }
- else if(! wrap_json_unpack(returnedJ, "{s:{s:s}}", "request", "info", &returnedError)) {
- AFB_ApiError(apiHandle,
- "Error '%s' happened during set bluetooth streaming settings during call to verb '%s' of api '%s'",
- returnedError ? returnedError : "no_error_string",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- mixerApiName);
- json_object_put(returnedJ);
- return -4;
- }
-
- json_object_put(returnedJ);
-
- if(btStreamStatus)
- AFB_ApiInfo(apiHandle, "Bluetooth streamed device changed to hci='%s' address='%s'", hci, btAddress);
- else
- AFB_ApiInfo(apiHandle, "Bluetooth streamed device disbaled");
-
- return 0;
-} \ No newline at end of file
diff --git a/plugins/lib/bluetooth/hal-bt-mixer-link.h b/plugins/lib/bluetooth/hal-bt-mixer-link.h
deleted file mode 100644
index 0550339..0000000
--- a/plugins/lib/bluetooth/hal-bt-mixer-link.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _HAL_BT_MIXER_LINK_INCLUDE_
-#define _HAL_BT_MIXER_LINK_INCLUDE_
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <ctl-config.h>
-
-#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\" : 44100,\
- \"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);
-
-#endif /* _HAL_BT_MIXER_LINK_INCLUDE_ */
diff --git a/plugins/lib/bluetooth/hal-bt.c b/plugins/lib/bluetooth/hal-bt.c
deleted file mode 100644
index f270593..0000000
--- a/plugins/lib/bluetooth/hal-bt.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <wrap-json.h>
-
-#include <ctl-config.h>
-
-#include "hal-bt.h"
-#include "hal-bt-cb.h"
-#include "hal-bt-data.h"
-#include "hal-bt-mixer-link.h"
-
-CTLP_CAPI_REGISTER(HAL_BT_PLUGIN_NAME)
-
-// Call at initialisation time
-CTLP_ONLOAD(plugin, callbacks)
-{
- struct HalBtPluginData *currentBtPluginData;
-
- AFB_ApiInfo(plugin->api, "%s Plugin Registering: uid='%s' 'info='%s'", HAL_BT_PLUGIN_NAME, plugin->uid, plugin->info);
-
- currentBtPluginData = calloc(1, sizeof(struct HalBtPluginData));
- if(! currentBtPluginData) {
- AFB_ApiError(plugin->api, "An error happenned during allocation of %s plugin data structure ", HAL_BT_PLUGIN_NAME);
- return -1;
- }
-
- setPluginContext(plugin, (void *) currentBtPluginData);
-
- currentBtPluginData->currentHalApiHandle = plugin->api;
-
- AFB_ApiNotice(plugin->api, "%s Plugin Registered correctly: uid='%s' 'info='%s'", HAL_BT_PLUGIN_NAME, plugin->uid, plugin->info);
-
- return 0;
-}
-
-CTLP_INIT(plugin, callbacks)
-{
- int btChannelsNumber;
-
- unsigned int idx;
-
- char *btStreamZone, *returnedInfo;
-
- CtlConfigT *ctrlConfig;
-
- struct HalBtPluginData *currentBtPluginData;
-
- json_object *actionsToAdd, *returnedJ, *halMixerJ, *halOrigCaptureJ, *halNewCaptureJ, *halOrigStreamJ, *halNewStreamJ, *btCaptureJ, *btCaptureParamsJ, *btStreamJ;
-
- AFB_ApiInfo(plugin->api, "Plugin initialization of %s plugin", HAL_BT_PLUGIN_NAME);
-
- if(AFB_RequireApi(plugin->api, BT_MANAGER_API, 1)) {
- AFB_ApiWarning(plugin->api, "Didn't succeed to require %s api, bluetooth is disable because not reachable", BT_MANAGER_API);
- return 0;
- }
-
- if(! (currentBtPluginData = (struct HalBtPluginData *) getPluginContext(plugin))) {
- AFB_ApiError(plugin->api, "Can't get current %s plugin data", HAL_BT_PLUGIN_NAME);
- return -1;
- }
-
- if(! (ctrlConfig = (CtlConfigT *) AFB_ApiGetUserData(plugin->api))) {
- AFB_ApiError(plugin->api, "Can't get current hal controller config");
- return -2;
- }
-
- if(! (currentBtPluginData->currentHalData = getExternalData(ctrlConfig))) {
- AFB_ApiError(plugin->api, "Can't get current hal controller data");
- return -3;
- }
-
- if(currentBtPluginData->currentHalData->status != HAL_STATUS_AVAILABLE) {
- AFB_ApiWarning(plugin->api, "Controller initialization of %s plugin cannot be done because hal is not ready to be used", HAL_BT_PLUGIN_NAME);
- return 0;
- }
-
- if((! currentBtPluginData->currentHalData->ctlHalSpecificData) ||
- (! (halMixerJ = currentBtPluginData->currentHalData->ctlHalSpecificData->halMixerJ))) {
- AFB_ApiError(plugin->api, "Can't get current hal mixer json section");
- return -4;
- }
-
- 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)))) {
- AFB_ApiWarning(plugin->api,
- "No bluetooth receiver detected when calling verb '%s' of '%s' api, bluetooth is disable because not reachable",
- BT_MANAGER_GET_POWER_INFO,
- BT_MANAGER_API);
- return 0;
- }
- else {
- AFB_ApiError(plugin->api,
- "Error during call to verb '%s' of '%s' api (%s)",
- BT_MANAGER_GET_POWER_INFO,
- BT_MANAGER_API,
- json_object_get_string(returnedJ));
- return -5;
- }
- }
-
- 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 %s plugin parameters from json ('%s')", HAL_BT_PLUGIN_NAME, json_object_get_string(plugin->paramsJ));
- return -6;
- }
-
- wrap_json_pack(&actionsToAdd, "{s:s s:s}",
- "uid", "Bluetooth-Manager/device_updated",
- "action", "plugin://hal-bt#events");
-
- idx = 0;
- while(ctrlConfig->sections[idx].key && strcasecmp(ctrlConfig->sections[idx].key, "events"))
- idx++;
-
- 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 -7;
- }
-
- if(AddActionsToSection(plugin->api, &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 -8;
- }
-
- wrap_json_pack(&actionsToAdd, "{s:s s:s s:s}",
- "uid", "init-bt-plugin",
- "info", "Init Bluetooth hal plugin",
- "action", "plugin://hal-bt#init");
-
- idx = 0;
- while(ctrlConfig->sections[idx].key && strcasecmp(ctrlConfig->sections[idx].key, "onload"))
- idx++;
-
- 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 -9;
- }
-
- if(AddActionsToSection(plugin->api, &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 -10;
- }
-
- 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 -11;
- }
-
- 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 -12;
- }
-
- currentBtPluginData->halBtPluginEnabled = 1;
-
- AFB_ApiNotice(plugin->api, "Plugin initialization of %s plugin correctly done", HAL_BT_PLUGIN_NAME);
-
- return 0;
-}
-
-// Call at contoller onload time
-CTLP_CAPI(init, source, argsJ, queryJ)
-{
- int err;
-
- char *returnedInfo;
-
- struct HalBtPluginData *currentBtPluginData;
-
- json_object *toSendJ, *returnedJ, *returnedBtList = NULL;
-
- if(! (currentBtPluginData = (struct HalBtPluginData *) getPluginContext(source->plugin))) {
- AFB_ApiError(source->api, "Can't get current %s plugin data", HAL_BT_PLUGIN_NAME);
- return -1;
- }
-
- if(! currentBtPluginData->halBtPluginEnabled) {
- AFB_ApiWarning(source->api, "Controller onload initialization of %s plugin cannot be done because bluetooth is not reachable", HAL_BT_PLUGIN_NAME);
- return 0;
- }
-
- AFB_ApiInfo(source->api, "Controller onload initialization of %s plugin", HAL_BT_PLUGIN_NAME);
-
- // Loading hal BT plugin specific verbs
- if(AFB_ApiAddVerb(source->api,
- HAL_BT_GET_STREAMING_STATUS_VERB,
- "Get Bluetooth streaming status",
- HalBtGetStreamingStatus,
- (void *) currentBtPluginData,
- NULL,
- 0,
- 0)) {
- AFB_ApiError(source->api, "Error while creating verb for bluetooth plugin : '%s'", HAL_BT_GET_STREAMING_STATUS_VERB);
- return -2;
- }
-
- if(AFB_ApiAddVerb(source->api,
- HAL_BT_SET_STREAMING_STATUS_VERB,
- "Set Bluetooth streaming status",
- HalBtSetStreamingStatus,
- (void *) currentBtPluginData,
- NULL,
- 0,
- 0)) {
- AFB_ApiError(source->api, "Error while creating verb for bluetooth plugin : '%s'", HAL_BT_SET_STREAMING_STATUS_VERB);
- return -3;
- }
-
- if(AFB_ApiAddVerb(source->api,
- HAL_BT_GET_CONNECTED_A2DP_DEVICES_VERB,
- "Get connected Bluetooth A2DP devices list",
- HalBtGetA2DPBluetoothDevices,
- (void *) currentBtPluginData,
- NULL,
- 0,
- 0)) {
- AFB_ApiError(source->api, "Error while creating verb for bluetooth plugin : '%s'", HAL_BT_GET_CONNECTED_A2DP_DEVICES_VERB);
- return -4;
- }
-
- if(AFB_ApiAddVerb(source->api,
- HAL_BT_GET_SELECTED_A2DP_DEVICE_VERB,
- "Get selected Bluetooth A2DP device",
- HalBtGetSelectedA2DPBluetoothDevice,
- (void *) currentBtPluginData,
- NULL,
- 0,
- 0)) {
- AFB_ApiError(source->api, "Error while creating verb for bluetooth plugin : '%s'", HAL_BT_GET_SELECTED_A2DP_DEVICE_VERB);
- return -5;
- }
-
- if(AFB_ApiAddVerb(source->api,
- HAL_BT_SET_SELECTED_A2DP_DEVICE_VERB,
- "Set selected Bluetooth A2DP device",
- HalBtSetSelectedA2DPBluetoothDevice,
- (void *) currentBtPluginData,
- NULL,
- 0,
- 0)) {
- AFB_ApiError(source->api, "Error while creating verb for bluetooth plugin : '%s'", HAL_BT_SET_SELECTED_A2DP_DEVICE_VERB);
- return -6;
- }
-
- // Register to Bluetooth manager
- wrap_json_pack(&toSendJ, "{s:s}", "value", BT_MANAGER_DEVICE_UPDATE_EVENT);
- if(AFB_ServiceSync(source->api, BT_MANAGER_API, BT_MANAGER_SUBSCRIBE_VERB, toSendJ, &returnedJ)) {
- AFB_ApiError(source->api,
- "Error during call to verb '%s' of '%s' api (%s)",
- BT_MANAGER_SUBSCRIBE_VERB,
- BT_MANAGER_API,
- json_object_get_string(returnedJ));
-
- return -7;
- }
- else if(! wrap_json_unpack(returnedJ, "{s:{s:s}}", "request", "info", &returnedInfo)) {
- AFB_ApiError(source->api,
- "Couldn't subscribe to event '%s' during call to verb '%s' of api '%s' (error '%s')",
- BT_MANAGER_DEVICE_UPDATE_EVENT,
- BT_MANAGER_SUBSCRIBE_VERB,
- BT_MANAGER_API,
- returnedInfo);
- json_object_put(returnedJ);
- return -7;
- }
- json_object_put(returnedJ);
-
- if(AFB_ServiceSync(source->api, BT_MANAGER_API, BT_MANAGER_GET_DEVICES_VERB, NULL, &returnedJ)) {
- if((! wrap_json_unpack(returnedJ, "{s:{s:s}}", "request", "info", &returnedInfo)) &&
- (! strncmp(returnedInfo, "No find devices", strlen(returnedInfo)))) {
- AFB_ApiInfo(source->api,
- "No bluetooth devices returned by call to verb '%s' of '%s' api",
- BT_MANAGER_GET_DEVICES_VERB,
- BT_MANAGER_API);
- }
- else {
- AFB_ApiError(source->api,
- "Error during call to verb '%s' of '%s' api (%s)",
- BT_MANAGER_GET_DEVICES_VERB,
- BT_MANAGER_API,
- json_object_get_string(returnedJ));
-
- return -8;
- }
- }
- else if(wrap_json_unpack(returnedJ, "{s:{s:o}}", "response", "list", &returnedBtList)) {
- AFB_ApiError(source->api,
- "Couldn't get bluetooth device list during call to verb '%s' of api '%s'",
- BT_MANAGER_GET_DEVICES_VERB,
- BT_MANAGER_API);
- json_object_put(returnedJ);
- return -8;
- }
-
- if((returnedBtList) && (err = HalBtDataHandleReceivedMutlipleBtDeviceData(currentBtPluginData, returnedBtList)))
- return (10 * err);
-
- json_object_put(returnedJ);
-
- if(currentBtPluginData->selectedBtDevice) {
- currentBtPluginData->btStreamEnabled = 1;
-
- AFB_ApiInfo(source->api, "Useable bluetooth device detected at initialization, will try to use it");
-
- if(HalBtMixerLinkSetBtStreamingSettings(source->api,
- currentBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName,
- currentBtPluginData->btStreamEnabled,
- currentBtPluginData->selectedBtDevice->hci,
- currentBtPluginData->selectedBtDevice->address)) {
- AFB_ApiError(source->api,
- "Couldn't set bluetooth streaming settings during call to verb '%s' of api '%s'",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- currentBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName);
- return -9;
- }
- }
-
- AFB_ApiNotice(source->api, "Controller onload initialization of %s plugin correctly done", HAL_BT_PLUGIN_NAME);
-
- return 0;
-}
-
-// This receive Hal bluetooth plugin events
-CTLP_CAPI(events, source, argsJ, queryJ)
-{
- struct HalBtPluginData *currentBtPluginData;
-
- struct HalBtDeviceData *previouslySelectedBtDevice;
-
- if(! (currentBtPluginData = (struct HalBtPluginData *) getPluginContext(source->plugin))) {
- AFB_ApiError(source->api, "Can't get current %s plugin data", HAL_BT_PLUGIN_NAME);
- return -1;
- }
-
- if(! currentBtPluginData->halBtPluginEnabled) {
- AFB_ApiWarning(source->api, "Bluetooth event received but cannot be handled because bluetooth is not reachable");
- return 0;
- }
-
- previouslySelectedBtDevice = currentBtPluginData->selectedBtDevice;
-
- if(HalBtDataHandleReceivedSingleBtDeviceData(currentBtPluginData, queryJ)) {
- AFB_ApiError(source->api, "Error while decoding bluetooth event received json (%s)", json_object_get_string(queryJ));
- return -2;
- }
-
- if(currentBtPluginData->selectedBtDevice == previouslySelectedBtDevice) {
- AFB_ApiDebug(source->api, "Bluetooth event received but device didn't change");
- return 0;
- }
-
- if(currentBtPluginData->selectedBtDevice)
- currentBtPluginData->btStreamEnabled = 1;
- else
- currentBtPluginData->btStreamEnabled = 0;
-
- if(HalBtMixerLinkSetBtStreamingSettings(source->api,
- currentBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName,
- currentBtPluginData->btStreamEnabled,
- currentBtPluginData->selectedBtDevice ? currentBtPluginData->selectedBtDevice->hci : NULL,
- currentBtPluginData->selectedBtDevice ? currentBtPluginData->selectedBtDevice->address : NULL)) {
- AFB_ApiError(source->api,
- "Couldn't set bluetooth streaming settings during call to verb '%s' of api '%s'",
- MIXER_SET_STREAMED_BT_DEVICE_VERB,
- currentBtPluginData->currentHalData->ctlHalSpecificData->mixerApiName);
- return -3;
- }
-
- return 0;
-} \ No newline at end of file
diff --git a/plugins/lib/bluetooth/hal-bt.h b/plugins/lib/bluetooth/hal-bt.h
deleted file mode 100644
index af5f6c3..0000000
--- a/plugins/lib/bluetooth/hal-bt.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 "IoT.bzh"
- * Author Jonathan Aillet <jonathan.aillet@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _HAL_BT_INCLUDE_
-#define _HAL_BT_INCLUDE_
-
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#define HAL_BT_PLUGIN_NAME "hal-bt"
-
-#define BT_MANAGER_API "Bluetooth-Manager"
-#define BT_MANAGER_GET_POWER_INFO "power"
-#define BT_MANAGER_SUBSCRIBE_VERB "subscribe"
-#define BT_MANAGER_GET_DEVICES_VERB "discovery_result"
-
-#define BT_MANAGER_DEVICE_UPDATE_EVENT "device_updated"
-
-#endif /* _HAL_BT_INCLUDE_ */ \ No newline at end of file