diff options
author | Thierry Bultel <thierry.bultel@iot.bzh> | 2018-12-05 14:05:10 +0100 |
---|---|---|
committer | Thierry Bultel <thierry.bultel@iot.bzh> | 2018-12-20 16:55:46 +0000 |
commit | 01d55ed8cdd01ca4a7b391ca61c80084bd5a6f2f (patch) | |
tree | d73ce778a2177e82e07e9d31891a827467fbadd4 /plugins/lib/bluetooth | |
parent | dbe555be80dd10bb315b14bbebcb42f8b883e2c9 (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.txt | 47 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-cb.c | 209 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-cb.h | 40 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-data.c | 277 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-data.h | 64 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-mixer-link.c | 80 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-mixer-link.h | 65 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt.c | 437 | ||||
-rw-r--r-- | plugins/lib/bluetooth/hal-bt.h | 34 |
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(¤tBtDeviceObjectJ, - "{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", ¤tBtDeviceName, - "Address", ¤tBtDeviceAddress, - "Path", ¤tBtDevicePath)) { - HalBtDataRemoveSelectedBtDeviceFromList(firstBtDeviceData, currentBtDeviceData); - return NULL; - } - - if(asprintf(¤tBtDeviceData->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", ¤tBtDeviceAddress, - "Connected", ¤tBtDeviceIsConnectedString, - "AVPConnected", ¤tBtDeviceIsAVPConnectedString, - "UUIDs", ¤tBtAllProfilesJ)) { - 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 |