summaryrefslogtreecommitdiffstats
path: root/plugins/lib/bluetooth/hal-bt-cb.c
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/hal-bt-cb.c
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/hal-bt-cb.c')
-rw-r--r--plugins/lib/bluetooth/hal-bt-cb.c209
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(&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