2 This file is part of PulseAudio.
4 Copyright 2008-2009 Joao Paulo Rechi Vita
5 Copyright 2011-2012 BMW Car IT GmbH.
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29 #include <linux/sockios.h>
30 #include <arpa/inet.h>
32 #include <pulse/rtclock.h>
33 #include <pulse/sample.h>
34 #include <pulse/timeval.h>
35 #include <pulse/xmalloc.h>
37 #include <pulsecore/i18n.h>
38 #include <pulsecore/module.h>
39 #include <pulsecore/modargs.h>
40 #include <pulsecore/core-rtclock.h>
41 #include <pulsecore/core-util.h>
42 #include <pulsecore/core-error.h>
43 #include <pulsecore/shared.h>
44 #include <pulsecore/socket-util.h>
45 #include <pulsecore/thread.h>
46 #include <pulsecore/thread-mq.h>
47 #include <pulsecore/poll.h>
48 #include <pulsecore/rtpoll.h>
49 #include <pulsecore/time-smoother.h>
50 #include <pulsecore/namereg.h>
51 #include <pulsecore/dbus-shared.h>
53 #include "module-bluetooth-device-symdef.h"
56 #include "a2dp-codecs.h"
58 #include "bluetooth-util.h"
60 #define BITPOOL_DEC_LIMIT 32
61 #define BITPOOL_DEC_STEP 5
62 #define HSP_MAX_GAIN 15
64 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
65 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
66 PA_MODULE_VERSION(PACKAGE_VERSION);
67 PA_MODULE_LOAD_ONCE(FALSE);
69 "name=<name for the card/sink/source, to be prefixed> "
70 "card_name=<name for the card> "
71 "card_properties=<properties for the card> "
72 "sink_name=<name for the sink> "
73 "sink_properties=<properties for the sink> "
74 "source_name=<name for the source> "
75 "source_properties=<properties for the source> "
76 "address=<address of the device> "
77 "profile=<a2dp|hsp|hfgw> "
79 "channels=<number of channels> "
80 "path=<device object path> "
81 "auto_connect=<automatically connect?> "
82 "sco_sink=<SCO over PCM sink name> "
83 "sco_source=<SCO over PCM source name>");
85 /* TODO: not close fd when entering suspend mode in a2dp */
87 static const char* const valid_modargs[] = {
107 sbc_capabilities_t sbc_capabilities;
108 sbc_t sbc; /* Codec data */
109 pa_bool_t sbc_initialized; /* Keep track if the encoder is initialized */
110 size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */
112 void* buffer; /* Codec transfer buffer */
113 size_t buffer_size; /* Size of the buffer */
115 uint16_t seq_num; /* Cumulative packet sequence */
121 pcm_capabilities_t pcm_capabilities;
123 void (*sco_sink_set_volume)(pa_sink *s);
124 pa_source *sco_source;
125 void (*sco_source_set_volume)(pa_source *s);
126 pa_hook_slot *sink_state_changed_slot;
127 pa_hook_slot *source_state_changed_slot;
128 pa_hook_slot *nrec_changed_slot;
131 struct bluetooth_msg {
136 typedef struct bluetooth_msg bluetooth_msg;
137 PA_DEFINE_PRIVATE_CLASS(bluetooth_msg, pa_msgobject);
138 #define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o))
149 pa_bluetooth_discovery *discovery;
150 pa_bool_t auto_connect;
152 pa_dbus_connection *connection;
158 pa_thread_mq thread_mq;
160 pa_rtpoll_item *rtpoll_item;
164 uint64_t read_index, write_index;
165 pa_usec_t started_at;
166 pa_smoother *read_smoother;
168 pa_memchunk write_memchunk;
170 pa_sample_spec sample_spec, requested_sample_spec;
174 size_t read_link_mtu;
175 size_t read_block_size;
177 size_t write_link_mtu;
178 size_t write_block_size;
180 struct a2dp_info a2dp;
183 enum profile profile;
187 int stream_write_type;
189 pa_bool_t filter_added;
193 BLUETOOTH_MESSAGE_IO_THREAD_FAILED,
194 BLUETOOTH_MESSAGE_MAX
197 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
198 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
199 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
200 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
202 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
204 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
206 static int init_profile(struct userdata *u);
209 static void a2dp_set_bitpool(struct userdata *u, uint8_t bitpool)
211 struct a2dp_info *a2dp;
217 if (a2dp->sbc.bitpool == bitpool)
220 if (bitpool > a2dp->max_bitpool)
221 bitpool = a2dp->max_bitpool;
222 else if (bitpool < a2dp->min_bitpool)
223 bitpool = a2dp->min_bitpool;
225 a2dp->sbc.bitpool = bitpool;
227 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
228 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
230 pa_log_debug("Bitpool has changed to %u", a2dp->sbc.bitpool);
233 (u->read_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
234 / a2dp->frame_length * a2dp->codesize;
236 u->write_block_size =
237 (u->write_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
238 / a2dp->frame_length * a2dp->codesize;
240 pa_sink_set_max_request_within_thread(u->sink, u->write_block_size);
241 pa_sink_set_fixed_latency_within_thread(u->sink,
242 FIXED_LATENCY_PLAYBACK_A2DP + pa_bytes_to_usec(u->write_block_size, &u->sample_spec));
245 /* from IO thread, except in SCO over PCM */
247 static void setup_stream(struct userdata *u) {
248 struct pollfd *pollfd;
251 pa_make_fd_nonblock(u->stream_fd);
252 pa_make_socket_low_delay(u->stream_fd);
255 if (setsockopt(u->stream_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)) < 0)
256 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno));
258 pa_log_debug("Stream properly set up, we're ready to roll!");
260 if (u->profile == PROFILE_A2DP)
261 a2dp_set_bitpool(u, u->a2dp.max_bitpool);
263 u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
264 pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
265 pollfd->fd = u->stream_fd;
266 pollfd->events = pollfd->revents = 0;
268 u->read_index = u->write_index = 0;
272 u->read_smoother = pa_smoother_new(
282 static bool bt_transport_is_acquired(struct userdata *u) {
283 if (u->accesstype == NULL) {
284 pa_assert(u->stream_fd < 0);
287 pa_assert(u->stream_fd >= 0);
292 static void bt_transport_release(struct userdata *u) {
293 const char *accesstype = "rw";
294 const pa_bluetooth_transport *t;
296 /* Ignore if already released */
297 if (!bt_transport_is_acquired(u))
300 pa_log_debug("Releasing transport %s", u->transport);
302 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
304 pa_bluetooth_transport_release(t, accesstype);
306 pa_xfree(u->accesstype);
307 u->accesstype = NULL;
309 if (u->rtpoll_item) {
310 pa_rtpoll_item_free(u->rtpoll_item);
311 u->rtpoll_item = NULL;
314 if (u->stream_fd >= 0) {
315 pa_close(u->stream_fd);
319 if (u->read_smoother) {
320 pa_smoother_free(u->read_smoother);
321 u->read_smoother = NULL;
325 static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
326 const char *accesstype = "rw";
327 const pa_bluetooth_transport *t;
329 if (bt_transport_is_acquired(u)) {
335 pa_log_debug("Acquiring transport %s", u->transport);
337 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
339 pa_log("Transport %s no longer available", u->transport);
340 pa_xfree(u->transport);
345 u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype, &u->read_link_mtu, &u->write_link_mtu);
346 if (u->stream_fd < 0)
349 u->accesstype = pa_xstrdup(accesstype);
350 pa_log_info("Transport %s acquired: fd %d", u->transport, u->stream_fd);
356 pa_log_info("Transport %s resuming", u->transport);
362 /* Run from IO thread */
363 static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
364 struct userdata *u = PA_SINK(o)->userdata;
365 pa_bool_t failed = FALSE;
368 pa_assert(u->sink == PA_SINK(o));
369 pa_assert(u->transport);
373 case PA_SINK_MESSAGE_SET_STATE:
375 switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
377 case PA_SINK_SUSPENDED:
378 pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));
380 /* Stop the device if the source is suspended as well */
381 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED)
382 /* We deliberately ignore whether stopping
383 * actually worked. Since the stream_fd is
384 * closed it doesn't really matter */
385 bt_transport_release(u);
390 case PA_SINK_RUNNING:
391 if (u->sink->thread_info.state != PA_SINK_SUSPENDED)
394 /* Resume the device if the source was suspended as well */
395 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) {
396 if (bt_transport_acquire(u, TRUE) < 0)
401 case PA_SINK_UNLINKED:
403 case PA_SINK_INVALID_STATE:
408 case PA_SINK_MESSAGE_GET_LATENCY: {
410 if (u->read_smoother) {
413 ri = pa_smoother_get(u->read_smoother, pa_rtclock_now());
414 wi = pa_bytes_to_usec(u->write_index + u->write_block_size, &u->sample_spec);
416 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
420 ri = pa_rtclock_now() - u->started_at;
421 wi = pa_bytes_to_usec(u->write_index, &u->sample_spec);
423 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
426 *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency;
431 r = pa_sink_process_msg(o, code, data, offset, chunk);
433 return (r < 0 || !failed) ? r : -1;
436 /* Run from IO thread */
437 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
438 struct userdata *u = PA_SOURCE(o)->userdata;
439 pa_bool_t failed = FALSE;
442 pa_assert(u->source == PA_SOURCE(o));
443 pa_assert(u->transport);
447 case PA_SOURCE_MESSAGE_SET_STATE:
449 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
451 case PA_SOURCE_SUSPENDED:
452 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
454 /* Stop the device if the sink is suspended as well */
455 if (!u->sink || u->sink->state == PA_SINK_SUSPENDED)
456 bt_transport_release(u);
458 if (u->read_smoother)
459 pa_smoother_pause(u->read_smoother, pa_rtclock_now());
463 case PA_SOURCE_RUNNING:
464 if (u->source->thread_info.state != PA_SOURCE_SUSPENDED)
467 /* Resume the device if the sink was suspended as well */
468 if (!u->sink || u->sink->thread_info.state == PA_SINK_SUSPENDED) {
469 if (bt_transport_acquire(u, TRUE) < 0)
472 /* We don't resume the smoother here. Instead we
473 * wait until the first packet arrives */
476 case PA_SOURCE_UNLINKED:
478 case PA_SOURCE_INVALID_STATE:
483 case PA_SOURCE_MESSAGE_GET_LATENCY: {
486 if (u->read_smoother) {
487 wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
488 ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
490 *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
492 *((pa_usec_t*) data) = 0;
499 r = pa_source_process_msg(o, code, data, offset, chunk);
501 return (r < 0 || !failed) ? r : -1;
504 /* Called from main thread context */
505 static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
506 struct bluetooth_msg *u = BLUETOOTH_MSG(obj);
509 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED: {
510 if (u->card->module->unload_requested)
513 pa_log_debug("Switching the profile to off due to IO thread failure.");
515 if (pa_card_set_profile(u->card, "off", FALSE) < 0)
516 pa_log_debug("Failed to switch profile to off");
523 /* Run from IO thread */
524 static int hsp_process_render(struct userdata *u) {
528 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
531 /* First, render some data */
532 if (!u->write_memchunk.memblock)
533 pa_sink_render_full(u->sink, u->write_block_size, &u->write_memchunk);
535 pa_assert(u->write_memchunk.length == u->write_block_size);
541 /* Now write that data to the socket. The socket is of type
542 * SEQPACKET, and we generated the data of the MTU size, so this
543 * should just work. */
545 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
546 l = pa_write(u->stream_fd, p, u->write_memchunk.length, &u->stream_write_type);
547 pa_memblock_release(u->write_memchunk.memblock);
554 /* Retry right away if we got interrupted */
557 else if (errno == EAGAIN)
558 /* Hmm, apparently the socket was not writable, give up for now */
561 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
566 pa_assert((size_t) l <= u->write_memchunk.length);
568 if ((size_t) l != u->write_memchunk.length) {
569 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
570 (unsigned long long) l,
571 (unsigned long long) u->write_memchunk.length);
576 u->write_index += (uint64_t) u->write_memchunk.length;
577 pa_memblock_unref(u->write_memchunk.memblock);
578 pa_memchunk_reset(&u->write_memchunk);
587 /* Run from IO thread */
588 static int hsp_process_push(struct userdata *u) {
590 pa_memchunk memchunk;
593 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
594 pa_assert(u->source);
595 pa_assert(u->read_smoother);
597 memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size);
598 memchunk.index = memchunk.length = 0;
607 pa_bool_t found_tstamp = FALSE;
610 memset(&m, 0, sizeof(m));
611 memset(&aux, 0, sizeof(aux));
612 memset(&iov, 0, sizeof(iov));
617 m.msg_controllen = sizeof(aux);
619 p = pa_memblock_acquire(memchunk.memblock);
621 iov.iov_len = pa_memblock_get_length(memchunk.memblock);
622 l = recvmsg(u->stream_fd, &m, 0);
623 pa_memblock_release(memchunk.memblock);
627 if (l < 0 && errno == EINTR)
628 /* Retry right away if we got interrupted */
631 else if (l < 0 && errno == EAGAIN)
632 /* Hmm, apparently the socket was not readable, give up for now. */
635 pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
640 pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock));
642 memchunk.length = (size_t) l;
643 u->read_index += (uint64_t) l;
645 for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
646 if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) {
647 struct timeval *tv = (struct timeval*) CMSG_DATA(cm);
648 pa_rtclock_from_wallclock(tv);
649 tstamp = pa_timeval_load(tv);
655 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
656 tstamp = pa_rtclock_now();
659 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
660 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
662 pa_source_post(u->source, &memchunk);
668 pa_memblock_unref(memchunk.memblock);
673 /* Run from IO thread */
674 static void a2dp_prepare_buffer(struct userdata *u) {
675 size_t min_buffer_size = PA_MAX(u->read_link_mtu, u->write_link_mtu);
679 if (u->a2dp.buffer_size >= min_buffer_size)
682 u->a2dp.buffer_size = 2 * min_buffer_size;
683 pa_xfree(u->a2dp.buffer);
684 u->a2dp.buffer = pa_xmalloc(u->a2dp.buffer_size);
687 /* Run from IO thread */
688 static int a2dp_process_render(struct userdata *u) {
689 struct a2dp_info *a2dp;
690 struct rtp_header *header;
691 struct rtp_payload *payload;
695 size_t to_write, to_encode;
696 unsigned frame_count;
700 pa_assert(u->profile == PROFILE_A2DP);
703 /* First, render some data */
704 if (!u->write_memchunk.memblock)
705 pa_sink_render_full(u->sink, u->write_block_size, &u->write_memchunk);
707 pa_assert(u->write_memchunk.length == u->write_block_size);
709 a2dp_prepare_buffer(u);
712 header = a2dp->buffer;
713 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
717 /* Try to create a packet of the full MTU */
719 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
720 to_encode = u->write_memchunk.length;
722 d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
723 to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload);
725 while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
729 encoded = sbc_encode(&a2dp->sbc,
734 if (PA_UNLIKELY(encoded <= 0)) {
735 pa_log_error("SBC encoding error (%li)", (long) encoded);
736 pa_memblock_release(u->write_memchunk.memblock);
740 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
741 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
743 pa_assert_fp((size_t) encoded <= to_encode);
744 pa_assert_fp((size_t) encoded == a2dp->codesize);
746 pa_assert_fp((size_t) written <= to_write);
747 pa_assert_fp((size_t) written == a2dp->frame_length);
749 p = (const uint8_t*) p + encoded;
750 to_encode -= encoded;
752 d = (uint8_t*) d + written;
758 pa_memblock_release(u->write_memchunk.memblock);
760 pa_assert(to_encode == 0);
763 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc)));
766 /* write it to the fifo */
767 memset(a2dp->buffer, 0, sizeof(*header) + sizeof(*payload));
770 header->sequence_number = htons(a2dp->seq_num++);
771 header->timestamp = htonl(u->write_index / pa_frame_size(&u->sample_spec));
772 header->ssrc = htonl(1);
773 payload->frame_count = frame_count;
775 nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer;
780 l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type);
787 /* Retry right away if we got interrupted */
790 else if (errno == EAGAIN)
791 /* Hmm, apparently the socket was not writable, give up for now */
794 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno));
799 pa_assert((size_t) l <= nbytes);
801 if ((size_t) l != nbytes) {
802 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
803 (unsigned long long) l,
804 (unsigned long long) nbytes);
809 u->write_index += (uint64_t) u->write_memchunk.length;
810 pa_memblock_unref(u->write_memchunk.memblock);
811 pa_memchunk_reset(&u->write_memchunk);
821 static int a2dp_process_push(struct userdata *u) {
823 pa_memchunk memchunk;
826 pa_assert(u->profile == PROFILE_A2DP_SOURCE);
827 pa_assert(u->source);
828 pa_assert(u->read_smoother);
830 memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size);
831 memchunk.index = memchunk.length = 0;
834 pa_bool_t found_tstamp = FALSE;
836 struct a2dp_info *a2dp;
837 struct rtp_header *header;
838 struct rtp_payload *payload;
842 size_t to_write, to_decode;
844 a2dp_prepare_buffer(u);
847 header = a2dp->buffer;
848 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
850 l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type);
854 if (l < 0 && errno == EINTR)
855 /* Retry right away if we got interrupted */
858 else if (l < 0 && errno == EAGAIN)
859 /* Hmm, apparently the socket was not readable, give up for now. */
862 pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
867 pa_assert((size_t) l <= a2dp->buffer_size);
869 u->read_index += (uint64_t) l;
871 /* TODO: get timestamp from rtp */
873 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
874 tstamp = pa_rtclock_now();
877 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
878 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
880 p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
881 to_decode = l - sizeof(*header) - sizeof(*payload);
883 d = pa_memblock_acquire(memchunk.memblock);
884 to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock);
886 while (PA_LIKELY(to_decode > 0)) {
890 decoded = sbc_decode(&a2dp->sbc,
895 if (PA_UNLIKELY(decoded <= 0)) {
896 pa_log_error("SBC decoding error (%li)", (long) decoded);
897 pa_memblock_release(memchunk.memblock);
898 pa_memblock_unref(memchunk.memblock);
902 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
903 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
905 /* Reset frame length, it can be changed due to bitpool change */
906 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
908 pa_assert_fp((size_t) decoded <= to_decode);
909 pa_assert_fp((size_t) decoded == a2dp->frame_length);
911 pa_assert_fp((size_t) written == a2dp->codesize);
913 p = (const uint8_t*) p + decoded;
914 to_decode -= decoded;
916 d = (uint8_t*) d + written;
920 memchunk.length -= to_write;
922 pa_memblock_release(memchunk.memblock);
924 pa_source_post(u->source, &memchunk);
930 pa_memblock_unref(memchunk.memblock);
935 static void a2dp_reduce_bitpool(struct userdata *u)
937 struct a2dp_info *a2dp;
944 /* Check if bitpool is already at its limit */
945 if (a2dp->sbc.bitpool <= BITPOOL_DEC_LIMIT)
948 bitpool = a2dp->sbc.bitpool - BITPOOL_DEC_STEP;
950 if (bitpool < BITPOOL_DEC_LIMIT)
951 bitpool = BITPOOL_DEC_LIMIT;
953 a2dp_set_bitpool(u, bitpool);
956 static void thread_func(void *userdata) {
957 struct userdata *u = userdata;
958 unsigned do_write = 0;
959 unsigned pending_read_bytes = 0;
960 pa_bool_t writable = FALSE;
963 pa_assert(u->transport);
965 pa_log_debug("IO Thread starting up");
967 if (u->core->realtime_scheduling)
968 pa_make_realtime(u->core->realtime_priority);
970 pa_thread_mq_install(&u->thread_mq);
972 if (bt_transport_acquire(u, TRUE) < 0)
976 struct pollfd *pollfd;
978 pa_bool_t disable_timer = TRUE;
980 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
982 if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) {
984 /* We should send two blocks to the device before we expect
987 if (u->write_index == 0 && u->read_index <= 0)
990 if (pollfd && (pollfd->revents & POLLIN)) {
993 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW)
994 n_read = hsp_process_push(u);
996 n_read = a2dp_process_push(u);
1001 /* We just read something, so we are supposed to write something, too */
1002 pending_read_bytes += n_read;
1003 do_write += pending_read_bytes / u->write_block_size;
1004 pending_read_bytes = pending_read_bytes % u->write_block_size;
1008 if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) {
1010 if (u->sink->thread_info.rewind_requested)
1011 pa_sink_process_rewind(u->sink, 0);
1014 if (pollfd->revents & POLLOUT)
1017 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
1018 pa_usec_t time_passed;
1019 pa_usec_t audio_sent;
1021 /* Hmm, there is no input stream we could synchronize
1022 * to. So let's do things by time */
1024 time_passed = pa_rtclock_now() - u->started_at;
1025 audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1027 if (audio_sent <= time_passed) {
1028 pa_usec_t audio_to_send = time_passed - audio_sent;
1030 /* Never try to catch up for more than 100ms */
1031 if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) {
1032 pa_usec_t skip_usec;
1033 uint64_t skip_bytes;
1035 skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
1036 skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
1038 if (skip_bytes > 0) {
1041 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1042 (unsigned long long) skip_usec,
1043 (unsigned long long) skip_bytes);
1045 pa_sink_render_full(u->sink, skip_bytes, &tmp);
1046 pa_memblock_unref(tmp.memblock);
1047 u->write_index += skip_bytes;
1049 if (u->profile == PROFILE_A2DP)
1050 a2dp_reduce_bitpool(u);
1055 pending_read_bytes = 0;
1059 if (writable && do_write > 0) {
1062 if (u->write_index <= 0)
1063 u->started_at = pa_rtclock_now();
1065 if (u->profile == PROFILE_A2DP) {
1066 if ((n_written = a2dp_process_render(u)) < 0)
1069 if ((n_written = hsp_process_render(u)) < 0)
1074 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1076 do_write -= n_written;
1080 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0) {
1081 pa_usec_t sleep_for;
1082 pa_usec_t time_passed, next_write_at;
1085 /* Hmm, there is no input stream we could synchronize
1086 * to. So let's estimate when we need to wake up the latest */
1087 time_passed = pa_rtclock_now() - u->started_at;
1088 next_write_at = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1089 sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0;
1090 /* 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); */
1092 /* drop stream every 500 ms */
1093 sleep_for = PA_USEC_PER_MSEC * 500;
1095 pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for);
1096 disable_timer = FALSE;
1102 pa_rtpoll_set_timer_disabled(u->rtpoll);
1104 /* Hmm, nothing to do. Let's sleep */
1106 pollfd->events = (short) (((u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state) && !writable) ? POLLOUT : 0) |
1107 (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state) ? POLLIN : 0));
1109 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) {
1110 pa_log_debug("pa_rtpoll_run failed with: %d", ret);
1114 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1115 bt_transport_release(u);
1119 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1121 if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) {
1122 pa_log_info("FD error: %s%s%s%s",
1123 pollfd->revents & POLLERR ? "POLLERR " :"",
1124 pollfd->revents & POLLHUP ? "POLLHUP " :"",
1125 pollfd->revents & POLLPRI ? "POLLPRI " :"",
1126 pollfd->revents & POLLNVAL ? "POLLNVAL " :"");
1132 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1133 pa_log_debug("IO thread failed");
1134 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_IO_THREAD_FAILED, NULL, 0, NULL, NULL);
1135 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1138 pa_log_debug("IO thread shutting down");
1141 static pa_bt_audio_state_t parse_state_property_change(DBusMessage *m) {
1142 DBusMessageIter iter;
1143 DBusMessageIter variant;
1146 pa_bt_audio_state_t state;
1148 if (!dbus_message_iter_init(m, &iter)) {
1149 pa_log("Failed to parse PropertyChanged");
1150 return PA_BT_AUDIO_STATE_INVALID;
1153 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
1154 pa_log("Property name not a string");
1155 return PA_BT_AUDIO_STATE_INVALID;
1158 dbus_message_iter_get_basic(&iter, &key);
1160 if (!pa_streq(key, "State"))
1161 return PA_BT_AUDIO_STATE_INVALID;
1163 if (!dbus_message_iter_next(&iter)) {
1164 pa_log("Property value missing");
1165 return PA_BT_AUDIO_STATE_INVALID;
1168 dbus_message_iter_recurse(&iter, &variant);
1170 if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_STRING) {
1171 pa_log("Property value not a string");
1172 return PA_BT_AUDIO_STATE_INVALID;
1175 dbus_message_iter_get_basic(&variant, &value);
1177 pa_log_debug("dbus: %s property 'State' changed to value '%s'", dbus_message_get_interface(m), value);
1179 state = pa_bt_audio_state_from_string(value);
1181 if (state == PA_BT_AUDIO_STATE_INVALID)
1182 pa_log("Unexpected value for property 'State': '%s'", value);
1187 /* Run from main thread */
1188 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
1194 pa_assert_se(u = userdata);
1196 dbus_error_init(&err);
1198 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1199 dbus_message_get_interface(m),
1200 dbus_message_get_path(m),
1201 dbus_message_get_member(m));
1203 if (!dbus_message_has_path(m, u->path) && !dbus_message_has_path(m, u->transport))
1206 if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") ||
1207 dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1212 if (!dbus_message_get_args(m, &err, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID) || gain > HSP_MAX_GAIN) {
1213 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err.message);
1217 if (u->profile == PROFILE_HSP) {
1218 if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) {
1219 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1221 /* increment volume by one to correct rounding errors */
1222 if (volume < PA_VOLUME_NORM)
1225 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1226 pa_sink_volume_changed(u->sink, &v);
1228 } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1229 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1231 /* increment volume by one to correct rounding errors */
1232 if (volume < PA_VOLUME_NORM)
1235 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1236 pa_source_volume_changed(u->source, &v);
1239 } else if (dbus_message_is_signal(m, "org.bluez.HandsfreeGateway", "PropertyChanged")) {
1240 pa_bt_audio_state_t state = parse_state_property_change(m);
1243 case PA_BT_AUDIO_STATE_INVALID:
1244 case PA_BT_AUDIO_STATE_DISCONNECTED:
1245 case PA_BT_AUDIO_STATE_CONNECTED:
1246 case PA_BT_AUDIO_STATE_CONNECTING:
1249 case PA_BT_AUDIO_STATE_PLAYING:
1251 pa_log_debug("Changing profile to hfgw");
1252 if (pa_card_set_profile(u->card, "hfgw", FALSE) < 0)
1253 pa_log("Failed to change profile to hfgw");
1260 dbus_error_free(&err);
1262 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1265 /* Run from main thread */
1266 static void sink_set_volume_cb(pa_sink *s) {
1276 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1277 u = pa_shared_get(s->core, k);
1281 pa_assert(u->sink == s);
1282 pa_assert(u->profile == PROFILE_HSP);
1284 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1286 if (gain > HSP_MAX_GAIN)
1287 gain = HSP_MAX_GAIN;
1289 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1291 /* increment volume by one to correct rounding errors */
1292 if (volume < PA_VOLUME_NORM)
1295 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1297 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetSpeakerGain"));
1298 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1299 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1300 dbus_message_unref(m);
1303 /* Run from main thread */
1304 static void source_set_volume_cb(pa_source *s) {
1314 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1315 u = pa_shared_get(s->core, k);
1319 pa_assert(u->source == s);
1320 pa_assert(u->profile == PROFILE_HSP);
1322 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1324 if (gain > HSP_MAX_GAIN)
1325 gain = HSP_MAX_GAIN;
1327 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1329 /* increment volume by one to correct rounding errors */
1330 if (volume < PA_VOLUME_NORM)
1333 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1335 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetMicrophoneGain"));
1336 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1337 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1338 dbus_message_unref(m);
1341 /* Run from main thread */
1342 static char *get_name(const char *type, pa_modargs *ma, const char *device_id, pa_bool_t *namereg_fail) {
1348 pa_assert(device_id);
1349 pa_assert(namereg_fail);
1351 t = pa_sprintf_malloc("%s_name", type);
1352 n = pa_modargs_get_value(ma, t, NULL);
1356 *namereg_fail = TRUE;
1357 return pa_xstrdup(n);
1360 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1361 *namereg_fail = TRUE;
1364 *namereg_fail = FALSE;
1367 return pa_sprintf_malloc("bluez_%s.%s", type, n);
1370 static int sco_over_pcm_state_update(struct userdata *u, pa_bool_t changed) {
1372 pa_assert(USE_SCO_OVER_PCM(u));
1374 if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) ||
1375 PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) {
1377 if (u->stream_fd >= 0)
1380 pa_log_debug("Resuming SCO over PCM");
1381 if (init_profile(u) < 0) {
1382 pa_log("Can't resume SCO over PCM");
1386 return bt_transport_acquire(u, TRUE);
1390 if (u->stream_fd < 0)
1393 pa_log_debug("Closing SCO over PCM");
1395 bt_transport_release(u);
1401 static pa_hook_result_t sink_state_changed_cb(pa_core *c, pa_sink *s, struct userdata *u) {
1403 pa_sink_assert_ref(s);
1406 if (s != u->hsp.sco_sink)
1409 sco_over_pcm_state_update(u, TRUE);
1414 static pa_hook_result_t source_state_changed_cb(pa_core *c, pa_source *s, struct userdata *u) {
1416 pa_source_assert_ref(s);
1419 if (s != u->hsp.sco_source)
1422 sco_over_pcm_state_update(u, TRUE);
1427 static pa_hook_result_t nrec_changed_cb(pa_bluetooth_transport *t, void *call_data, struct userdata *u) {
1433 p = pa_proplist_new();
1434 pa_proplist_sets(p, "bluetooth.nrec", t->nrec ? "1" : "0");
1435 pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, p);
1436 pa_proplist_free(p);
1441 static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_direction_t direction) {
1443 pa_sink_new_data *sink_new_data;
1444 pa_source_new_data *source_new_data;
1446 pa_device_port *port;
1448 if (direction == PA_DIRECTION_OUTPUT) {
1449 data.sink_new_data = sink_or_source_new_data;
1450 data.sink_new_data->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
1452 data.source_new_data = sink_or_source_new_data;
1453 data.source_new_data->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
1456 switch (u->profile) {
1458 pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-output"));
1459 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1460 pa_device_port_ref(port);
1463 case PROFILE_A2DP_SOURCE:
1464 pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-input"));
1465 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1466 pa_device_port_ref(port);
1470 if (direction == PA_DIRECTION_OUTPUT) {
1471 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-output"));
1472 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1474 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-input"));
1475 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1477 pa_device_port_ref(port);
1481 if (direction == PA_DIRECTION_OUTPUT) {
1482 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hfgw-output"));
1483 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1485 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hfgw-input"));
1486 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1488 pa_device_port_ref(port);
1492 pa_assert_not_reached();
1496 static const char *profile_to_string(enum profile profile) {
1500 case PROFILE_A2DP_SOURCE:
1501 return "a2dp_source";
1507 pa_assert_not_reached();
1511 /* Run from main thread */
1512 static int add_sink(struct userdata *u) {
1515 if (USE_SCO_OVER_PCM(u)) {
1518 u->sink = u->hsp.sco_sink;
1519 p = pa_proplist_new();
1520 pa_proplist_sets(p, "bluetooth.protocol", profile_to_string(u->profile));
1521 pa_proplist_update(u->sink->proplist, PA_UPDATE_MERGE, p);
1522 pa_proplist_free(p);
1524 if (!u->hsp.sink_state_changed_slot)
1525 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);
1528 pa_sink_new_data data;
1531 pa_sink_new_data_init(&data);
1532 data.driver = __FILE__;
1533 data.module = u->module;
1534 pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
1535 pa_proplist_sets(data.proplist, "bluetooth.protocol", profile_to_string(u->profile));
1536 if (u->profile == PROFILE_HSP)
1537 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1538 data.card = u->card;
1539 data.name = get_name("sink", u->modargs, u->address, &b);
1540 data.namereg_fail = b;
1542 if (pa_modargs_get_proplist(u->modargs, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1543 pa_log("Invalid properties");
1544 pa_sink_new_data_done(&data);
1547 connect_ports(u, &data, PA_DIRECTION_OUTPUT);
1549 u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY);
1550 pa_sink_new_data_done(&data);
1553 pa_log_error("Failed to create sink");
1557 u->sink->userdata = u;
1558 u->sink->parent.process_msg = sink_process_msg;
1560 pa_sink_set_max_request(u->sink, u->write_block_size);
1561 pa_sink_set_fixed_latency(u->sink,
1562 (u->profile == PROFILE_A2DP ? FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_HSP) +
1563 pa_bytes_to_usec(u->write_block_size, &u->sample_spec));
1566 if (u->profile == PROFILE_HSP) {
1567 pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
1568 u->sink->n_volume_steps = 16;
1570 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1571 pa_shared_set(u->core, k, u);
1578 /* Run from main thread */
1579 static int add_source(struct userdata *u) {
1582 if (USE_SCO_OVER_PCM(u)) {
1583 u->source = u->hsp.sco_source;
1584 pa_proplist_sets(u->source->proplist, "bluetooth.protocol", profile_to_string(u->profile));
1586 if (!u->hsp.source_state_changed_slot)
1587 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);
1590 pa_source_new_data data;
1593 pa_source_new_data_init(&data);
1594 data.driver = __FILE__;
1595 data.module = u->module;
1596 pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
1597 pa_proplist_sets(data.proplist, "bluetooth.protocol", profile_to_string(u->profile));
1598 if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW))
1599 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1601 data.card = u->card;
1602 data.name = get_name("source", u->modargs, u->address, &b);
1603 data.namereg_fail = b;
1605 if (pa_modargs_get_proplist(u->modargs, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1606 pa_log("Invalid properties");
1607 pa_source_new_data_done(&data);
1611 connect_ports(u, &data, PA_DIRECTION_INPUT);
1612 u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY);
1613 pa_source_new_data_done(&data);
1616 pa_log_error("Failed to create source");
1620 u->source->userdata = u;
1621 u->source->parent.process_msg = source_process_msg;
1623 pa_source_set_fixed_latency(u->source,
1624 (u->profile == PROFILE_A2DP_SOURCE ? FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_HSP) +
1625 pa_bytes_to_usec(u->read_block_size, &u->sample_spec));
1628 if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW)) {
1629 pa_bluetooth_transport *t;
1630 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1632 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0");
1634 if (!u->hsp.nrec_changed_slot)
1635 u->hsp.nrec_changed_slot = pa_hook_connect(&t->hooks[PA_BLUETOOTH_TRANSPORT_HOOK_NREC_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) nrec_changed_cb, u);
1638 if (u->profile == PROFILE_HSP) {
1639 pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
1640 u->source->n_volume_steps = 16;
1642 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1643 pa_shared_set(u->core, k, u);
1650 static void bt_transport_config_a2dp(struct userdata *u) {
1651 const pa_bluetooth_transport *t;
1652 struct a2dp_info *a2dp = &u->a2dp;
1655 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1658 config = (a2dp_sbc_t *) t->config;
1660 u->sample_spec.format = PA_SAMPLE_S16LE;
1662 if (a2dp->sbc_initialized)
1663 sbc_reinit(&a2dp->sbc, 0);
1665 sbc_init(&a2dp->sbc, 0);
1666 a2dp->sbc_initialized = TRUE;
1668 switch (config->frequency) {
1669 case BT_SBC_SAMPLING_FREQ_16000:
1670 a2dp->sbc.frequency = SBC_FREQ_16000;
1671 u->sample_spec.rate = 16000U;
1673 case BT_SBC_SAMPLING_FREQ_32000:
1674 a2dp->sbc.frequency = SBC_FREQ_32000;
1675 u->sample_spec.rate = 32000U;
1677 case BT_SBC_SAMPLING_FREQ_44100:
1678 a2dp->sbc.frequency = SBC_FREQ_44100;
1679 u->sample_spec.rate = 44100U;
1681 case BT_SBC_SAMPLING_FREQ_48000:
1682 a2dp->sbc.frequency = SBC_FREQ_48000;
1683 u->sample_spec.rate = 48000U;
1686 pa_assert_not_reached();
1689 switch (config->channel_mode) {
1690 case BT_A2DP_CHANNEL_MODE_MONO:
1691 a2dp->sbc.mode = SBC_MODE_MONO;
1692 u->sample_spec.channels = 1;
1694 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
1695 a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL;
1696 u->sample_spec.channels = 2;
1698 case BT_A2DP_CHANNEL_MODE_STEREO:
1699 a2dp->sbc.mode = SBC_MODE_STEREO;
1700 u->sample_spec.channels = 2;
1702 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
1703 a2dp->sbc.mode = SBC_MODE_JOINT_STEREO;
1704 u->sample_spec.channels = 2;
1707 pa_assert_not_reached();
1710 switch (config->allocation_method) {
1711 case BT_A2DP_ALLOCATION_SNR:
1712 a2dp->sbc.allocation = SBC_AM_SNR;
1714 case BT_A2DP_ALLOCATION_LOUDNESS:
1715 a2dp->sbc.allocation = SBC_AM_LOUDNESS;
1718 pa_assert_not_reached();
1721 switch (config->subbands) {
1722 case BT_A2DP_SUBBANDS_4:
1723 a2dp->sbc.subbands = SBC_SB_4;
1725 case BT_A2DP_SUBBANDS_8:
1726 a2dp->sbc.subbands = SBC_SB_8;
1729 pa_assert_not_reached();
1732 switch (config->block_length) {
1733 case BT_A2DP_BLOCK_LENGTH_4:
1734 a2dp->sbc.blocks = SBC_BLK_4;
1736 case BT_A2DP_BLOCK_LENGTH_8:
1737 a2dp->sbc.blocks = SBC_BLK_8;
1739 case BT_A2DP_BLOCK_LENGTH_12:
1740 a2dp->sbc.blocks = SBC_BLK_12;
1742 case BT_A2DP_BLOCK_LENGTH_16:
1743 a2dp->sbc.blocks = SBC_BLK_16;
1746 pa_assert_not_reached();
1749 a2dp->min_bitpool = config->min_bitpool;
1750 a2dp->max_bitpool = config->max_bitpool;
1752 /* Set minimum bitpool for source to get the maximum possible block_size */
1753 a2dp->sbc.bitpool = u->profile == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool;
1754 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
1755 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
1757 u->read_block_size =
1758 (u->read_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
1759 / a2dp->frame_length * a2dp->codesize;
1761 u->write_block_size =
1762 (u->write_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
1763 / a2dp->frame_length * a2dp->codesize;
1765 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
1766 a2dp->sbc.allocation, a2dp->sbc.subbands, a2dp->sbc.blocks, a2dp->sbc.bitpool);
1769 static void bt_transport_config(struct userdata *u) {
1770 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
1771 u->read_block_size = u->read_link_mtu;
1772 u->write_block_size = u->write_link_mtu;
1773 u->sample_spec.format = PA_SAMPLE_S16LE;
1774 u->sample_spec.channels = 1;
1775 u->sample_spec.rate = 8000;
1777 bt_transport_config_a2dp(u);
1780 /* Run from main thread */
1781 static int setup_bt(struct userdata *u) {
1782 const pa_bluetooth_device *d;
1783 const pa_bluetooth_transport *t;
1787 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
1788 pa_log_error("Failed to get device object.");
1792 /* release transport if exist */
1794 bt_transport_release(u);
1795 pa_xfree(u->transport);
1796 u->transport = NULL;
1799 /* check if profile has a transport */
1800 t = pa_bluetooth_device_get_transport(d, u->profile);
1802 pa_log_warn("Profile has no transport");
1806 u->transport = pa_xstrdup(t->path);
1808 if (bt_transport_acquire(u, FALSE) < 0)
1811 bt_transport_config(u);
1816 /* Run from main thread */
1817 static int init_profile(struct userdata *u) {
1820 pa_assert(u->profile != PROFILE_OFF);
1822 if (setup_bt(u) < 0)
1825 if (u->profile == PROFILE_A2DP ||
1826 u->profile == PROFILE_HSP ||
1827 u->profile == PROFILE_HFGW)
1828 if (add_sink(u) < 0)
1831 if (u->profile == PROFILE_HSP ||
1832 u->profile == PROFILE_A2DP_SOURCE ||
1833 u->profile == PROFILE_HFGW)
1834 if (add_source(u) < 0)
1840 /* Run from main thread */
1841 static void stop_thread(struct userdata *u) {
1847 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
1848 pa_thread_free(u->thread);
1852 if (u->rtpoll_item) {
1853 pa_rtpoll_item_free(u->rtpoll_item);
1854 u->rtpoll_item = NULL;
1857 if (u->hsp.sink_state_changed_slot) {
1858 pa_hook_slot_free(u->hsp.sink_state_changed_slot);
1859 u->hsp.sink_state_changed_slot = NULL;
1862 if (u->hsp.source_state_changed_slot) {
1863 pa_hook_slot_free(u->hsp.source_state_changed_slot);
1864 u->hsp.source_state_changed_slot = NULL;
1867 if (u->hsp.nrec_changed_slot) {
1868 pa_hook_slot_free(u->hsp.nrec_changed_slot);
1869 u->hsp.nrec_changed_slot = NULL;
1873 if (u->profile == PROFILE_HSP) {
1874 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1875 pa_shared_remove(u->core, k);
1879 pa_sink_unref(u->sink);
1884 if (u->profile == PROFILE_HSP) {
1885 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1886 pa_shared_remove(u->core, k);
1890 pa_source_unref(u->source);
1895 pa_thread_mq_done(&u->thread_mq);
1897 pa_rtpoll_free(u->rtpoll);
1901 if (u->read_smoother) {
1902 pa_smoother_free(u->read_smoother);
1903 u->read_smoother = NULL;
1907 /* Run from main thread */
1908 static int start_thread(struct userdata *u) {
1910 pa_assert(!u->thread);
1911 pa_assert(!u->rtpoll);
1912 pa_assert(!u->rtpoll_item);
1914 u->rtpoll = pa_rtpoll_new();
1915 pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
1917 if (USE_SCO_OVER_PCM(u)) {
1918 if (sco_over_pcm_state_update(u, FALSE) < 0) {
1922 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1923 pa_shared_remove(u->core, k);
1928 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1929 pa_shared_remove(u->core, k);
1936 pa_sink_ref(u->sink);
1937 pa_source_ref(u->source);
1938 /* FIXME: monitor stream_fd error */
1942 if (!(u->thread = pa_thread_new("bluetooth", thread_func, u))) {
1943 pa_log_error("Failed to create IO thread");
1949 pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
1950 pa_sink_set_rtpoll(u->sink, u->rtpoll);
1951 pa_sink_put(u->sink);
1953 if (u->sink->set_volume)
1954 u->sink->set_volume(u->sink);
1958 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
1959 pa_source_set_rtpoll(u->source, u->rtpoll);
1960 pa_source_put(u->source);
1962 if (u->source->set_volume)
1963 u->source->set_volume(u->source);
1969 static void save_sco_volume_callbacks(struct userdata *u) {
1971 pa_assert(USE_SCO_OVER_PCM(u));
1973 u->hsp.sco_sink_set_volume = u->hsp.sco_sink->set_volume;
1974 u->hsp.sco_source_set_volume = u->hsp.sco_source->set_volume;
1977 static void restore_sco_volume_callbacks(struct userdata *u) {
1979 pa_assert(USE_SCO_OVER_PCM(u));
1981 pa_sink_set_set_volume_callback(u->hsp.sco_sink, u->hsp.sco_sink_set_volume);
1982 pa_source_set_set_volume_callback(u->hsp.sco_source, u->hsp.sco_source_set_volume);
1985 /* Run from main thread */
1986 static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
1989 pa_queue *inputs = NULL, *outputs = NULL;
1990 const pa_bluetooth_device *device;
1993 pa_assert(new_profile);
1994 pa_assert_se(u = c->userdata);
1996 d = PA_CARD_PROFILE_DATA(new_profile);
1998 if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
1999 pa_log_error("Failed to get device object.");
2003 /* The state signal is sent by bluez, so it is racy to check
2004 strictly for CONNECTED, we should also accept STREAMING state
2005 as being good enough. However, if the profile is used
2006 concurrently (which is unlikely), ipc will fail later on, and
2007 module will be unloaded. */
2008 if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
2009 pa_log_warn("HSP is not connected, refused to switch profile");
2011 } else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) {
2012 pa_log_warn("A2DP Sink is not connected, refused to switch profile");
2014 } else if (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) {
2015 pa_log_warn("A2DP Source is not connected, refused to switch profile");
2017 } else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) {
2018 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
2023 inputs = pa_sink_move_all_start(u->sink, NULL);
2025 if (!USE_SCO_OVER_PCM(u))
2026 pa_sink_unlink(u->sink);
2030 outputs = pa_source_move_all_start(u->source, NULL);
2032 if (!USE_SCO_OVER_PCM(u))
2033 pa_source_unlink(u->source);
2038 if (u->profile != PROFILE_OFF && u->transport) {
2039 bt_transport_release(u);
2040 pa_xfree(u->transport);
2041 u->transport = NULL;
2044 if (USE_SCO_OVER_PCM(u))
2045 restore_sco_volume_callbacks(u);
2048 u->sample_spec = u->requested_sample_spec;
2050 if (USE_SCO_OVER_PCM(u))
2051 save_sco_volume_callbacks(u);
2053 if (u->profile != PROFILE_OFF)
2056 if (u->sink || u->source)
2061 pa_sink_move_all_finish(u->sink, inputs, FALSE);
2063 pa_sink_move_all_fail(inputs);
2068 pa_source_move_all_finish(u->source, outputs, FALSE);
2070 pa_source_move_all_fail(outputs);
2076 static void create_ports_for_profile(struct userdata *u, pa_card_new_data *card_new_data, pa_card_profile *profile) {
2077 pa_device_port *port;
2080 d = PA_CARD_PROFILE_DATA(profile);
2084 pa_assert_se(port = pa_device_port_new(u->core, "a2dp-output", _("Bluetooth High Quality (A2DP)"), 0));
2085 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2086 port->is_output = 1;
2088 port->priority = profile->priority * 100;
2089 pa_hashmap_put(port->profiles, profile->name, profile);
2092 case PROFILE_A2DP_SOURCE:
2093 pa_assert_se(port = pa_device_port_new(u->core, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2094 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2095 port->is_output = 0;
2097 port->priority = profile->priority * 100;
2098 pa_hashmap_put(port->profiles, profile->name, profile);
2102 pa_assert_se(port = pa_device_port_new(u->core, "hsp-output", _("Bluetooth Telephony (HSP/HFP)"), 0));
2103 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2104 port->is_output = 1;
2106 port->priority = profile->priority * 100;
2107 pa_hashmap_put(port->profiles, profile->name, profile);
2109 pa_assert_se(port = pa_device_port_new(u->core, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2110 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2111 port->is_output = 0;
2113 port->priority = profile->priority * 100;
2114 pa_hashmap_put(port->profiles, profile->name, profile);
2118 pa_assert_se(port = pa_device_port_new(u->core, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2119 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2120 port->is_output = 1;
2122 port->priority = profile->priority * 100;
2123 pa_hashmap_put(port->profiles, profile->name, profile);
2125 pa_assert_se(port = pa_device_port_new(u->core, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2126 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2127 port->is_output = 0;
2129 port->priority = profile->priority * 100;
2130 pa_hashmap_put(port->profiles, profile->name, profile);
2134 pa_assert_not_reached();
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);
2193 create_ports_for_profile(u, &data, p);
2195 pa_hashmap_put(data.profiles, p->name, p);
2198 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SOURCE_UUID)) {
2199 p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile));
2203 p->max_sink_channels = 0;
2204 p->max_source_channels = 2;
2206 d = PA_CARD_PROFILE_DATA(p);
2207 *d = PROFILE_A2DP_SOURCE;
2208 create_ports_for_profile(u, &data, p);
2210 pa_hashmap_put(data.profiles, p->name, p);
2213 if (pa_bluetooth_uuid_has(device->uuids, HSP_HS_UUID) ||
2214 pa_bluetooth_uuid_has(device->uuids, HFP_HS_UUID)) {
2215 p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile));
2219 p->max_sink_channels = 1;
2220 p->max_source_channels = 1;
2222 d = PA_CARD_PROFILE_DATA(p);
2224 create_ports_for_profile(u, &data, p);
2226 pa_hashmap_put(data.profiles, p->name, p);
2229 if (pa_bluetooth_uuid_has(device->uuids, HFP_AG_UUID)) {
2230 p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile));
2234 p->max_sink_channels = 1;
2235 p->max_source_channels = 1;
2237 d = PA_CARD_PROFILE_DATA(p);
2239 create_ports_for_profile(u, &data, p);
2241 pa_hashmap_put(data.profiles, p->name, p);
2244 pa_assert(!pa_hashmap_isempty(data.profiles));
2246 p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
2247 d = PA_CARD_PROFILE_DATA(p);
2249 pa_hashmap_put(data.profiles, p->name, p);
2251 if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
2252 if (pa_hashmap_get(data.profiles, default_profile))
2253 pa_card_new_data_set_profile(&data, default_profile);
2255 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile);
2258 u->card = pa_card_new(u->core, &data);
2259 pa_card_new_data_done(&data);
2262 pa_log("Failed to allocate card.");
2266 u->card->userdata = u;
2267 u->card->set_profile = card_set_profile;
2269 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2271 if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) ||
2272 (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) ||
2273 (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) ||
2274 (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW)) {
2275 pa_log_warn("Default profile not connected, selecting off profile");
2276 u->card->active_profile = pa_hashmap_get(u->card->profiles, "off");
2277 u->card->save_profile = FALSE;
2280 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2283 if (USE_SCO_OVER_PCM(u))
2284 save_sco_volume_callbacks(u);
2289 /* Run from main thread */
2290 static const pa_bluetooth_device* find_device(struct userdata *u, const char *address, const char *path) {
2291 const pa_bluetooth_device *d = NULL;
2295 if (!address && !path) {
2296 pa_log_error("Failed to get device address/path from module arguments.");
2301 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, path))) {
2302 pa_log_error("%s is not a valid BlueZ audio device.", path);
2306 if (address && !(pa_streq(d->address, address))) {
2307 pa_log_error("Passed path %s address %s != %s don't match.", path, d->address, address);
2312 if (!(d = pa_bluetooth_discovery_get_by_address(u->discovery, address))) {
2313 pa_log_error("%s is not known.", address);
2319 u->address = pa_xstrdup(d->address);
2320 u->path = pa_xstrdup(d->path);
2326 /* Run from main thread */
2327 static int setup_dbus(struct userdata *u) {
2330 dbus_error_init(&err);
2332 u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err);
2334 if (dbus_error_is_set(&err) || !u->connection) {
2335 pa_log("Failed to get D-Bus connection: %s", err.message);
2336 dbus_error_free(&err);
2343 int pa__init(pa_module* m) {
2347 const char *address, *path;
2349 char *mike, *speaker;
2350 const pa_bluetooth_device *device;
2354 dbus_error_init(&err);
2356 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
2357 pa_log_error("Failed to parse module arguments");
2361 m->userdata = u = pa_xnew0(struct userdata, 1);
2365 u->sample_spec = m->core->default_sample_spec;
2368 if (pa_modargs_get_value(ma, "sco_sink", NULL) &&
2369 !(u->hsp.sco_sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_sink", NULL), PA_NAMEREG_SINK))) {
2370 pa_log("SCO sink not found");
2374 if (pa_modargs_get_value(ma, "sco_source", NULL) &&
2375 !(u->hsp.sco_source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_source", NULL), PA_NAMEREG_SOURCE))) {
2376 pa_log("SCO source not found");
2380 if (pa_modargs_get_value_u32(ma, "rate", &u->sample_spec.rate) < 0 ||
2381 u->sample_spec.rate <= 0 || u->sample_spec.rate > PA_RATE_MAX) {
2382 pa_log_error("Failed to get rate from module arguments");
2386 u->auto_connect = TRUE;
2387 if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) {
2388 pa_log("Failed to parse auto_connect= argument");
2392 channels = u->sample_spec.channels;
2393 if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
2394 channels <= 0 || channels > PA_CHANNELS_MAX) {
2395 pa_log_error("Failed to get channels from module arguments");
2398 u->sample_spec.channels = (uint8_t) channels;
2399 u->requested_sample_spec = u->sample_spec;
2401 address = pa_modargs_get_value(ma, "address", NULL);
2402 path = pa_modargs_get_value(ma, "path", NULL);
2404 if (setup_dbus(u) < 0)
2407 if (!(u->discovery = pa_bluetooth_discovery_get(m->core)))
2410 if (!(device = find_device(u, address, path)))
2413 /* Add the card structure. This will also initialize the default profile */
2414 if (add_card(u, device) < 0)
2417 if (!(u->msg = pa_msgobject_new(bluetooth_msg)))
2420 u->msg->parent.process_msg = device_process_msg;
2421 u->msg->card = u->card;
2423 if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) {
2424 pa_log_error("Failed to add filter function");
2427 u->filter_added = TRUE;
2429 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2430 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2432 if (pa_dbus_add_matches(
2433 pa_dbus_connection_get(u->connection), &err,
2436 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2437 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2443 pa_log("Failed to add D-Bus matches: %s", err.message);
2450 if (u->profile != PROFILE_OFF)
2451 if (init_profile(u) < 0)
2454 if (u->sink || u->source)
2455 if (start_thread(u) < 0)
2464 dbus_error_free(&err);
2469 int pa__get_n_used(pa_module *m) {
2473 pa_assert_se(u = m->userdata);
2476 (u->sink ? pa_sink_linked_by(u->sink) : 0) +
2477 (u->source ? pa_source_linked_by(u->source) : 0);
2480 void pa__done(pa_module *m) {
2485 if (!(u = m->userdata))
2488 if (u->sink && !USE_SCO_OVER_PCM(u))
2489 pa_sink_unlink(u->sink);
2491 if (u->source && !USE_SCO_OVER_PCM(u))
2492 pa_source_unlink(u->source);
2496 if (USE_SCO_OVER_PCM(u))
2497 restore_sco_volume_callbacks(u);
2499 if (u->connection) {
2502 char *speaker, *mike;
2503 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2504 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2506 pa_dbus_remove_matches(pa_dbus_connection_get(u->connection), speaker, mike,
2507 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2508 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2515 if (u->filter_added)
2516 dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
2518 pa_dbus_connection_unref(u->connection);
2525 pa_card_free(u->card);
2527 if (u->read_smoother)
2528 pa_smoother_free(u->read_smoother);
2531 pa_xfree(u->a2dp.buffer);
2533 sbc_finish(&u->a2dp.sbc);
2536 pa_modargs_free(u->modargs);
2538 pa_xfree(u->address);
2542 bt_transport_release(u);
2543 pa_xfree(u->transport);
2547 pa_bluetooth_discovery_unref(u->discovery);