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 (u->transport == NULL) {
330 pa_log("Transport no longer available.");
334 if (bt_transport_is_acquired(u)) {
340 pa_log_debug("Acquiring transport %s", u->transport);
342 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
344 pa_log("Transport %s no longer available", u->transport);
345 pa_xfree(u->transport);
350 u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype, &u->read_link_mtu, &u->write_link_mtu);
351 if (u->stream_fd < 0)
354 u->accesstype = pa_xstrdup(accesstype);
355 pa_log_info("Transport %s acquired: fd %d", u->transport, u->stream_fd);
361 pa_log_info("Transport %s resuming", u->transport);
367 /* Run from IO thread */
368 static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
369 struct userdata *u = PA_SINK(o)->userdata;
370 pa_bool_t failed = FALSE;
373 pa_assert(u->sink == PA_SINK(o));
374 pa_assert(u->transport);
378 case PA_SINK_MESSAGE_SET_STATE:
380 switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
382 case PA_SINK_SUSPENDED:
383 pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));
385 /* Stop the device if the source is suspended as well */
386 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED)
387 /* We deliberately ignore whether stopping
388 * actually worked. Since the stream_fd is
389 * closed it doesn't really matter */
390 bt_transport_release(u);
395 case PA_SINK_RUNNING:
396 if (u->sink->thread_info.state != PA_SINK_SUSPENDED)
399 /* Resume the device if the source was suspended as well */
400 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) {
401 if (bt_transport_acquire(u, TRUE) < 0)
406 case PA_SINK_UNLINKED:
408 case PA_SINK_INVALID_STATE:
413 case PA_SINK_MESSAGE_GET_LATENCY: {
415 if (u->read_smoother) {
418 ri = pa_smoother_get(u->read_smoother, pa_rtclock_now());
419 wi = pa_bytes_to_usec(u->write_index + u->write_block_size, &u->sample_spec);
421 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
425 ri = pa_rtclock_now() - u->started_at;
426 wi = pa_bytes_to_usec(u->write_index, &u->sample_spec);
428 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
431 *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency;
436 r = pa_sink_process_msg(o, code, data, offset, chunk);
438 return (r < 0 || !failed) ? r : -1;
441 /* Run from IO thread */
442 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
443 struct userdata *u = PA_SOURCE(o)->userdata;
444 pa_bool_t failed = FALSE;
447 pa_assert(u->source == PA_SOURCE(o));
448 pa_assert(u->transport);
452 case PA_SOURCE_MESSAGE_SET_STATE:
454 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
456 case PA_SOURCE_SUSPENDED:
457 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
459 /* Stop the device if the sink is suspended as well */
460 if (!u->sink || u->sink->state == PA_SINK_SUSPENDED)
461 bt_transport_release(u);
463 if (u->read_smoother)
464 pa_smoother_pause(u->read_smoother, pa_rtclock_now());
468 case PA_SOURCE_RUNNING:
469 if (u->source->thread_info.state != PA_SOURCE_SUSPENDED)
472 /* Resume the device if the sink was suspended as well */
473 if (!u->sink || u->sink->thread_info.state == PA_SINK_SUSPENDED) {
474 if (bt_transport_acquire(u, TRUE) < 0)
477 /* We don't resume the smoother here. Instead we
478 * wait until the first packet arrives */
481 case PA_SOURCE_UNLINKED:
483 case PA_SOURCE_INVALID_STATE:
488 case PA_SOURCE_MESSAGE_GET_LATENCY: {
491 if (u->read_smoother) {
492 wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
493 ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
495 *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
497 *((pa_usec_t*) data) = 0;
504 r = pa_source_process_msg(o, code, data, offset, chunk);
506 return (r < 0 || !failed) ? r : -1;
509 /* Called from main thread context */
510 static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
511 struct bluetooth_msg *u = BLUETOOTH_MSG(obj);
514 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED: {
515 if (u->card->module->unload_requested)
518 pa_log_debug("Switching the profile to off due to IO thread failure.");
520 if (pa_card_set_profile(u->card, "off", FALSE) < 0)
521 pa_log_debug("Failed to switch profile to off");
528 /* Run from IO thread */
529 static int hsp_process_render(struct userdata *u) {
533 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
536 /* First, render some data */
537 if (!u->write_memchunk.memblock)
538 pa_sink_render_full(u->sink, u->write_block_size, &u->write_memchunk);
540 pa_assert(u->write_memchunk.length == u->write_block_size);
546 /* Now write that data to the socket. The socket is of type
547 * SEQPACKET, and we generated the data of the MTU size, so this
548 * should just work. */
550 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
551 l = pa_write(u->stream_fd, p, u->write_memchunk.length, &u->stream_write_type);
552 pa_memblock_release(u->write_memchunk.memblock);
559 /* Retry right away if we got interrupted */
562 else if (errno == EAGAIN)
563 /* Hmm, apparently the socket was not writable, give up for now */
566 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
571 pa_assert((size_t) l <= u->write_memchunk.length);
573 if ((size_t) l != u->write_memchunk.length) {
574 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
575 (unsigned long long) l,
576 (unsigned long long) u->write_memchunk.length);
581 u->write_index += (uint64_t) u->write_memchunk.length;
582 pa_memblock_unref(u->write_memchunk.memblock);
583 pa_memchunk_reset(&u->write_memchunk);
592 /* Run from IO thread */
593 static int hsp_process_push(struct userdata *u) {
595 pa_memchunk memchunk;
598 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
599 pa_assert(u->source);
600 pa_assert(u->read_smoother);
602 memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size);
603 memchunk.index = memchunk.length = 0;
612 pa_bool_t found_tstamp = FALSE;
615 memset(&m, 0, sizeof(m));
616 memset(&aux, 0, sizeof(aux));
617 memset(&iov, 0, sizeof(iov));
622 m.msg_controllen = sizeof(aux);
624 p = pa_memblock_acquire(memchunk.memblock);
626 iov.iov_len = pa_memblock_get_length(memchunk.memblock);
627 l = recvmsg(u->stream_fd, &m, 0);
628 pa_memblock_release(memchunk.memblock);
632 if (l < 0 && errno == EINTR)
633 /* Retry right away if we got interrupted */
636 else if (l < 0 && errno == EAGAIN)
637 /* Hmm, apparently the socket was not readable, give up for now. */
640 pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
645 pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock));
647 memchunk.length = (size_t) l;
648 u->read_index += (uint64_t) l;
650 for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
651 if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) {
652 struct timeval *tv = (struct timeval*) CMSG_DATA(cm);
653 pa_rtclock_from_wallclock(tv);
654 tstamp = pa_timeval_load(tv);
660 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
661 tstamp = pa_rtclock_now();
664 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
665 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
667 pa_source_post(u->source, &memchunk);
673 pa_memblock_unref(memchunk.memblock);
678 /* Run from IO thread */
679 static void a2dp_prepare_buffer(struct userdata *u) {
680 size_t min_buffer_size = PA_MAX(u->read_link_mtu, u->write_link_mtu);
684 if (u->a2dp.buffer_size >= min_buffer_size)
687 u->a2dp.buffer_size = 2 * min_buffer_size;
688 pa_xfree(u->a2dp.buffer);
689 u->a2dp.buffer = pa_xmalloc(u->a2dp.buffer_size);
692 /* Run from IO thread */
693 static int a2dp_process_render(struct userdata *u) {
694 struct a2dp_info *a2dp;
695 struct rtp_header *header;
696 struct rtp_payload *payload;
700 size_t to_write, to_encode;
701 unsigned frame_count;
705 pa_assert(u->profile == PROFILE_A2DP);
708 /* First, render some data */
709 if (!u->write_memchunk.memblock)
710 pa_sink_render_full(u->sink, u->write_block_size, &u->write_memchunk);
712 pa_assert(u->write_memchunk.length == u->write_block_size);
714 a2dp_prepare_buffer(u);
717 header = a2dp->buffer;
718 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
722 /* Try to create a packet of the full MTU */
724 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
725 to_encode = u->write_memchunk.length;
727 d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
728 to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload);
730 while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
734 encoded = sbc_encode(&a2dp->sbc,
739 if (PA_UNLIKELY(encoded <= 0)) {
740 pa_log_error("SBC encoding error (%li)", (long) encoded);
741 pa_memblock_release(u->write_memchunk.memblock);
745 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
746 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
748 pa_assert_fp((size_t) encoded <= to_encode);
749 pa_assert_fp((size_t) encoded == a2dp->codesize);
751 pa_assert_fp((size_t) written <= to_write);
752 pa_assert_fp((size_t) written == a2dp->frame_length);
754 p = (const uint8_t*) p + encoded;
755 to_encode -= encoded;
757 d = (uint8_t*) d + written;
763 pa_memblock_release(u->write_memchunk.memblock);
765 pa_assert(to_encode == 0);
768 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc)));
771 /* write it to the fifo */
772 memset(a2dp->buffer, 0, sizeof(*header) + sizeof(*payload));
775 header->sequence_number = htons(a2dp->seq_num++);
776 header->timestamp = htonl(u->write_index / pa_frame_size(&u->sample_spec));
777 header->ssrc = htonl(1);
778 payload->frame_count = frame_count;
780 nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer;
785 l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type);
792 /* Retry right away if we got interrupted */
795 else if (errno == EAGAIN)
796 /* Hmm, apparently the socket was not writable, give up for now */
799 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno));
804 pa_assert((size_t) l <= nbytes);
806 if ((size_t) l != nbytes) {
807 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
808 (unsigned long long) l,
809 (unsigned long long) nbytes);
814 u->write_index += (uint64_t) u->write_memchunk.length;
815 pa_memblock_unref(u->write_memchunk.memblock);
816 pa_memchunk_reset(&u->write_memchunk);
826 static int a2dp_process_push(struct userdata *u) {
828 pa_memchunk memchunk;
831 pa_assert(u->profile == PROFILE_A2DP_SOURCE);
832 pa_assert(u->source);
833 pa_assert(u->read_smoother);
835 memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size);
836 memchunk.index = memchunk.length = 0;
839 pa_bool_t found_tstamp = FALSE;
841 struct a2dp_info *a2dp;
842 struct rtp_header *header;
843 struct rtp_payload *payload;
847 size_t to_write, to_decode;
849 a2dp_prepare_buffer(u);
852 header = a2dp->buffer;
853 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
855 l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type);
859 if (l < 0 && errno == EINTR)
860 /* Retry right away if we got interrupted */
863 else if (l < 0 && errno == EAGAIN)
864 /* Hmm, apparently the socket was not readable, give up for now. */
867 pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
872 pa_assert((size_t) l <= a2dp->buffer_size);
874 u->read_index += (uint64_t) l;
876 /* TODO: get timestamp from rtp */
878 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
879 tstamp = pa_rtclock_now();
882 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
883 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
885 p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
886 to_decode = l - sizeof(*header) - sizeof(*payload);
888 d = pa_memblock_acquire(memchunk.memblock);
889 to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock);
891 while (PA_LIKELY(to_decode > 0)) {
895 decoded = sbc_decode(&a2dp->sbc,
900 if (PA_UNLIKELY(decoded <= 0)) {
901 pa_log_error("SBC decoding error (%li)", (long) decoded);
902 pa_memblock_release(memchunk.memblock);
903 pa_memblock_unref(memchunk.memblock);
907 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
908 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
910 /* Reset frame length, it can be changed due to bitpool change */
911 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
913 pa_assert_fp((size_t) decoded <= to_decode);
914 pa_assert_fp((size_t) decoded == a2dp->frame_length);
916 pa_assert_fp((size_t) written == a2dp->codesize);
918 p = (const uint8_t*) p + decoded;
919 to_decode -= decoded;
921 d = (uint8_t*) d + written;
925 memchunk.length -= to_write;
927 pa_memblock_release(memchunk.memblock);
929 pa_source_post(u->source, &memchunk);
935 pa_memblock_unref(memchunk.memblock);
940 static void a2dp_reduce_bitpool(struct userdata *u)
942 struct a2dp_info *a2dp;
949 /* Check if bitpool is already at its limit */
950 if (a2dp->sbc.bitpool <= BITPOOL_DEC_LIMIT)
953 bitpool = a2dp->sbc.bitpool - BITPOOL_DEC_STEP;
955 if (bitpool < BITPOOL_DEC_LIMIT)
956 bitpool = BITPOOL_DEC_LIMIT;
958 a2dp_set_bitpool(u, bitpool);
961 static void thread_func(void *userdata) {
962 struct userdata *u = userdata;
963 unsigned do_write = 0;
964 unsigned pending_read_bytes = 0;
965 pa_bool_t writable = FALSE;
968 pa_assert(u->transport);
970 pa_log_debug("IO Thread starting up");
972 if (u->core->realtime_scheduling)
973 pa_make_realtime(u->core->realtime_priority);
975 pa_thread_mq_install(&u->thread_mq);
977 if (bt_transport_acquire(u, TRUE) < 0)
981 struct pollfd *pollfd;
983 pa_bool_t disable_timer = TRUE;
985 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
987 if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) {
989 /* We should send two blocks to the device before we expect
992 if (u->write_index == 0 && u->read_index <= 0)
995 if (pollfd && (pollfd->revents & POLLIN)) {
998 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW)
999 n_read = hsp_process_push(u);
1001 n_read = a2dp_process_push(u);
1006 /* We just read something, so we are supposed to write something, too */
1007 pending_read_bytes += n_read;
1008 do_write += pending_read_bytes / u->write_block_size;
1009 pending_read_bytes = pending_read_bytes % u->write_block_size;
1013 if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) {
1015 if (u->sink->thread_info.rewind_requested)
1016 pa_sink_process_rewind(u->sink, 0);
1019 if (pollfd->revents & POLLOUT)
1022 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
1023 pa_usec_t time_passed;
1024 pa_usec_t audio_sent;
1026 /* Hmm, there is no input stream we could synchronize
1027 * to. So let's do things by time */
1029 time_passed = pa_rtclock_now() - u->started_at;
1030 audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1032 if (audio_sent <= time_passed) {
1033 pa_usec_t audio_to_send = time_passed - audio_sent;
1035 /* Never try to catch up for more than 100ms */
1036 if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) {
1037 pa_usec_t skip_usec;
1038 uint64_t skip_bytes;
1040 skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
1041 skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
1043 if (skip_bytes > 0) {
1046 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1047 (unsigned long long) skip_usec,
1048 (unsigned long long) skip_bytes);
1050 pa_sink_render_full(u->sink, skip_bytes, &tmp);
1051 pa_memblock_unref(tmp.memblock);
1052 u->write_index += skip_bytes;
1054 if (u->profile == PROFILE_A2DP)
1055 a2dp_reduce_bitpool(u);
1060 pending_read_bytes = 0;
1064 if (writable && do_write > 0) {
1067 if (u->write_index <= 0)
1068 u->started_at = pa_rtclock_now();
1070 if (u->profile == PROFILE_A2DP) {
1071 if ((n_written = a2dp_process_render(u)) < 0)
1074 if ((n_written = hsp_process_render(u)) < 0)
1079 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1081 do_write -= n_written;
1085 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0) {
1086 pa_usec_t sleep_for;
1087 pa_usec_t time_passed, next_write_at;
1090 /* Hmm, there is no input stream we could synchronize
1091 * to. So let's estimate when we need to wake up the latest */
1092 time_passed = pa_rtclock_now() - u->started_at;
1093 next_write_at = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1094 sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0;
1095 /* 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); */
1097 /* drop stream every 500 ms */
1098 sleep_for = PA_USEC_PER_MSEC * 500;
1100 pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for);
1101 disable_timer = FALSE;
1107 pa_rtpoll_set_timer_disabled(u->rtpoll);
1109 /* Hmm, nothing to do. Let's sleep */
1111 pollfd->events = (short) (((u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state) && !writable) ? POLLOUT : 0) |
1112 (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state) ? POLLIN : 0));
1114 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) {
1115 pa_log_debug("pa_rtpoll_run failed with: %d", ret);
1119 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1120 bt_transport_release(u);
1124 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1126 if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) {
1127 pa_log_info("FD error: %s%s%s%s",
1128 pollfd->revents & POLLERR ? "POLLERR " :"",
1129 pollfd->revents & POLLHUP ? "POLLHUP " :"",
1130 pollfd->revents & POLLPRI ? "POLLPRI " :"",
1131 pollfd->revents & POLLNVAL ? "POLLNVAL " :"");
1137 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1138 pa_log_debug("IO thread failed");
1139 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_IO_THREAD_FAILED, NULL, 0, NULL, NULL);
1140 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1143 pa_log_debug("IO thread shutting down");
1146 static pa_bt_audio_state_t parse_state_property_change(DBusMessage *m) {
1147 DBusMessageIter iter;
1148 DBusMessageIter variant;
1151 pa_bt_audio_state_t state;
1153 if (!dbus_message_iter_init(m, &iter)) {
1154 pa_log("Failed to parse PropertyChanged");
1155 return PA_BT_AUDIO_STATE_INVALID;
1158 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
1159 pa_log("Property name not a string");
1160 return PA_BT_AUDIO_STATE_INVALID;
1163 dbus_message_iter_get_basic(&iter, &key);
1165 if (!pa_streq(key, "State"))
1166 return PA_BT_AUDIO_STATE_INVALID;
1168 if (!dbus_message_iter_next(&iter)) {
1169 pa_log("Property value missing");
1170 return PA_BT_AUDIO_STATE_INVALID;
1173 dbus_message_iter_recurse(&iter, &variant);
1175 if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_STRING) {
1176 pa_log("Property value not a string");
1177 return PA_BT_AUDIO_STATE_INVALID;
1180 dbus_message_iter_get_basic(&variant, &value);
1182 pa_log_debug("dbus: %s property 'State' changed to value '%s'", dbus_message_get_interface(m), value);
1184 state = pa_bt_audio_state_from_string(value);
1186 if (state == PA_BT_AUDIO_STATE_INVALID)
1187 pa_log("Unexpected value for property 'State': '%s'", value);
1192 /* Run from main thread */
1193 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
1199 pa_assert_se(u = userdata);
1201 dbus_error_init(&err);
1203 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1204 dbus_message_get_interface(m),
1205 dbus_message_get_path(m),
1206 dbus_message_get_member(m));
1208 if (!dbus_message_has_path(m, u->path) && !dbus_message_has_path(m, u->transport))
1211 if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") ||
1212 dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1217 if (!dbus_message_get_args(m, &err, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID) || gain > HSP_MAX_GAIN) {
1218 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err.message);
1222 if (u->profile == PROFILE_HSP) {
1223 if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) {
1224 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1226 /* increment volume by one to correct rounding errors */
1227 if (volume < PA_VOLUME_NORM)
1230 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1231 pa_sink_volume_changed(u->sink, &v);
1233 } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1234 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1236 /* increment volume by one to correct rounding errors */
1237 if (volume < PA_VOLUME_NORM)
1240 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1241 pa_source_volume_changed(u->source, &v);
1244 } else if (dbus_message_is_signal(m, "org.bluez.HandsfreeGateway", "PropertyChanged")) {
1245 pa_bt_audio_state_t state = parse_state_property_change(m);
1248 case PA_BT_AUDIO_STATE_INVALID:
1249 case PA_BT_AUDIO_STATE_DISCONNECTED:
1250 case PA_BT_AUDIO_STATE_CONNECTED:
1251 case PA_BT_AUDIO_STATE_CONNECTING:
1254 case PA_BT_AUDIO_STATE_PLAYING:
1256 pa_log_debug("Changing profile to hfgw");
1257 if (pa_card_set_profile(u->card, "hfgw", FALSE) < 0)
1258 pa_log("Failed to change profile to hfgw");
1265 dbus_error_free(&err);
1267 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1270 /* Run from main thread */
1271 static void sink_set_volume_cb(pa_sink *s) {
1281 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1282 u = pa_shared_get(s->core, k);
1286 pa_assert(u->sink == s);
1287 pa_assert(u->profile == PROFILE_HSP);
1289 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1291 if (gain > HSP_MAX_GAIN)
1292 gain = HSP_MAX_GAIN;
1294 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1296 /* increment volume by one to correct rounding errors */
1297 if (volume < PA_VOLUME_NORM)
1300 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1302 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetSpeakerGain"));
1303 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1304 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1305 dbus_message_unref(m);
1308 /* Run from main thread */
1309 static void source_set_volume_cb(pa_source *s) {
1319 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1320 u = pa_shared_get(s->core, k);
1324 pa_assert(u->source == s);
1325 pa_assert(u->profile == PROFILE_HSP);
1327 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1329 if (gain > HSP_MAX_GAIN)
1330 gain = HSP_MAX_GAIN;
1332 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1334 /* increment volume by one to correct rounding errors */
1335 if (volume < PA_VOLUME_NORM)
1338 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1340 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetMicrophoneGain"));
1341 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1342 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1343 dbus_message_unref(m);
1346 /* Run from main thread */
1347 static char *get_name(const char *type, pa_modargs *ma, const char *device_id, pa_bool_t *namereg_fail) {
1353 pa_assert(device_id);
1354 pa_assert(namereg_fail);
1356 t = pa_sprintf_malloc("%s_name", type);
1357 n = pa_modargs_get_value(ma, t, NULL);
1361 *namereg_fail = TRUE;
1362 return pa_xstrdup(n);
1365 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1366 *namereg_fail = TRUE;
1369 *namereg_fail = FALSE;
1372 return pa_sprintf_malloc("bluez_%s.%s", type, n);
1375 static int sco_over_pcm_state_update(struct userdata *u, pa_bool_t changed) {
1377 pa_assert(USE_SCO_OVER_PCM(u));
1379 if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) ||
1380 PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) {
1382 if (u->stream_fd >= 0)
1385 pa_log_debug("Resuming SCO over PCM");
1386 if (init_profile(u) < 0) {
1387 pa_log("Can't resume SCO over PCM");
1391 return bt_transport_acquire(u, TRUE);
1395 if (u->stream_fd < 0)
1398 pa_log_debug("Closing SCO over PCM");
1400 bt_transport_release(u);
1406 static pa_hook_result_t sink_state_changed_cb(pa_core *c, pa_sink *s, struct userdata *u) {
1408 pa_sink_assert_ref(s);
1411 if (s != u->hsp.sco_sink)
1414 sco_over_pcm_state_update(u, TRUE);
1419 static pa_hook_result_t source_state_changed_cb(pa_core *c, pa_source *s, struct userdata *u) {
1421 pa_source_assert_ref(s);
1424 if (s != u->hsp.sco_source)
1427 sco_over_pcm_state_update(u, TRUE);
1432 static pa_hook_result_t nrec_changed_cb(pa_bluetooth_transport *t, void *call_data, struct userdata *u) {
1438 p = pa_proplist_new();
1439 pa_proplist_sets(p, "bluetooth.nrec", t->nrec ? "1" : "0");
1440 pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, p);
1441 pa_proplist_free(p);
1446 static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_direction_t direction) {
1448 pa_sink_new_data *sink_new_data;
1449 pa_source_new_data *source_new_data;
1451 pa_device_port *port;
1453 if (direction == PA_DIRECTION_OUTPUT) {
1454 data.sink_new_data = sink_or_source_new_data;
1455 data.sink_new_data->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
1457 data.source_new_data = sink_or_source_new_data;
1458 data.source_new_data->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
1461 switch (u->profile) {
1463 pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-output"));
1464 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1465 pa_device_port_ref(port);
1468 case PROFILE_A2DP_SOURCE:
1469 pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-input"));
1470 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1471 pa_device_port_ref(port);
1475 if (direction == PA_DIRECTION_OUTPUT) {
1476 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-output"));
1477 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1479 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-input"));
1480 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1482 pa_device_port_ref(port);
1486 if (direction == PA_DIRECTION_OUTPUT) {
1487 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hfgw-output"));
1488 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
1490 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hfgw-input"));
1491 pa_assert_se(pa_hashmap_put(data.source_new_data->ports, port->name, port) >= 0);
1493 pa_device_port_ref(port);
1497 pa_assert_not_reached();
1501 static const char *profile_to_string(enum profile profile) {
1505 case PROFILE_A2DP_SOURCE:
1506 return "a2dp_source";
1512 pa_assert_not_reached();
1516 /* Run from main thread */
1517 static int add_sink(struct userdata *u) {
1520 if (USE_SCO_OVER_PCM(u)) {
1523 u->sink = u->hsp.sco_sink;
1524 p = pa_proplist_new();
1525 pa_proplist_sets(p, "bluetooth.protocol", profile_to_string(u->profile));
1526 pa_proplist_update(u->sink->proplist, PA_UPDATE_MERGE, p);
1527 pa_proplist_free(p);
1529 if (!u->hsp.sink_state_changed_slot)
1530 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);
1533 pa_sink_new_data data;
1536 pa_sink_new_data_init(&data);
1537 data.driver = __FILE__;
1538 data.module = u->module;
1539 pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
1540 pa_proplist_sets(data.proplist, "bluetooth.protocol", profile_to_string(u->profile));
1541 if (u->profile == PROFILE_HSP)
1542 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1543 data.card = u->card;
1544 data.name = get_name("sink", u->modargs, u->address, &b);
1545 data.namereg_fail = b;
1547 if (pa_modargs_get_proplist(u->modargs, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1548 pa_log("Invalid properties");
1549 pa_sink_new_data_done(&data);
1552 connect_ports(u, &data, PA_DIRECTION_OUTPUT);
1554 u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY);
1555 pa_sink_new_data_done(&data);
1558 pa_log_error("Failed to create sink");
1562 u->sink->userdata = u;
1563 u->sink->parent.process_msg = sink_process_msg;
1565 pa_sink_set_max_request(u->sink, u->write_block_size);
1566 pa_sink_set_fixed_latency(u->sink,
1567 (u->profile == PROFILE_A2DP ? FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_HSP) +
1568 pa_bytes_to_usec(u->write_block_size, &u->sample_spec));
1571 if (u->profile == PROFILE_HSP) {
1572 pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
1573 u->sink->n_volume_steps = 16;
1575 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1576 pa_shared_set(u->core, k, u);
1583 /* Run from main thread */
1584 static int add_source(struct userdata *u) {
1587 if (USE_SCO_OVER_PCM(u)) {
1588 u->source = u->hsp.sco_source;
1589 pa_proplist_sets(u->source->proplist, "bluetooth.protocol", profile_to_string(u->profile));
1591 if (!u->hsp.source_state_changed_slot)
1592 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);
1595 pa_source_new_data data;
1598 pa_source_new_data_init(&data);
1599 data.driver = __FILE__;
1600 data.module = u->module;
1601 pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
1602 pa_proplist_sets(data.proplist, "bluetooth.protocol", profile_to_string(u->profile));
1603 if (u->profile == PROFILE_HSP)
1604 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
1606 data.card = u->card;
1607 data.name = get_name("source", u->modargs, u->address, &b);
1608 data.namereg_fail = b;
1610 if (pa_modargs_get_proplist(u->modargs, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1611 pa_log("Invalid properties");
1612 pa_source_new_data_done(&data);
1616 connect_ports(u, &data, PA_DIRECTION_INPUT);
1617 u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY);
1618 pa_source_new_data_done(&data);
1621 pa_log_error("Failed to create source");
1625 u->source->userdata = u;
1626 u->source->parent.process_msg = source_process_msg;
1628 pa_source_set_fixed_latency(u->source,
1629 (u->profile == PROFILE_A2DP_SOURCE ? FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_HSP) +
1630 pa_bytes_to_usec(u->read_block_size, &u->sample_spec));
1633 if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW)) {
1634 pa_bluetooth_transport *t;
1635 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1637 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0");
1639 if (!u->hsp.nrec_changed_slot)
1640 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);
1643 if (u->profile == PROFILE_HSP) {
1644 pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
1645 u->source->n_volume_steps = 16;
1647 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1648 pa_shared_set(u->core, k, u);
1655 static void bt_transport_config_a2dp(struct userdata *u) {
1656 const pa_bluetooth_transport *t;
1657 struct a2dp_info *a2dp = &u->a2dp;
1660 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1663 config = (a2dp_sbc_t *) t->config;
1665 u->sample_spec.format = PA_SAMPLE_S16LE;
1667 if (a2dp->sbc_initialized)
1668 sbc_reinit(&a2dp->sbc, 0);
1670 sbc_init(&a2dp->sbc, 0);
1671 a2dp->sbc_initialized = TRUE;
1673 switch (config->frequency) {
1674 case BT_SBC_SAMPLING_FREQ_16000:
1675 a2dp->sbc.frequency = SBC_FREQ_16000;
1676 u->sample_spec.rate = 16000U;
1678 case BT_SBC_SAMPLING_FREQ_32000:
1679 a2dp->sbc.frequency = SBC_FREQ_32000;
1680 u->sample_spec.rate = 32000U;
1682 case BT_SBC_SAMPLING_FREQ_44100:
1683 a2dp->sbc.frequency = SBC_FREQ_44100;
1684 u->sample_spec.rate = 44100U;
1686 case BT_SBC_SAMPLING_FREQ_48000:
1687 a2dp->sbc.frequency = SBC_FREQ_48000;
1688 u->sample_spec.rate = 48000U;
1691 pa_assert_not_reached();
1694 switch (config->channel_mode) {
1695 case BT_A2DP_CHANNEL_MODE_MONO:
1696 a2dp->sbc.mode = SBC_MODE_MONO;
1697 u->sample_spec.channels = 1;
1699 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
1700 a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL;
1701 u->sample_spec.channels = 2;
1703 case BT_A2DP_CHANNEL_MODE_STEREO:
1704 a2dp->sbc.mode = SBC_MODE_STEREO;
1705 u->sample_spec.channels = 2;
1707 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
1708 a2dp->sbc.mode = SBC_MODE_JOINT_STEREO;
1709 u->sample_spec.channels = 2;
1712 pa_assert_not_reached();
1715 switch (config->allocation_method) {
1716 case BT_A2DP_ALLOCATION_SNR:
1717 a2dp->sbc.allocation = SBC_AM_SNR;
1719 case BT_A2DP_ALLOCATION_LOUDNESS:
1720 a2dp->sbc.allocation = SBC_AM_LOUDNESS;
1723 pa_assert_not_reached();
1726 switch (config->subbands) {
1727 case BT_A2DP_SUBBANDS_4:
1728 a2dp->sbc.subbands = SBC_SB_4;
1730 case BT_A2DP_SUBBANDS_8:
1731 a2dp->sbc.subbands = SBC_SB_8;
1734 pa_assert_not_reached();
1737 switch (config->block_length) {
1738 case BT_A2DP_BLOCK_LENGTH_4:
1739 a2dp->sbc.blocks = SBC_BLK_4;
1741 case BT_A2DP_BLOCK_LENGTH_8:
1742 a2dp->sbc.blocks = SBC_BLK_8;
1744 case BT_A2DP_BLOCK_LENGTH_12:
1745 a2dp->sbc.blocks = SBC_BLK_12;
1747 case BT_A2DP_BLOCK_LENGTH_16:
1748 a2dp->sbc.blocks = SBC_BLK_16;
1751 pa_assert_not_reached();
1754 a2dp->min_bitpool = config->min_bitpool;
1755 a2dp->max_bitpool = config->max_bitpool;
1757 /* Set minimum bitpool for source to get the maximum possible block_size */
1758 a2dp->sbc.bitpool = u->profile == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool;
1759 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
1760 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
1762 u->read_block_size =
1763 (u->read_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
1764 / a2dp->frame_length * a2dp->codesize;
1766 u->write_block_size =
1767 (u->write_link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
1768 / a2dp->frame_length * a2dp->codesize;
1770 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
1771 a2dp->sbc.allocation, a2dp->sbc.subbands, a2dp->sbc.blocks, a2dp->sbc.bitpool);
1774 static void bt_transport_config(struct userdata *u) {
1775 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
1776 u->read_block_size = u->read_link_mtu;
1777 u->write_block_size = u->write_link_mtu;
1778 u->sample_spec.format = PA_SAMPLE_S16LE;
1779 u->sample_spec.channels = 1;
1780 u->sample_spec.rate = 8000;
1782 bt_transport_config_a2dp(u);
1785 /* Run from main thread */
1786 static int setup_bt(struct userdata *u) {
1787 const pa_bluetooth_device *d;
1788 const pa_bluetooth_transport *t;
1792 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
1793 pa_log_error("Failed to get device object.");
1797 /* release transport if exist */
1799 bt_transport_release(u);
1800 pa_xfree(u->transport);
1801 u->transport = NULL;
1804 /* check if profile has a transport */
1805 t = pa_bluetooth_device_get_transport(d, u->profile);
1807 pa_log_warn("Profile has no transport");
1811 u->transport = pa_xstrdup(t->path);
1813 if (bt_transport_acquire(u, FALSE) < 0)
1816 bt_transport_config(u);
1821 /* Run from main thread */
1822 static int init_profile(struct userdata *u) {
1825 pa_assert(u->profile != PROFILE_OFF);
1827 if (setup_bt(u) < 0)
1830 if (u->profile == PROFILE_A2DP ||
1831 u->profile == PROFILE_HSP ||
1832 u->profile == PROFILE_HFGW)
1833 if (add_sink(u) < 0)
1836 if (u->profile == PROFILE_HSP ||
1837 u->profile == PROFILE_A2DP_SOURCE ||
1838 u->profile == PROFILE_HFGW)
1839 if (add_source(u) < 0)
1845 /* Run from main thread */
1846 static void stop_thread(struct userdata *u) {
1852 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
1853 pa_thread_free(u->thread);
1857 if (u->rtpoll_item) {
1858 pa_rtpoll_item_free(u->rtpoll_item);
1859 u->rtpoll_item = NULL;
1862 if (u->hsp.sink_state_changed_slot) {
1863 pa_hook_slot_free(u->hsp.sink_state_changed_slot);
1864 u->hsp.sink_state_changed_slot = NULL;
1867 if (u->hsp.source_state_changed_slot) {
1868 pa_hook_slot_free(u->hsp.source_state_changed_slot);
1869 u->hsp.source_state_changed_slot = NULL;
1872 if (u->hsp.nrec_changed_slot) {
1873 pa_hook_slot_free(u->hsp.nrec_changed_slot);
1874 u->hsp.nrec_changed_slot = NULL;
1878 if (u->profile == PROFILE_HSP) {
1879 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1880 pa_shared_remove(u->core, k);
1884 pa_sink_unref(u->sink);
1889 if (u->profile == PROFILE_HSP) {
1890 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1891 pa_shared_remove(u->core, k);
1895 pa_source_unref(u->source);
1900 pa_thread_mq_done(&u->thread_mq);
1902 pa_rtpoll_free(u->rtpoll);
1906 if (u->read_smoother) {
1907 pa_smoother_free(u->read_smoother);
1908 u->read_smoother = NULL;
1912 /* Run from main thread */
1913 static int start_thread(struct userdata *u) {
1915 pa_assert(!u->thread);
1916 pa_assert(!u->rtpoll);
1917 pa_assert(!u->rtpoll_item);
1919 u->rtpoll = pa_rtpoll_new();
1920 pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
1922 if (USE_SCO_OVER_PCM(u)) {
1923 if (sco_over_pcm_state_update(u, FALSE) < 0) {
1927 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
1928 pa_shared_remove(u->core, k);
1933 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
1934 pa_shared_remove(u->core, k);
1941 pa_sink_ref(u->sink);
1942 pa_source_ref(u->source);
1943 /* FIXME: monitor stream_fd error */
1947 if (!(u->thread = pa_thread_new("bluetooth", thread_func, u))) {
1948 pa_log_error("Failed to create IO thread");
1954 pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
1955 pa_sink_set_rtpoll(u->sink, u->rtpoll);
1956 pa_sink_put(u->sink);
1958 if (u->sink->set_volume)
1959 u->sink->set_volume(u->sink);
1963 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
1964 pa_source_set_rtpoll(u->source, u->rtpoll);
1965 pa_source_put(u->source);
1967 if (u->source->set_volume)
1968 u->source->set_volume(u->source);
1974 static void save_sco_volume_callbacks(struct userdata *u) {
1976 pa_assert(USE_SCO_OVER_PCM(u));
1978 u->hsp.sco_sink_set_volume = u->hsp.sco_sink->set_volume;
1979 u->hsp.sco_source_set_volume = u->hsp.sco_source->set_volume;
1982 static void restore_sco_volume_callbacks(struct userdata *u) {
1984 pa_assert(USE_SCO_OVER_PCM(u));
1986 pa_sink_set_set_volume_callback(u->hsp.sco_sink, u->hsp.sco_sink_set_volume);
1987 pa_source_set_set_volume_callback(u->hsp.sco_source, u->hsp.sco_source_set_volume);
1990 /* Run from main thread */
1991 static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
1994 pa_queue *inputs = NULL, *outputs = NULL;
1995 const pa_bluetooth_device *device;
1998 pa_assert(new_profile);
1999 pa_assert_se(u = c->userdata);
2001 d = PA_CARD_PROFILE_DATA(new_profile);
2003 if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
2004 pa_log_error("Failed to get device object.");
2008 /* The state signal is sent by bluez, so it is racy to check
2009 strictly for CONNECTED, we should also accept STREAMING state
2010 as being good enough. However, if the profile is used
2011 concurrently (which is unlikely), ipc will fail later on, and
2012 module will be unloaded. */
2013 if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
2014 pa_log_warn("HSP is not connected, refused to switch profile");
2016 } else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) {
2017 pa_log_warn("A2DP Sink is not connected, refused to switch profile");
2019 } else if (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) {
2020 pa_log_warn("A2DP Source is not connected, refused to switch profile");
2022 } else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) {
2023 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
2028 inputs = pa_sink_move_all_start(u->sink, NULL);
2030 if (!USE_SCO_OVER_PCM(u))
2031 pa_sink_unlink(u->sink);
2035 outputs = pa_source_move_all_start(u->source, NULL);
2037 if (!USE_SCO_OVER_PCM(u))
2038 pa_source_unlink(u->source);
2043 if (u->profile != PROFILE_OFF && u->transport) {
2044 bt_transport_release(u);
2045 pa_xfree(u->transport);
2046 u->transport = NULL;
2049 if (USE_SCO_OVER_PCM(u))
2050 restore_sco_volume_callbacks(u);
2053 u->sample_spec = u->requested_sample_spec;
2055 if (USE_SCO_OVER_PCM(u))
2056 save_sco_volume_callbacks(u);
2058 if (u->profile != PROFILE_OFF)
2061 if (u->sink || u->source)
2066 pa_sink_move_all_finish(u->sink, inputs, FALSE);
2068 pa_sink_move_all_fail(inputs);
2073 pa_source_move_all_finish(u->source, outputs, FALSE);
2075 pa_source_move_all_fail(outputs);
2081 static void create_ports_for_profile(struct userdata *u, pa_card_new_data *card_new_data, pa_card_profile *profile) {
2082 pa_device_port *port;
2085 d = PA_CARD_PROFILE_DATA(profile);
2089 pa_assert_se(port = pa_device_port_new(u->core, "a2dp-output", _("Bluetooth High Quality (A2DP)"), 0));
2090 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2091 port->is_output = 1;
2093 port->priority = profile->priority * 100;
2094 pa_hashmap_put(port->profiles, profile->name, profile);
2097 case PROFILE_A2DP_SOURCE:
2098 pa_assert_se(port = pa_device_port_new(u->core, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2099 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2100 port->is_output = 0;
2102 port->priority = profile->priority * 100;
2103 pa_hashmap_put(port->profiles, profile->name, profile);
2107 pa_assert_se(port = pa_device_port_new(u->core, "hsp-output", _("Bluetooth Telephony (HSP/HFP)"), 0));
2108 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2109 port->is_output = 1;
2111 port->priority = profile->priority * 100;
2112 pa_hashmap_put(port->profiles, profile->name, profile);
2114 pa_assert_se(port = pa_device_port_new(u->core, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2115 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2116 port->is_output = 0;
2118 port->priority = profile->priority * 100;
2119 pa_hashmap_put(port->profiles, profile->name, profile);
2123 pa_assert_se(port = pa_device_port_new(u->core, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2124 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2125 port->is_output = 1;
2127 port->priority = profile->priority * 100;
2128 pa_hashmap_put(port->profiles, profile->name, profile);
2130 pa_assert_se(port = pa_device_port_new(u->core, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2131 pa_assert_se(pa_hashmap_put(card_new_data->ports, port->name, port) >= 0);
2132 port->is_output = 0;
2134 port->priority = profile->priority * 100;
2135 pa_hashmap_put(port->profiles, profile->name, profile);
2139 pa_assert_not_reached();
2144 /* Run from main thread */
2145 static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
2146 pa_card_new_data data;
2152 const char *default_profile;
2157 pa_card_new_data_init(&data);
2158 data.driver = __FILE__;
2159 data.module = u->module;
2161 n = pa_bluetooth_cleanup_name(device->name);
2162 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, n);
2164 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, device->address);
2165 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "bluez");
2166 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "sound");
2167 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_BUS, "bluetooth");
2168 if ((ff = pa_bluetooth_get_form_factor(device->class)))
2169 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_FORM_FACTOR, ff);
2170 pa_proplist_sets(data.proplist, "bluez.path", device->path);
2171 pa_proplist_setf(data.proplist, "bluez.class", "0x%06x", (unsigned) device->class);
2172 pa_proplist_sets(data.proplist, "bluez.name", device->name);
2173 data.name = get_name("card", u->modargs, device->address, &b);
2174 data.namereg_fail = b;
2176 if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
2177 pa_log("Invalid properties");
2178 pa_card_new_data_done(&data);
2182 data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
2184 /* we base hsp/a2dp availability on UUIDs.
2185 Ideally, it would be based on "Connected" state, but
2186 we can't afford to wait for this information when
2187 we are loaded with profile="hsp", for instance */
2188 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SINK_UUID)) {
2189 p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile));
2193 p->max_sink_channels = 2;
2194 p->max_source_channels = 0;
2196 d = PA_CARD_PROFILE_DATA(p);
2198 create_ports_for_profile(u, &data, p);
2200 pa_hashmap_put(data.profiles, p->name, p);
2203 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SOURCE_UUID)) {
2204 p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile));
2208 p->max_sink_channels = 0;
2209 p->max_source_channels = 2;
2211 d = PA_CARD_PROFILE_DATA(p);
2212 *d = PROFILE_A2DP_SOURCE;
2213 create_ports_for_profile(u, &data, p);
2215 pa_hashmap_put(data.profiles, p->name, p);
2218 if (pa_bluetooth_uuid_has(device->uuids, HSP_HS_UUID) ||
2219 pa_bluetooth_uuid_has(device->uuids, HFP_HS_UUID)) {
2220 p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile));
2224 p->max_sink_channels = 1;
2225 p->max_source_channels = 1;
2227 d = PA_CARD_PROFILE_DATA(p);
2229 create_ports_for_profile(u, &data, p);
2231 pa_hashmap_put(data.profiles, p->name, p);
2234 if (pa_bluetooth_uuid_has(device->uuids, HFP_AG_UUID)) {
2235 p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile));
2239 p->max_sink_channels = 1;
2240 p->max_source_channels = 1;
2242 d = PA_CARD_PROFILE_DATA(p);
2244 create_ports_for_profile(u, &data, p);
2246 pa_hashmap_put(data.profiles, p->name, p);
2249 pa_assert(!pa_hashmap_isempty(data.profiles));
2251 p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
2252 d = PA_CARD_PROFILE_DATA(p);
2254 pa_hashmap_put(data.profiles, p->name, p);
2256 if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
2257 if (pa_hashmap_get(data.profiles, default_profile))
2258 pa_card_new_data_set_profile(&data, default_profile);
2260 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile);
2263 u->card = pa_card_new(u->core, &data);
2264 pa_card_new_data_done(&data);
2267 pa_log("Failed to allocate card.");
2271 u->card->userdata = u;
2272 u->card->set_profile = card_set_profile;
2274 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2276 if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) ||
2277 (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) ||
2278 (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) ||
2279 (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW)) {
2280 pa_log_warn("Default profile not connected, selecting off profile");
2281 u->card->active_profile = pa_hashmap_get(u->card->profiles, "off");
2282 u->card->save_profile = FALSE;
2285 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2288 if (USE_SCO_OVER_PCM(u))
2289 save_sco_volume_callbacks(u);
2294 /* Run from main thread */
2295 static const pa_bluetooth_device* find_device(struct userdata *u, const char *address, const char *path) {
2296 const pa_bluetooth_device *d = NULL;
2300 if (!address && !path) {
2301 pa_log_error("Failed to get device address/path from module arguments.");
2306 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, path))) {
2307 pa_log_error("%s is not a valid BlueZ audio device.", path);
2311 if (address && !(pa_streq(d->address, address))) {
2312 pa_log_error("Passed path %s address %s != %s don't match.", path, d->address, address);
2317 if (!(d = pa_bluetooth_discovery_get_by_address(u->discovery, address))) {
2318 pa_log_error("%s is not known.", address);
2324 u->address = pa_xstrdup(d->address);
2325 u->path = pa_xstrdup(d->path);
2331 /* Run from main thread */
2332 static int setup_dbus(struct userdata *u) {
2335 dbus_error_init(&err);
2337 u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err);
2339 if (dbus_error_is_set(&err) || !u->connection) {
2340 pa_log("Failed to get D-Bus connection: %s", err.message);
2341 dbus_error_free(&err);
2348 int pa__init(pa_module* m) {
2352 const char *address, *path;
2354 char *mike, *speaker;
2355 const pa_bluetooth_device *device;
2359 dbus_error_init(&err);
2361 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
2362 pa_log_error("Failed to parse module arguments");
2366 m->userdata = u = pa_xnew0(struct userdata, 1);
2370 u->sample_spec = m->core->default_sample_spec;
2373 if (pa_modargs_get_value(ma, "sco_sink", NULL) &&
2374 !(u->hsp.sco_sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_sink", NULL), PA_NAMEREG_SINK))) {
2375 pa_log("SCO sink not found");
2379 if (pa_modargs_get_value(ma, "sco_source", NULL) &&
2380 !(u->hsp.sco_source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_source", NULL), PA_NAMEREG_SOURCE))) {
2381 pa_log("SCO source not found");
2385 if (pa_modargs_get_value_u32(ma, "rate", &u->sample_spec.rate) < 0 ||
2386 u->sample_spec.rate <= 0 || u->sample_spec.rate > PA_RATE_MAX) {
2387 pa_log_error("Failed to get rate from module arguments");
2391 u->auto_connect = TRUE;
2392 if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) {
2393 pa_log("Failed to parse auto_connect= argument");
2397 channels = u->sample_spec.channels;
2398 if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
2399 channels <= 0 || channels > PA_CHANNELS_MAX) {
2400 pa_log_error("Failed to get channels from module arguments");
2403 u->sample_spec.channels = (uint8_t) channels;
2404 u->requested_sample_spec = u->sample_spec;
2406 address = pa_modargs_get_value(ma, "address", NULL);
2407 path = pa_modargs_get_value(ma, "path", NULL);
2409 if (setup_dbus(u) < 0)
2412 if (!(u->discovery = pa_bluetooth_discovery_get(m->core)))
2415 if (!(device = find_device(u, address, path)))
2418 /* Add the card structure. This will also initialize the default profile */
2419 if (add_card(u, device) < 0)
2422 if (!(u->msg = pa_msgobject_new(bluetooth_msg)))
2425 u->msg->parent.process_msg = device_process_msg;
2426 u->msg->card = u->card;
2428 if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) {
2429 pa_log_error("Failed to add filter function");
2432 u->filter_added = TRUE;
2434 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2435 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2437 if (pa_dbus_add_matches(
2438 pa_dbus_connection_get(u->connection), &err,
2441 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2442 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2448 pa_log("Failed to add D-Bus matches: %s", err.message);
2455 if (u->profile != PROFILE_OFF)
2456 if (init_profile(u) < 0)
2459 if (u->sink || u->source)
2460 if (start_thread(u) < 0)
2469 dbus_error_free(&err);
2474 int pa__get_n_used(pa_module *m) {
2478 pa_assert_se(u = m->userdata);
2481 (u->sink ? pa_sink_linked_by(u->sink) : 0) +
2482 (u->source ? pa_source_linked_by(u->source) : 0);
2485 void pa__done(pa_module *m) {
2490 if (!(u = m->userdata))
2493 if (u->sink && !USE_SCO_OVER_PCM(u))
2494 pa_sink_unlink(u->sink);
2496 if (u->source && !USE_SCO_OVER_PCM(u))
2497 pa_source_unlink(u->source);
2501 if (USE_SCO_OVER_PCM(u))
2502 restore_sco_volume_callbacks(u);
2504 if (u->connection) {
2507 char *speaker, *mike;
2508 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2509 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2511 pa_dbus_remove_matches(pa_dbus_connection_get(u->connection), speaker, mike,
2512 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2513 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2520 if (u->filter_added)
2521 dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
2523 pa_dbus_connection_unref(u->connection);
2530 pa_card_free(u->card);
2532 if (u->read_smoother)
2533 pa_smoother_free(u->read_smoother);
2536 pa_xfree(u->a2dp.buffer);
2538 sbc_finish(&u->a2dp.sbc);
2541 pa_modargs_free(u->modargs);
2543 pa_xfree(u->address);
2547 bt_transport_release(u);
2548 pa_xfree(u->transport);
2552 pa_bluetooth_discovery_unref(u->discovery);