diff options
author | Thierry Bultel <thierry.bultel@iot.bzh> | 2018-08-31 13:53:47 +0200 |
---|---|---|
committer | Thierry Bultel <thierry.bultel@iot.bzh> | 2018-08-31 13:53:47 +0200 |
commit | 80deafbe1bfb87c3a5e9f547c9491afd210e736a (patch) | |
tree | 67f83684cf67268dcb65d8062280f848057a74c2 /plugins/alsa/alsa-bluez.c | |
parent | ded8e37b50982677480869763f3573ff43858505 (diff) |
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 <thierry.bultel@iot.bzh>
Diffstat (limited to 'plugins/alsa/alsa-bluez.c')
-rw-r--r-- | plugins/alsa/alsa-bluez.c | 67 |
1 files changed, 67 insertions, 0 deletions
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 <thierry.bultel@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. + * + * + */ + + +#include "alsa-bluez.h" + +#include <stdbool.h> +#include <dlfcn.h> + +#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); +} + + |