From 80deafbe1bfb87c3a5e9f547c9491afd210e736a Mon Sep 17 00:00:00 2001 From: Thierry Bultel Date: Fri, 31 Aug 2018 13:53:47 +0200 Subject: Added bluez sound playback support This adds sound playback for incoming sound from connected bluetooth devices. In this version, the softmixer relies on a modified bluez-alsa version (https://github.com/iotbzh/bluez-alsa), that provides an ioplug PCM bluezalsa connection proxy. The softmixer api has a new verb to dynamically set the device to listen to: afb-client-demo ws://localhost:1234/api?token=\uuid=123 smixer bluezalsa_dev '{"interface":"hci0", "device":"F6:32:15:2A:80:70", "profile":"a2dp"}' In this way it is possible to switch from a bluezalsa audio source to another without any further configuration. For now, only interface hci0 is supported. This commit also migrates the softmixer binding to API v3 Signed-off-by: Thierry Bultel --- plugins/alsa/alsa-bluez.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 plugins/alsa/alsa-bluez.c (limited to 'plugins/alsa/alsa-bluez.c') diff --git a/plugins/alsa/alsa-bluez.c b/plugins/alsa/alsa-bluez.c new file mode 100644 index 0000000..bd6bc99 --- /dev/null +++ b/plugins/alsa/alsa-bluez.c @@ -0,0 +1,67 @@ +/* + * Copyright(C) 2018 "IoT.bzh" + * Author Thierry Bultel + * + * 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. + * + * + */ + + +#include "alsa-bluez.h" + +#include +#include + +#define ALSA_BLUEZ_PROXY_LIB "/usr/lib/alsa-lib/libasound_module_pcm_bluealsa_proxy.so" +#define ALSA_BLUEZ_PROXY_SETDEVICE "bluealsa_proxy_set_remote_device" + +typedef int (*bluealsa_set_remote_device_ptr) (const char * interface, const char * device, const char * profile); + +static bluealsa_set_remote_device_ptr bluealsa_proxy_set_remote_device = NULL; + +void alsa_bluez_init() { + static bool initialized = false; + if (initialized) + goto failed; + + char errbuf[256]; + void * dl = snd_dlopen(ALSA_BLUEZ_PROXY_LIB, RTLD_NOW, errbuf, 256); + if (!dl) { + printf("Failed to open bluealsa proxy plugin\n"); + goto failed; + } + + void * func = snd_dlsym(dl, ALSA_BLUEZ_PROXY_SETDEVICE, SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION)); + if (!func) { + printf("Unable to find %s symbol\n", ALSA_BLUEZ_PROXY_SETDEVICE); + goto failed; + } + + bluealsa_proxy_set_remote_device = func; + initialized = true; + +failed: + return; +} + +int alsa_bluez_set_device(const char * interface, const char * device, const char * profile) { + if (!bluealsa_proxy_set_remote_device) + return -1; + + return bluealsa_proxy_set_remote_device(interface,device,profile); +} + + -- cgit 1.2.3-korg