2 This file is part of PulseAudio.
4 Copyright 2008-2009 Joao Paulo Rechi Vita
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29 #include <sys/ioctl.h>
30 #include <linux/sockios.h>
31 #include <arpa/inet.h>
33 #include <pulse/i18n.h>
34 #include <pulse/rtclock.h>
35 #include <pulse/sample.h>
36 #include <pulse/timeval.h>
37 #include <pulse/xmalloc.h>
39 #include <pulsecore/module.h>
40 #include <pulsecore/modargs.h>
41 #include <pulsecore/core-rtclock.h>
42 #include <pulsecore/core-util.h>
43 #include <pulsecore/core-error.h>
44 #include <pulsecore/socket-util.h>
45 #include <pulsecore/thread.h>
46 #include <pulsecore/thread-mq.h>
47 #include <pulsecore/rtpoll.h>
48 #include <pulsecore/time-smoother.h>
49 #include <pulsecore/namereg.h>
50 #include <pulsecore/dbus-shared.h>
52 #include "module-bluetooth-device-symdef.h"
56 #include "bluetooth-util.h"
58 #define MAX_BITPOOL 64
59 #define MIN_BITPOOL 2U
61 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
62 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
63 PA_MODULE_VERSION(PACKAGE_VERSION);
64 PA_MODULE_LOAD_ONCE(FALSE);
66 "name=<name for the card/sink/source, to be prefixed> "
67 "card_name=<name for the card> "
68 "card_properties=<properties for the card> "
69 "sink_name=<name for the sink> "
70 "sink_properties=<properties for the sink> "
71 "source_name=<name for the source> "
72 "source_properties=<properties for the source> "
73 "address=<address of the device> "
76 "channels=<number of channels> "
77 "path=<device object path>");
81 "sco_sink=<SCO over PCM sink name> "
82 "sco_source=<SCO over PCM source name>"
86 /* TODO: not close fd when entering suspend mode in a2dp */
88 static const char* const valid_modargs[] = {
109 sbc_capabilities_t sbc_capabilities;
110 sbc_t sbc; /* Codec data */
111 pa_bool_t sbc_initialized; /* Keep track if the encoder is initialized */
112 size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */
114 void* buffer; /* Codec transfer buffer */
115 size_t buffer_size; /* Size of the buffer */
117 uint16_t seq_num; /* Cumulative packet sequence */
121 pcm_capabilities_t pcm_capabilities;
124 pa_source *sco_source;
126 pa_hook_slot *sink_state_changed_slot;
127 pa_hook_slot *source_state_changed_slot;
143 pa_bluetooth_discovery *discovery;
145 pa_dbus_connection *connection;
151 pa_thread_mq thread_mq;
153 pa_rtpoll_item *rtpoll_item;
156 uint64_t read_index, write_index;
157 pa_usec_t started_at;
158 pa_smoother *read_smoother;
160 pa_memchunk write_memchunk;
162 pa_sample_spec sample_spec, requested_sample_spec;
170 struct a2dp_info a2dp;
173 enum profile profile;
177 int stream_write_type;
178 int service_write_type, service_read_type;
181 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
182 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
183 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
184 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
186 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
189 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
192 static int init_bt(struct userdata *u);
193 static int init_profile(struct userdata *u);
195 static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) {
199 pa_assert(u->service_fd >= 0);
201 pa_assert(msg->length > 0);
203 pa_log_debug("Sending %s -> %s",
204 pa_strnull(bt_audio_strtype(msg->type)),
205 pa_strnull(bt_audio_strname(msg->name)));
207 if ((r = pa_loop_write(u->service_fd, msg, msg->length, &u->service_write_type)) == (ssize_t) msg->length)
211 pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno));
213 pa_log_error("Short write()");
218 static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t room) {
222 pa_assert(u->service_fd >= 0);
224 pa_assert(room >= sizeof(*msg));
226 pa_log_debug("Trying to receive message from audio service...");
228 /* First, read the header */
229 if ((r = pa_loop_read(u->service_fd, msg, sizeof(*msg), &u->service_read_type)) != sizeof(*msg))
232 if (msg->length < sizeof(*msg)) {
233 pa_log_error("Invalid message size.");
237 if (msg->length > room) {
238 pa_log_error("Not enough room.");
242 /* Secondly, read the payload */
243 if (msg->length > sizeof(*msg)) {
245 size_t remains = msg->length - sizeof(*msg);
247 if ((r = pa_loop_read(u->service_fd,
248 (uint8_t*) msg + sizeof(*msg),
250 &u->service_read_type)) != (ssize_t) remains)
254 pa_log_debug("Received %s <- %s",
255 pa_strnull(bt_audio_strtype(msg->type)),
256 pa_strnull(bt_audio_strname(msg->name)));
263 pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno));
265 pa_log_error("Short read()");
270 static ssize_t service_expect(struct userdata*u, bt_audio_msg_header_t *rsp, size_t room, uint8_t expected_name, size_t expected_size) {
274 pa_assert(u->service_fd >= 0);
277 if ((r = service_recv(u, rsp, room)) < 0)
280 if ((rsp->type != BT_INDICATION && rsp->type != BT_RESPONSE) ||
281 rsp->name != expected_name ||
282 (expected_size > 0 && rsp->length != expected_size)) {
284 if (rsp->type == BT_ERROR && rsp->length == sizeof(bt_audio_error_t))
285 pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t*) rsp)->posix_errno));
287 pa_log_error("Bogus message %s received while %s was expected",
288 pa_strnull(bt_audio_strname(rsp->name)),
289 pa_strnull(bt_audio_strname(expected_name)));
296 /* Run from main thread */
297 static int parse_caps(struct userdata *u, uint8_t seid, const struct bt_get_capabilities_rsp *rsp) {
299 const codec_capabilities_t *codec;
304 bytes_left = rsp->h.length - sizeof(*rsp);
306 if (bytes_left < sizeof(codec_capabilities_t)) {
307 pa_log_error("Packet too small to store codec information.");
311 codec = (codec_capabilities_t *) rsp->data; /** ALIGNMENT? **/
313 pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left, (unsigned long) sizeof(*codec));
315 if (((u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) && codec->transport != BT_CAPABILITIES_TRANSPORT_A2DP) ||
316 (u->profile == PROFILE_HSP && codec->transport != BT_CAPABILITIES_TRANSPORT_SCO)) {
317 pa_log_error("Got capabilities for wrong codec.");
321 if (u->profile == PROFILE_HSP) {
323 if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities))
326 pa_assert(codec->type == BT_HFP_CODEC_PCM);
328 if (codec->configured && seid == 0)
331 memcpy(&u->hsp.pcm_capabilities, codec, sizeof(u->hsp.pcm_capabilities));
333 } else if (u->profile == PROFILE_A2DP) {
335 while (bytes_left > 0) {
336 if ((codec->type == BT_A2DP_SBC_SINK) && !codec->lock)
339 bytes_left -= codec->length;
340 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
343 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
346 pa_assert(codec->type == BT_A2DP_SBC_SINK);
348 if (codec->configured && seid == 0)
351 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
353 } else if (u->profile == PROFILE_A2DP_SOURCE) {
355 while (bytes_left > 0) {
356 if ((codec->type == BT_A2DP_SBC_SOURCE) && !codec->lock)
359 bytes_left -= codec->length;
360 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
363 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
366 pa_assert(codec->type == BT_A2DP_SBC_SOURCE);
368 if (codec->configured && seid == 0)
371 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
377 /* Run from main thread */
378 static int get_caps(struct userdata *u, uint8_t seid) {
380 struct bt_get_capabilities_req getcaps_req;
381 struct bt_get_capabilities_rsp getcaps_rsp;
382 bt_audio_error_t error;
383 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
389 memset(&msg, 0, sizeof(msg));
390 msg.getcaps_req.h.type = BT_REQUEST;
391 msg.getcaps_req.h.name = BT_GET_CAPABILITIES;
392 msg.getcaps_req.h.length = sizeof(msg.getcaps_req);
393 msg.getcaps_req.seid = seid;
395 pa_strlcpy(msg.getcaps_req.object, u->path, sizeof(msg.getcaps_req.object));
396 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE)
397 msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_A2DP;
399 pa_assert(u->profile == PROFILE_HSP);
400 msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_SCO;
402 msg.getcaps_req.flags = BT_FLAG_AUTOCONNECT;
404 if (service_send(u, &msg.getcaps_req.h) < 0)
407 if (service_expect(u, &msg.getcaps_rsp.h, sizeof(msg), BT_GET_CAPABILITIES, 0) < 0)
410 ret = parse_caps(u, seid, &msg.getcaps_rsp);
414 return get_caps(u, ret);
417 /* Run from main thread */
418 static uint8_t a2dp_default_bitpool(uint8_t freq, uint8_t mode) {
421 case BT_SBC_SAMPLING_FREQ_16000:
422 case BT_SBC_SAMPLING_FREQ_32000:
425 case BT_SBC_SAMPLING_FREQ_44100:
428 case BT_A2DP_CHANNEL_MODE_MONO:
429 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
432 case BT_A2DP_CHANNEL_MODE_STEREO:
433 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
437 pa_log_warn("Invalid channel mode %u", mode);
441 case BT_SBC_SAMPLING_FREQ_48000:
444 case BT_A2DP_CHANNEL_MODE_MONO:
445 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
448 case BT_A2DP_CHANNEL_MODE_STEREO:
449 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
453 pa_log_warn("Invalid channel mode %u", mode);
458 pa_log_warn("Invalid sampling freq %u", freq);
463 /* Run from main thread */
464 static int setup_a2dp(struct userdata *u) {
465 sbc_capabilities_t *cap;
468 static const struct {
472 { 16000U, BT_SBC_SAMPLING_FREQ_16000 },
473 { 32000U, BT_SBC_SAMPLING_FREQ_32000 },
474 { 44100U, BT_SBC_SAMPLING_FREQ_44100 },
475 { 48000U, BT_SBC_SAMPLING_FREQ_48000 }
479 pa_assert(u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE);
481 cap = &u->a2dp.sbc_capabilities;
483 /* Find the lowest freq that is at least as high as the requested
485 for (i = 0; (unsigned) i < PA_ELEMENTSOF(freq_table); i++)
486 if (freq_table[i].rate >= u->sample_spec.rate && (cap->frequency & freq_table[i].cap)) {
487 u->sample_spec.rate = freq_table[i].rate;
488 cap->frequency = freq_table[i].cap;
492 if ((unsigned) i == PA_ELEMENTSOF(freq_table)) {
493 for (--i; i >= 0; i--) {
494 if (cap->frequency & freq_table[i].cap) {
495 u->sample_spec.rate = freq_table[i].rate;
496 cap->frequency = freq_table[i].cap;
502 pa_log("Not suitable sample rate");
507 pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table));
509 if (cap->capability.configured)
512 if (u->sample_spec.channels <= 1) {
513 if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) {
514 cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO;
515 u->sample_spec.channels = 1;
517 u->sample_spec.channels = 2;
520 if (u->sample_spec.channels >= 2) {
521 u->sample_spec.channels = 2;
523 if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_JOINT_STEREO)
524 cap->channel_mode = BT_A2DP_CHANNEL_MODE_JOINT_STEREO;
525 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO)
526 cap->channel_mode = BT_A2DP_CHANNEL_MODE_STEREO;
527 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL)
528 cap->channel_mode = BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL;
529 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) {
530 cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO;
531 u->sample_spec.channels = 1;
533 pa_log("No supported channel modes");
538 if (cap->block_length & BT_A2DP_BLOCK_LENGTH_16)
539 cap->block_length = BT_A2DP_BLOCK_LENGTH_16;
540 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_12)
541 cap->block_length = BT_A2DP_BLOCK_LENGTH_12;
542 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_8)
543 cap->block_length = BT_A2DP_BLOCK_LENGTH_8;
544 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_4)
545 cap->block_length = BT_A2DP_BLOCK_LENGTH_4;
547 pa_log_error("No supported block lengths");
551 if (cap->subbands & BT_A2DP_SUBBANDS_8)
552 cap->subbands = BT_A2DP_SUBBANDS_8;
553 else if (cap->subbands & BT_A2DP_SUBBANDS_4)
554 cap->subbands = BT_A2DP_SUBBANDS_4;
556 pa_log_error("No supported subbands");
560 if (cap->allocation_method & BT_A2DP_ALLOCATION_LOUDNESS)
561 cap->allocation_method = BT_A2DP_ALLOCATION_LOUDNESS;
562 else if (cap->allocation_method & BT_A2DP_ALLOCATION_SNR)
563 cap->allocation_method = BT_A2DP_ALLOCATION_SNR;
565 cap->min_bitpool = (uint8_t) PA_MAX(MIN_BITPOOL, cap->min_bitpool);
566 cap->max_bitpool = (uint8_t) PA_MIN(a2dp_default_bitpool(cap->frequency, cap->channel_mode), cap->max_bitpool);
571 /* Run from main thread */
572 static void setup_sbc(struct a2dp_info *a2dp) {
573 sbc_capabilities_t *active_capabilities;
577 active_capabilities = &a2dp->sbc_capabilities;
579 if (a2dp->sbc_initialized)
580 sbc_reinit(&a2dp->sbc, 0);
582 sbc_init(&a2dp->sbc, 0);
583 a2dp->sbc_initialized = TRUE;
585 switch (active_capabilities->frequency) {
586 case BT_SBC_SAMPLING_FREQ_16000:
587 a2dp->sbc.frequency = SBC_FREQ_16000;
589 case BT_SBC_SAMPLING_FREQ_32000:
590 a2dp->sbc.frequency = SBC_FREQ_32000;
592 case BT_SBC_SAMPLING_FREQ_44100:
593 a2dp->sbc.frequency = SBC_FREQ_44100;
595 case BT_SBC_SAMPLING_FREQ_48000:
596 a2dp->sbc.frequency = SBC_FREQ_48000;
599 pa_assert_not_reached();
602 switch (active_capabilities->channel_mode) {
603 case BT_A2DP_CHANNEL_MODE_MONO:
604 a2dp->sbc.mode = SBC_MODE_MONO;
606 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
607 a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL;
609 case BT_A2DP_CHANNEL_MODE_STEREO:
610 a2dp->sbc.mode = SBC_MODE_STEREO;
612 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
613 a2dp->sbc.mode = SBC_MODE_JOINT_STEREO;
616 pa_assert_not_reached();
619 switch (active_capabilities->allocation_method) {
620 case BT_A2DP_ALLOCATION_SNR:
621 a2dp->sbc.allocation = SBC_AM_SNR;
623 case BT_A2DP_ALLOCATION_LOUDNESS:
624 a2dp->sbc.allocation = SBC_AM_LOUDNESS;
627 pa_assert_not_reached();
630 switch (active_capabilities->subbands) {
631 case BT_A2DP_SUBBANDS_4:
632 a2dp->sbc.subbands = SBC_SB_4;
634 case BT_A2DP_SUBBANDS_8:
635 a2dp->sbc.subbands = SBC_SB_8;
638 pa_assert_not_reached();
641 switch (active_capabilities->block_length) {
642 case BT_A2DP_BLOCK_LENGTH_4:
643 a2dp->sbc.blocks = SBC_BLK_4;
645 case BT_A2DP_BLOCK_LENGTH_8:
646 a2dp->sbc.blocks = SBC_BLK_8;
648 case BT_A2DP_BLOCK_LENGTH_12:
649 a2dp->sbc.blocks = SBC_BLK_12;
651 case BT_A2DP_BLOCK_LENGTH_16:
652 a2dp->sbc.blocks = SBC_BLK_16;
655 pa_assert_not_reached();
658 a2dp->sbc.bitpool = active_capabilities->max_bitpool;
659 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
660 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
663 /* Run from main thread */
664 static int set_conf(struct userdata *u) {
666 struct bt_open_req open_req;
667 struct bt_open_rsp open_rsp;
668 struct bt_set_configuration_req setconf_req;
669 struct bt_set_configuration_rsp setconf_rsp;
670 bt_audio_error_t error;
671 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
674 memset(&msg, 0, sizeof(msg));
675 msg.open_req.h.type = BT_REQUEST;
676 msg.open_req.h.name = BT_OPEN;
677 msg.open_req.h.length = sizeof(msg.open_req);
679 pa_strlcpy(msg.open_req.object, u->path, sizeof(msg.open_req.object));
680 msg.open_req.seid = (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) ? u->a2dp.sbc_capabilities.capability.seid : BT_A2DP_SEID_RANGE + 1;
681 msg.open_req.lock = (u->profile == PROFILE_A2DP) ? BT_WRITE_LOCK : BT_READ_LOCK | BT_WRITE_LOCK;
683 if (service_send(u, &msg.open_req.h) < 0)
686 if (service_expect(u, &msg.open_rsp.h, sizeof(msg), BT_OPEN, sizeof(msg.open_rsp)) < 0)
689 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
690 u->sample_spec.format = PA_SAMPLE_S16LE;
692 if (setup_a2dp(u) < 0)
695 pa_assert(u->profile == PROFILE_HSP);
697 u->sample_spec.format = PA_SAMPLE_S16LE;
698 u->sample_spec.channels = 1;
699 u->sample_spec.rate = 8000;
702 memset(&msg, 0, sizeof(msg));
703 msg.setconf_req.h.type = BT_REQUEST;
704 msg.setconf_req.h.name = BT_SET_CONFIGURATION;
705 msg.setconf_req.h.length = sizeof(msg.setconf_req);
707 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
708 memcpy(&msg.setconf_req.codec, &u->a2dp.sbc_capabilities, sizeof(u->a2dp.sbc_capabilities));
710 msg.setconf_req.codec.transport = BT_CAPABILITIES_TRANSPORT_SCO;
711 msg.setconf_req.codec.seid = BT_A2DP_SEID_RANGE + 1;
712 msg.setconf_req.codec.length = sizeof(pcm_capabilities_t);
714 msg.setconf_req.h.length += msg.setconf_req.codec.length - sizeof(msg.setconf_req.codec);
716 if (service_send(u, &msg.setconf_req.h) < 0)
719 if (service_expect(u, &msg.setconf_rsp.h, sizeof(msg), BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0)
722 u->link_mtu = msg.setconf_rsp.link_mtu;
724 /* setup SBC encoder now we agree on parameters */
725 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
729 ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
730 / u->a2dp.frame_length
733 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
734 u->a2dp.sbc.allocation, u->a2dp.sbc.subbands, u->a2dp.sbc.blocks, u->a2dp.sbc.bitpool);
736 u->block_size = u->link_mtu;
741 /* from IO thread, except in SCO over PCM */
742 static int start_stream_fd(struct userdata *u) {
744 bt_audio_msg_header_t rsp;
745 struct bt_start_stream_req start_req;
746 struct bt_start_stream_rsp start_rsp;
747 struct bt_new_stream_ind streamfd_ind;
748 bt_audio_error_t error;
749 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
751 struct pollfd *pollfd;
755 pa_assert(u->rtpoll);
756 pa_assert(!u->rtpoll_item);
757 pa_assert(u->stream_fd < 0);
759 memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
760 msg.start_req.h.type = BT_REQUEST;
761 msg.start_req.h.name = BT_START_STREAM;
762 msg.start_req.h.length = sizeof(msg.start_req);
764 if (service_send(u, &msg.start_req.h) < 0)
767 if (service_expect(u, &msg.rsp, sizeof(msg), BT_START_STREAM, sizeof(msg.start_rsp)) < 0)
770 if (service_expect(u, &msg.rsp, sizeof(msg), BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0)
773 if ((u->stream_fd = bt_audio_service_get_data_fd(u->service_fd)) < 0) {
774 pa_log("Failed to get stream fd from audio service.");
778 pa_make_fd_nonblock(u->stream_fd);
779 pa_make_socket_low_delay(u->stream_fd);
782 if (setsockopt(u->stream_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)) < 0)
783 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno));
785 pa_log_debug("Stream properly set up, we're ready to roll!");
787 u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
788 pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
789 pollfd->fd = u->stream_fd;
790 pollfd->events = pollfd->revents = 0;
792 u->read_index = u->write_index = 0;
796 u->read_smoother = pa_smoother_new(
809 static int stop_stream_fd(struct userdata *u) {
811 bt_audio_msg_header_t rsp;
812 struct bt_stop_stream_req start_req;
813 struct bt_stop_stream_rsp start_rsp;
814 bt_audio_error_t error;
815 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
820 pa_assert(u->rtpoll);
821 pa_assert(u->rtpoll_item);
822 pa_assert(u->stream_fd >= 0);
824 pa_rtpoll_item_free(u->rtpoll_item);
825 u->rtpoll_item = NULL;
827 memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
828 msg.start_req.h.type = BT_REQUEST;
829 msg.start_req.h.name = BT_STOP_STREAM;
830 msg.start_req.h.length = sizeof(msg.start_req);
832 if (service_send(u, &msg.start_req.h) < 0 ||
833 service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
836 pa_close(u->stream_fd);
839 if (u->read_smoother) {
840 pa_smoother_free(u->read_smoother);
841 u->read_smoother = NULL;
847 /* Run from IO thread */
848 static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
849 struct userdata *u = PA_SINK(o)->userdata;
850 pa_bool_t failed = FALSE;
853 pa_assert(u->sink == PA_SINK(o));
857 case PA_SINK_MESSAGE_SET_STATE:
859 switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
861 case PA_SINK_SUSPENDED:
862 pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));
864 /* Stop the device if the source is suspended as well */
865 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED)
866 /* We deliberately ignore whether stopping
867 * actually worked. Since the stream_fd is
868 * closed it doesn't really matter */
874 case PA_SINK_RUNNING:
875 if (u->sink->thread_info.state != PA_SINK_SUSPENDED)
878 /* Resume the device if the source was suspended as well */
879 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED)
880 if (start_stream_fd(u) < 0)
884 case PA_SINK_UNLINKED:
886 case PA_SINK_INVALID_STATE:
891 case PA_SINK_MESSAGE_GET_LATENCY: {
893 if (u->read_smoother) {
896 ri = pa_smoother_get(u->read_smoother, pa_rtclock_now());
897 wi = pa_bytes_to_usec(u->write_index + u->block_size, &u->sample_spec);
899 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
903 ri = pa_rtclock_now() - u->started_at;
904 wi = pa_bytes_to_usec(u->write_index, &u->sample_spec);
906 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
909 *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency;
914 r = pa_sink_process_msg(o, code, data, offset, chunk);
916 return (r < 0 || !failed) ? r : -1;
919 /* Run from IO thread */
920 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
921 struct userdata *u = PA_SOURCE(o)->userdata;
922 pa_bool_t failed = FALSE;
925 pa_assert(u->source == PA_SOURCE(o));
929 case PA_SOURCE_MESSAGE_SET_STATE:
931 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
933 case PA_SOURCE_SUSPENDED:
934 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
936 /* Stop the device if the sink is suspended as well */
937 if (!u->sink || u->sink->state == PA_SINK_SUSPENDED)
940 if (u->read_smoother)
941 pa_smoother_pause(u->read_smoother, pa_rtclock_now());
945 case PA_SOURCE_RUNNING:
946 if (u->source->thread_info.state != PA_SOURCE_SUSPENDED)
949 /* Resume the device if the sink was suspended as well */
950 if (!u->sink || u->sink->thread_info.state == PA_SINK_SUSPENDED)
951 if (start_stream_fd(u) < 0)
954 /* We don't resume the smoother here. Instead we
955 * wait until the first packet arrives */
958 case PA_SOURCE_UNLINKED:
960 case PA_SOURCE_INVALID_STATE:
965 case PA_SOURCE_MESSAGE_GET_LATENCY: {
968 wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
969 ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
971 *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
977 r = pa_source_process_msg(o, code, data, offset, chunk);
979 return (r < 0 || !failed) ? r : -1;
982 /* Run from IO thread */
983 static int hsp_process_render(struct userdata *u) {
987 pa_assert(u->profile == PROFILE_HSP);
990 /* First, render some data */
991 if (!u->write_memchunk.memblock)
992 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
994 pa_assert(u->write_memchunk.length == u->block_size);
1000 /* Now write that data to the socket. The socket is of type
1001 * SEQPACKET, and we generated the data of the MTU size, so this
1002 * should just work. */
1004 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
1005 l = pa_write(u->stream_fd, p, u->write_memchunk.length, &u->stream_write_type);
1006 pa_memblock_release(u->write_memchunk.memblock);
1013 /* Retry right away if we got interrupted */
1016 else if (errno == EAGAIN)
1017 /* Hmm, apparently the socket was not writable, give up for now */
1020 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
1025 pa_assert((size_t) l <= u->write_memchunk.length);
1027 if ((size_t) l != u->write_memchunk.length) {
1028 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1029 (unsigned long long) l,
1030 (unsigned long long) u->write_memchunk.length);
1035 u->write_index += (uint64_t) u->write_memchunk.length;
1036 pa_memblock_unref(u->write_memchunk.memblock);
1037 pa_memchunk_reset(&u->write_memchunk);
1046 /* Run from IO thread */
1047 static int hsp_process_push(struct userdata *u) {
1049 pa_memchunk memchunk;
1052 pa_assert(u->profile == PROFILE_HSP);
1053 pa_assert(u->source);
1054 pa_assert(u->read_smoother);
1056 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1057 memchunk.index = memchunk.length = 0;
1066 pa_bool_t found_tstamp = FALSE;
1069 memset(&m, 0, sizeof(m));
1070 memset(&aux, 0, sizeof(aux));
1071 memset(&iov, 0, sizeof(iov));
1075 m.msg_control = aux;
1076 m.msg_controllen = sizeof(aux);
1078 p = pa_memblock_acquire(memchunk.memblock);
1080 iov.iov_len = pa_memblock_get_length(memchunk.memblock);
1081 l = recvmsg(u->stream_fd, &m, 0);
1082 pa_memblock_release(memchunk.memblock);
1086 if (l < 0 && errno == EINTR)
1087 /* Retry right away if we got interrupted */
1090 else if (l < 0 && errno == EAGAIN)
1091 /* Hmm, apparently the socket was not readable, give up for now. */
1094 pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1099 pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock));
1101 memchunk.length = (size_t) l;
1102 u->read_index += (uint64_t) l;
1104 for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
1105 if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) {
1106 struct timeval *tv = (struct timeval*) CMSG_DATA(cm);
1107 pa_rtclock_from_wallclock(tv);
1108 tstamp = pa_timeval_load(tv);
1109 found_tstamp = TRUE;
1113 if (!found_tstamp) {
1114 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1115 tstamp = pa_rtclock_now();
1118 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
1119 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
1121 pa_source_post(u->source, &memchunk);
1127 pa_memblock_unref(memchunk.memblock);
1132 /* Run from IO thread */
1133 static void a2dp_prepare_buffer(struct userdata *u) {
1136 if (u->a2dp.buffer_size >= u->link_mtu)
1139 u->a2dp.buffer_size = 2 * u->link_mtu;
1140 pa_xfree(u->a2dp.buffer);
1141 u->a2dp.buffer = pa_xmalloc(u->a2dp.buffer_size);
1144 /* Run from IO thread */
1145 static int a2dp_process_render(struct userdata *u) {
1146 struct a2dp_info *a2dp;
1147 struct rtp_header *header;
1148 struct rtp_payload *payload;
1152 size_t to_write, to_encode;
1153 unsigned frame_count;
1157 pa_assert(u->profile == PROFILE_A2DP);
1160 /* First, render some data */
1161 if (!u->write_memchunk.memblock)
1162 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
1164 pa_assert(u->write_memchunk.length == u->block_size);
1166 a2dp_prepare_buffer(u);
1169 header = a2dp->buffer;
1170 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1174 /* Try to create a packet of the full MTU */
1176 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
1177 to_encode = u->write_memchunk.length;
1179 d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1180 to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload);
1182 while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
1186 encoded = sbc_encode(&a2dp->sbc,
1191 if (PA_UNLIKELY(encoded <= 0)) {
1192 pa_log_error("SBC encoding error (%li)", (long) encoded);
1193 pa_memblock_release(u->write_memchunk.memblock);
1197 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
1198 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
1200 pa_assert_fp((size_t) encoded <= to_encode);
1201 pa_assert_fp((size_t) encoded == a2dp->codesize);
1203 pa_assert_fp((size_t) written <= to_write);
1204 pa_assert_fp((size_t) written == a2dp->frame_length);
1206 p = (const uint8_t*) p + encoded;
1207 to_encode -= encoded;
1209 d = (uint8_t*) d + written;
1210 to_write -= written;
1215 pa_memblock_release(u->write_memchunk.memblock);
1217 pa_assert(to_encode == 0);
1220 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc)));
1223 /* write it to the fifo */
1224 memset(a2dp->buffer, 0, sizeof(*header) + sizeof(*payload));
1227 header->sequence_number = htons(a2dp->seq_num++);
1228 header->timestamp = htonl(u->write_index / pa_frame_size(&u->sample_spec));
1229 header->ssrc = htonl(1);
1230 payload->frame_count = frame_count;
1232 nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer;
1237 l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type);
1244 /* Retry right away if we got interrupted */
1247 else if (errno == EAGAIN)
1248 /* Hmm, apparently the socket was not writable, give up for now */
1251 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno));
1256 pa_assert((size_t) l <= nbytes);
1258 if ((size_t) l != nbytes) {
1259 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1260 (unsigned long long) l,
1261 (unsigned long long) nbytes);
1266 u->write_index += (uint64_t) u->write_memchunk.length;
1267 pa_memblock_unref(u->write_memchunk.memblock);
1268 pa_memchunk_reset(&u->write_memchunk);
1278 static int a2dp_process_push(struct userdata *u) {
1280 pa_memchunk memchunk;
1283 pa_assert(u->profile == PROFILE_A2DP_SOURCE);
1284 pa_assert(u->source);
1285 pa_assert(u->read_smoother);
1287 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1288 memchunk.index = memchunk.length = 0;
1291 pa_bool_t found_tstamp = FALSE;
1293 struct a2dp_info *a2dp;
1294 struct rtp_header *header;
1295 struct rtp_payload *payload;
1299 size_t to_write, to_decode;
1300 unsigned frame_count;
1302 a2dp_prepare_buffer(u);
1305 header = a2dp->buffer;
1306 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1308 l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type);
1312 if (l < 0 && errno == EINTR)
1313 /* Retry right away if we got interrupted */
1316 else if (l < 0 && errno == EAGAIN)
1317 /* Hmm, apparently the socket was not readable, give up for now. */
1320 pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1325 pa_assert((size_t) l <= a2dp->buffer_size);
1327 u->read_index += (uint64_t) l;
1329 /* TODO: get timestamp from rtp */
1330 if (!found_tstamp) {
1331 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
1332 tstamp = pa_rtclock_now();
1335 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
1336 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
1338 p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1339 to_decode = l - sizeof(*header) - sizeof(*payload);
1341 d = pa_memblock_acquire(memchunk.memblock);
1342 to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock);
1344 while (PA_LIKELY(to_decode > 0 && to_write > 0)) {
1348 decoded = sbc_decode(&a2dp->sbc,
1353 if (PA_UNLIKELY(decoded <= 0)) {
1354 pa_log_error("SBC decoding error (%li)", (long) decoded);
1355 pa_memblock_release(memchunk.memblock);
1356 pa_memblock_unref(memchunk.memblock);
1360 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
1361 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
1363 pa_assert_fp((size_t) decoded <= to_decode);
1364 pa_assert_fp((size_t) decoded == a2dp->frame_length);
1366 pa_assert_fp((size_t) written <= to_write);
1367 pa_assert_fp((size_t) written == a2dp->codesize);
1369 p = (const uint8_t*) p + decoded;
1370 to_decode -= decoded;
1372 d = (uint8_t*) d + written;
1373 to_write -= written;
1378 pa_memblock_release(memchunk.memblock);
1380 pa_source_post(u->source, &memchunk);
1386 pa_memblock_unref(memchunk.memblock);
1391 static void thread_func(void *userdata) {
1392 struct userdata *u = userdata;
1393 unsigned do_write = 0;
1394 pa_bool_t writable = FALSE;
1398 pa_log_debug("IO Thread starting up");
1400 if (u->core->realtime_scheduling)
1401 pa_make_realtime(u->core->realtime_priority);
1403 pa_thread_mq_install(&u->thread_mq);
1405 if (start_stream_fd(u) < 0)
1409 struct pollfd *pollfd;
1411 pa_bool_t disable_timer = TRUE;
1413 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1415 if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) {
1417 /* We should send two blocks to the device before we expect
1420 if (u->write_index == 0 && u->read_index <= 0)
1423 if (pollfd && (pollfd->revents & POLLIN)) {
1426 if (u->profile == PROFILE_HSP)
1427 n_read = hsp_process_push(u);
1429 n_read = a2dp_process_push(u);
1434 /* We just read something, so we are supposed to write something, too */
1439 if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) {
1441 if (u->sink->thread_info.rewind_requested)
1442 pa_sink_process_rewind(u->sink, 0);
1445 if (pollfd->revents & POLLOUT)
1448 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
1449 pa_usec_t time_passed;
1450 pa_usec_t audio_sent;
1452 /* Hmm, there is no input stream we could synchronize
1453 * to. So let's do things by time */
1455 time_passed = pa_rtclock_now() - u->started_at;
1456 audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1458 if (audio_sent <= time_passed) {
1459 pa_usec_t audio_to_send = time_passed - audio_sent;
1461 /* Never try to catch up for more than 100ms */
1462 if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) {
1463 pa_usec_t skip_usec;
1464 uint64_t skip_bytes;
1466 skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
1467 skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
1469 if (skip_bytes > 0) {
1472 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1473 (unsigned long long) skip_usec,
1474 (unsigned long long) skip_bytes);
1476 pa_sink_render_full(u->sink, skip_bytes, &tmp);
1477 pa_memblock_unref(tmp.memblock);
1478 u->write_index += skip_bytes;
1486 if (writable && do_write > 0) {
1489 if (u->write_index <= 0)
1490 u->started_at = pa_rtclock_now();
1492 if (u->profile == PROFILE_A2DP) {
1493 if ((n_written = a2dp_process_render(u)) < 0)
1496 if ((n_written = hsp_process_render(u)) < 0)
1501 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1503 do_write -= n_written;
1507 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
1508 pa_usec_t time_passed, next_write_at, sleep_for;
1510 /* Hmm, there is no input stream we could synchronize
1511 * to. So let's estimate when we need to wake up the latest */
1513 time_passed = pa_rtclock_now() - u->started_at;
1514 next_write_at = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1515 sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0;
1517 /* pa_log("Sleeping for %lu; time passed %lu, next write at %lu", (unsigned long) sleep_for, (unsigned long) time_passed, (unsigned long)next_write_at); */
1519 pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for);
1520 disable_timer = FALSE;
1526 pa_rtpoll_set_timer_disabled(u->rtpoll);
1528 /* Hmm, nothing to do. Let's sleep */
1530 pollfd->events = (short) (((u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state) && !writable) ? POLLOUT : 0) |
1531 (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state) ? POLLIN : 0));
1533 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1539 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1541 if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) {
1542 pa_log_info("FD error: %s%s%s%s",
1543 pollfd->revents & POLLERR ? "POLLERR " :"",
1544 pollfd->revents & POLLHUP ? "POLLHUP " :"",
1545 pollfd->revents & POLLPRI ? "POLLPRI " :"",
1546 pollfd->revents & POLLNVAL ? "POLLNVAL " :"");
1552 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1553 pa_log_debug("IO thread failed");
1554 pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
1555 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1558 pa_log_debug("IO thread shutting down");
1561 /* Run from main thread */
1562 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
1568 pa_assert_se(u = userdata);
1570 dbus_error_init(&err);
1572 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1573 dbus_message_get_interface(m),
1574 dbus_message_get_path(m),
1575 dbus_message_get_member(m));
1577 if (!dbus_message_has_path(m, u->path))
1580 if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") ||
1581 dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1586 if (!dbus_message_get_args(m, &err, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID) || gain > 15) {
1587 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err.message);
1591 if (u->profile == PROFILE_HSP) {
1592 if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) {
1594 pa_cvolume_set(&v, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15));
1595 pa_sink_volume_changed(u->sink, &v);
1597 } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1599 pa_cvolume_set(&v, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15));
1600 pa_source_volume_changed(u->source, &v);
1606 dbus_error_free(&err);
1608 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1611 /* Run from main thread */
1612 static void sink_set_volume_cb(pa_sink *s) {
1613 struct userdata *u = s->userdata;
1619 if (u->profile != PROFILE_HSP)
1622 gain = (pa_cvolume_max(&s->real_volume) * 15) / PA_VOLUME_NORM;
1627 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15));
1629 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetSpeakerGain"));
1630 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1631 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1632 dbus_message_unref(m);
1635 /* Run from main thread */
1636 static void source_set_volume_cb(pa_source *s) {
1637 struct userdata *u = s->userdata;
1643 if (u->profile != PROFILE_HSP)
1646 gain = (pa_cvolume_max(&s->volume) * 15) / PA_VOLUME_NORM;
1651 pa_cvolume_set(&s->volume, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15));
1653 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetMicrophoneGain"));
1654 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1655 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1656 dbus_message_unref(m);
1659 /* Run from main thread */
1660 static char *get_name(const char *type, pa_modargs *ma, const char *device_id, pa_bool_t *namereg_fail) {
1666 pa_assert(device_id);
1667 pa_assert(namereg_fail);
1669 t = pa_sprintf_malloc("%s_name", type);
1670 n = pa_modargs_get_value(ma, t, NULL);
1674 *namereg_fail = TRUE;
1675 return pa_xstrdup(n);
1678 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1679 *namereg_fail = TRUE;
1682 *namereg_fail = FALSE;
1685 return pa_sprintf_malloc("bluez_%s.%s", type, n);
1690 static void sco_over_pcm_state_update(struct userdata *u) {
1692 pa_assert(USE_SCO_OVER_PCM(u));
1694 if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) ||
1695 PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) {
1697 if (u->service_fd >= 0)
1700 pa_log_debug("Resuming SCO over PCM");
1701 if ((init_bt(u) < 0) || (init_profile(u) < 0))
1702 pa_log("Can't resume SCO over PCM");
1707 if (u->service_fd < 0)
1712 pa_log_debug("Closing SCO over PCM");
1713 pa_close(u->service_fd);
1718 static pa_hook_result_t sink_state_changed_cb(pa_core *c, pa_sink *s, struct userdata *u) {
1720 pa_sink_assert_ref(s);
1723 if (s != u->hsp.sco_sink)
1726 sco_over_pcm_state_update(u);
1731 static pa_hook_result_t source_state_changed_cb(pa_core *c, pa_source *s, struct userdata *u) {
1733 pa_source_assert_ref(s);
1736 if (s != u->hsp.sco_source)
1739 sco_over_pcm_state_update(u);
1746 /* Run from main thread */
1747 static int add_sink(struct userdata *u) {
1750 if (USE_SCO_OVER_PCM(u)) {
1753 u->sink = u->hsp.sco_sink;
1754 p = pa_proplist_new();
1755 pa_proplist_sets(p, "bluetooth.protocol", "sco");
1756 pa_proplist_update(u->sink->proplist, PA_UPDATE_MERGE, p);
1757 pa_proplist_free(p);
1759 if (!u->hsp.sink_state_changed_slot)
1760 u->hsp.sink_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_state_changed_cb, u);
1766 pa_sink_new_data data;
1769 pa_sink_new_data_init(&data);
1770 data.driver = __FILE__;
1771 data.module = u->module;
1772 pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
1773 pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP ? "a2dp" : "sco");
1774 if (u->profile == PROFILE_HSP)
1775 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1776 data.card = u->card;
1777 data.name = get_name("sink", u->modargs, u->address, &b);
1778 data.namereg_fail = b;
1780 if (pa_modargs_get_proplist(u->modargs, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1781 pa_log("Invalid properties");
1782 pa_sink_new_data_done(&data);
1786 u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY | (u->profile == PROFILE_HSP ? PA_SINK_HW_VOLUME_CTRL : 0));
1787 pa_sink_new_data_done(&data);
1790 pa_log_error("Failed to create sink");
1794 u->sink->userdata = u;
1795 u->sink->parent.process_msg = sink_process_msg;
1797 pa_sink_set_max_request(u->sink, u->block_size);
1798 pa_sink_set_fixed_latency(u->sink,
1799 (u->profile == PROFILE_A2DP ? FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_HSP) +
1800 pa_bytes_to_usec(u->block_size, &u->sample_spec));
1803 if (u->profile == PROFILE_HSP) {
1804 u->sink->set_volume = sink_set_volume_cb;
1805 u->sink->n_volume_steps = 16;
1811 /* Run from main thread */
1812 static int add_source(struct userdata *u) {
1815 if (USE_SCO_OVER_PCM(u)) {
1816 u->source = u->hsp.sco_source;
1817 pa_proplist_sets(u->source->proplist, "bluetooth.protocol", "hsp");
1819 if (!u->hsp.source_state_changed_slot)
1820 u->hsp.source_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) source_state_changed_cb, u);
1826 pa_source_new_data data;
1829 pa_source_new_data_init(&data);
1830 data.driver = __FILE__;
1831 data.module = u->module;
1832 pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
1833 pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP_SOURCE ? "a2dp_source" : "hsp");
1834 if (u->profile == PROFILE_HSP)
1835 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1836 data.card = u->card;
1837 data.name = get_name("source", u->modargs, u->address, &b);
1838 data.namereg_fail = b;
1840 if (pa_modargs_get_proplist(u->modargs, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1841 pa_log("Invalid properties");
1842 pa_source_new_data_done(&data);
1846 u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY | (u->profile == PROFILE_HSP ? PA_SOURCE_HW_VOLUME_CTRL : 0));
1847 pa_source_new_data_done(&data);
1850 pa_log_error("Failed to create source");
1854 u->source->userdata = u;
1855 u->source->parent.process_msg = source_process_msg;
1857 pa_source_set_fixed_latency(u->source,
1858 (u->profile == PROFILE_A2DP_SOURCE ? FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_HSP) +
1859 pa_bytes_to_usec(u->block_size, &u->sample_spec));
1862 if (u->profile == PROFILE_HSP) {
1863 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", (u->hsp.pcm_capabilities.flags & BT_PCM_FLAG_NREC) ? "1" : "0");
1864 u->source->set_volume = source_set_volume_cb;
1865 u->source->n_volume_steps = 16;
1871 /* Run from main thread */
1872 static void shutdown_bt(struct userdata *u) {
1875 if (u->stream_fd >= 0) {
1876 pa_close(u->stream_fd);
1879 u->stream_write_type = 0;
1882 if (u->service_fd >= 0) {
1883 pa_close(u->service_fd);
1885 u->service_write_type = 0;
1886 u->service_read_type = 0;
1889 if (u->write_memchunk.memblock) {
1890 pa_memblock_unref(u->write_memchunk.memblock);
1891 pa_memchunk_reset(&u->write_memchunk);
1895 /* Run from main thread */
1896 static int init_bt(struct userdata *u) {
1901 u->stream_write_type = 0;
1902 u->service_write_type = 0;
1903 u->service_read_type = 0;
1905 if ((u->service_fd = bt_audio_service_open()) < 0) {
1906 pa_log_error("Couldn't connect to bluetooth audio service");
1910 pa_log_debug("Connected to the bluetooth audio service");
1915 /* Run from main thread */
1916 static int setup_bt(struct userdata *u) {
1919 if (get_caps(u, 0) < 0)
1922 pa_log_debug("Got device capabilities");
1924 if (set_conf(u) < 0)
1927 pa_log_debug("Connection to the device configured");
1930 if (USE_SCO_OVER_PCM(u)) {
1931 pa_log_debug("Configured to use SCO over PCM");
1936 pa_log_debug("Got the stream socket");
1941 /* Run from main thread */
1942 static int init_profile(struct userdata *u) {
1945 pa_assert(u->profile != PROFILE_OFF);
1947 if (setup_bt(u) < 0)
1950 if (u->profile == PROFILE_A2DP ||
1951 u->profile == PROFILE_HSP)
1952 if (add_sink(u) < 0)
1955 if (u->profile == PROFILE_HSP ||
1956 u->profile == PROFILE_A2DP_SOURCE)
1957 if (add_source(u) < 0)
1963 /* Run from main thread */
1964 static void stop_thread(struct userdata *u) {
1968 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
1969 pa_thread_free(u->thread);
1973 if (u->rtpoll_item) {
1974 pa_rtpoll_item_free(u->rtpoll_item);
1975 u->rtpoll_item = NULL;
1978 if (u->hsp.sink_state_changed_slot) {
1979 pa_hook_slot_free(u->hsp.sink_state_changed_slot);
1980 u->hsp.sink_state_changed_slot = NULL;
1983 if (u->hsp.source_state_changed_slot) {
1984 pa_hook_slot_free(u->hsp.source_state_changed_slot);
1985 u->hsp.source_state_changed_slot = NULL;
1989 pa_sink_unref(u->sink);
1994 pa_source_unref(u->source);
1999 pa_thread_mq_done(&u->thread_mq);
2001 pa_rtpoll_free(u->rtpoll);
2005 if (u->read_smoother) {
2006 pa_smoother_free(u->read_smoother);
2007 u->read_smoother = NULL;
2011 /* Run from main thread */
2012 static int start_thread(struct userdata *u) {
2014 pa_assert(!u->thread);
2015 pa_assert(!u->rtpoll);
2016 pa_assert(!u->rtpoll_item);
2018 u->rtpoll = pa_rtpoll_new();
2019 pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
2022 if (USE_SCO_OVER_PCM(u)) {
2023 if (start_stream_fd(u) < 0)
2026 pa_sink_ref(u->sink);
2027 pa_source_ref(u->source);
2028 /* FIXME: monitor stream_fd error */
2033 if (!(u->thread = pa_thread_new(thread_func, u))) {
2034 pa_log_error("Failed to create IO thread");
2040 pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
2041 pa_sink_set_rtpoll(u->sink, u->rtpoll);
2042 pa_sink_put(u->sink);
2044 if (u->sink->set_volume)
2045 u->sink->set_volume(u->sink);
2049 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
2050 pa_source_set_rtpoll(u->source, u->rtpoll);
2051 pa_source_put(u->source);
2053 if (u->source->set_volume)
2054 u->source->set_volume(u->source);
2060 /* Run from main thread */
2061 static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
2064 pa_queue *inputs = NULL, *outputs = NULL;
2065 const pa_bluetooth_device *device;
2068 pa_assert(new_profile);
2069 pa_assert_se(u = c->userdata);
2071 d = PA_CARD_PROFILE_DATA(new_profile);
2073 if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
2074 pa_log_error("Failed to get device object.");
2078 /* The state signal is sent by bluez, so it is racy to check
2079 strictly for CONNECTED, we should also accept STREAMING state
2080 as being good enough. However, if the profile is used
2081 concurrently (which is unlikely), ipc will fail later on, and
2082 module will be unloaded. */
2083 if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
2084 pa_log_warn("HSP is not connected, refused to switch profile");
2087 else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) {
2088 pa_log_warn("A2DP is not connected, refused to switch profile");
2093 inputs = pa_sink_move_all_start(u->sink, NULL);
2095 if (!USE_SCO_OVER_PCM(u))
2097 pa_sink_unlink(u->sink);
2101 outputs = pa_source_move_all_start(u->source, NULL);
2103 if (!USE_SCO_OVER_PCM(u))
2105 pa_source_unlink(u->source);
2112 u->sample_spec = u->requested_sample_spec;
2116 if (u->profile != PROFILE_OFF)
2119 if (u->sink || u->source)
2124 pa_sink_move_all_finish(u->sink, inputs, FALSE);
2126 pa_sink_move_all_fail(inputs);
2131 pa_source_move_all_finish(u->source, outputs, FALSE);
2133 pa_source_move_all_fail(outputs);
2139 /* Run from main thread */
2140 static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
2141 pa_card_new_data data;
2147 const char *default_profile;
2152 pa_card_new_data_init(&data);
2153 data.driver = __FILE__;
2154 data.module = u->module;
2156 n = pa_bluetooth_cleanup_name(device->name);
2157 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, n);
2159 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, device->address);
2160 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "bluez");
2161 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "sound");
2162 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_BUS, "bluetooth");
2163 if ((ff = pa_bluetooth_get_form_factor(device->class)))
2164 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_FORM_FACTOR, ff);
2165 pa_proplist_sets(data.proplist, "bluez.path", device->path);
2166 pa_proplist_setf(data.proplist, "bluez.class", "0x%06x", (unsigned) device->class);
2167 pa_proplist_sets(data.proplist, "bluez.name", device->name);
2168 data.name = get_name("card", u->modargs, device->address, &b);
2169 data.namereg_fail = b;
2171 if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
2172 pa_log("Invalid properties");
2173 pa_card_new_data_done(&data);
2177 data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
2179 /* we base hsp/a2dp availability on UUIDs.
2180 Ideally, it would be based on "Connected" state, but
2181 we can't afford to wait for this information when
2182 we are loaded with profile="hsp", for instance */
2183 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SINK_UUID)) {
2184 p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile));
2188 p->max_sink_channels = 2;
2189 p->max_source_channels = 0;
2191 d = PA_CARD_PROFILE_DATA(p);
2194 pa_hashmap_put(data.profiles, p->name, p);
2197 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SOURCE_UUID)) {
2198 p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile));
2202 p->max_sink_channels = 0;
2203 p->max_source_channels = 2;
2205 d = PA_CARD_PROFILE_DATA(p);
2206 *d = PROFILE_A2DP_SOURCE;
2208 pa_hashmap_put(data.profiles, p->name, p);
2211 if (pa_bluetooth_uuid_has(device->uuids, HSP_HS_UUID) ||
2212 pa_bluetooth_uuid_has(device->uuids, HFP_HS_UUID)) {
2213 p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile));
2217 p->max_sink_channels = 1;
2218 p->max_source_channels = 1;
2220 d = PA_CARD_PROFILE_DATA(p);
2223 pa_hashmap_put(data.profiles, p->name, p);
2226 pa_assert(!pa_hashmap_isempty(data.profiles));
2228 p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
2229 d = PA_CARD_PROFILE_DATA(p);
2231 pa_hashmap_put(data.profiles, p->name, p);
2233 if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
2234 if (pa_hashmap_get(data.profiles, default_profile))
2235 pa_card_new_data_set_profile(&data, default_profile);
2237 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile);
2240 u->card = pa_card_new(u->core, &data);
2241 pa_card_new_data_done(&data);
2244 pa_log("Failed to allocate card.");
2248 u->card->userdata = u;
2249 u->card->set_profile = card_set_profile;
2251 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2253 if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) ||
2254 (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP)) {
2255 pa_log_warn("Default profile not connected, selecting off profile");
2256 u->card->active_profile = pa_hashmap_get(u->card->profiles, "off");
2257 u->card->save_profile = FALSE;
2260 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2266 /* Run from main thread */
2267 static const pa_bluetooth_device* find_device(struct userdata *u, const char *address, const char *path) {
2268 const pa_bluetooth_device *d = NULL;
2272 if (!address && !path) {
2273 pa_log_error("Failed to get device address/path from module arguments.");
2278 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, path))) {
2279 pa_log_error("%s is not a valid BlueZ audio device.", path);
2283 if (address && !(pa_streq(d->address, address))) {
2284 pa_log_error("Passed path %s and address %s don't match.", path, address);
2289 if (!(d = pa_bluetooth_discovery_get_by_address(u->discovery, address))) {
2290 pa_log_error("%s is not known.", address);
2296 u->address = pa_xstrdup(d->address);
2297 u->path = pa_xstrdup(d->path);
2303 /* Run from main thread */
2304 static int setup_dbus(struct userdata *u) {
2307 dbus_error_init(&err);
2309 u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err);
2311 if (dbus_error_is_set(&err) || !u->connection) {
2312 pa_log("Failed to get D-Bus connection: %s", err.message);
2313 dbus_error_free(&err);
2320 int pa__init(pa_module* m) {
2324 const char *address, *path;
2326 char *mike, *speaker;
2327 const pa_bluetooth_device *device;
2331 dbus_error_init(&err);
2333 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
2334 pa_log_error("Failed to parse module arguments");
2338 m->userdata = u = pa_xnew0(struct userdata, 1);
2343 u->sample_spec = m->core->default_sample_spec;
2347 if (pa_modargs_get_value(ma, "sco_sink", NULL) &&
2348 !(u->hsp.sco_sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_sink", NULL), PA_NAMEREG_SINK))) {
2349 pa_log("SCO sink not found");
2353 if (pa_modargs_get_value(ma, "sco_source", NULL) &&
2354 !(u->hsp.sco_source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_source", NULL), PA_NAMEREG_SOURCE))) {
2355 pa_log("SCO source not found");
2360 if (pa_modargs_get_value_u32(ma, "rate", &u->sample_spec.rate) < 0 ||
2361 u->sample_spec.rate <= 0 || u->sample_spec.rate > PA_RATE_MAX) {
2362 pa_log_error("Failed to get rate from module arguments");
2366 channels = u->sample_spec.channels;
2367 if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
2368 channels <= 0 || channels > PA_CHANNELS_MAX) {
2369 pa_log_error("Failed to get channels from module arguments");
2372 u->sample_spec.channels = (uint8_t) channels;
2373 u->requested_sample_spec = u->sample_spec;
2375 address = pa_modargs_get_value(ma, "address", NULL);
2376 path = pa_modargs_get_value(ma, "path", NULL);
2378 if (setup_dbus(u) < 0)
2381 if (!(u->discovery = pa_bluetooth_discovery_get(m->core)))
2384 if (!(device = find_device(u, address, path)))
2387 /* Add the card structure. This will also initialize the default profile */
2388 if (add_card(u, device) < 0)
2391 /* Connect to the BT service and query capabilities */
2395 if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) {
2396 pa_log_error("Failed to add filter function");
2400 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2401 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2403 if (pa_dbus_add_matches(
2404 pa_dbus_connection_get(u->connection), &err,
2412 pa_log("Failed to add D-Bus matches: %s", err.message);
2419 if (u->profile != PROFILE_OFF)
2420 if (init_profile(u) < 0)
2423 if (u->sink || u->source)
2424 if (start_thread(u) < 0)
2433 dbus_error_free(&err);
2438 int pa__get_n_used(pa_module *m) {
2442 pa_assert_se(u = m->userdata);
2445 (u->sink ? pa_sink_linked_by(u->sink) : 0) +
2446 (u->source ? pa_source_linked_by(u->source) : 0);
2449 void pa__done(pa_module *m) {
2453 if (!(u = m->userdata))
2458 && !USE_SCO_OVER_PCM(u)
2461 pa_sink_unlink(u->sink);
2465 && !USE_SCO_OVER_PCM(u)
2468 pa_source_unlink(u->source);
2472 if (u->connection) {
2475 char *speaker, *mike;
2476 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2477 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2479 pa_dbus_remove_matches(pa_dbus_connection_get(u->connection),
2488 dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
2489 pa_dbus_connection_unref(u->connection);
2493 pa_card_free(u->card);
2495 if (u->read_smoother)
2496 pa_smoother_free(u->read_smoother);
2501 pa_xfree(u->a2dp.buffer);
2503 sbc_finish(&u->a2dp.sbc);
2506 pa_modargs_free(u->modargs);
2508 pa_xfree(u->address);
2512 pa_bluetooth_discovery_unref(u->discovery);