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/hal-bt-cb.c | |
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/hal-bt-cb.c')
-rw-r--r-- | plugins/lib/bluetooth/hal-bt-cb.c | 209 |
1 files changed, 0 insertions, 209 deletions
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 |