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
30 #include <linux/sockios.h>
31 #include <arpa/inet.h>
33 #include <pulse/rtclock.h>
34 #include <pulse/sample.h>
35 #include <pulse/timeval.h>
36 #include <pulse/xmalloc.h>
38 #include <pulsecore/i18n.h>
39 #include <pulsecore/module.h>
40 #include <pulsecore/modargs.h>
41 #include <pulsecore/core-rtclock.h>
42 #include <pulsecore/core-util.h>
43 #include <pulsecore/core-error.h>
44 #include <pulsecore/shared.h>
45 #include <pulsecore/socket-util.h>
46 #include <pulsecore/thread.h>
47 #include <pulsecore/thread-mq.h>
48 #include <pulsecore/poll.h>
49 #include <pulsecore/rtpoll.h>
50 #include <pulsecore/time-smoother.h>
51 #include <pulsecore/namereg.h>
55 #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
63 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
64 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
65 PA_MODULE_VERSION(PACKAGE_VERSION
);
66 PA_MODULE_LOAD_ONCE(false);
68 "name=<name for the card/sink/source, to be prefixed> "
69 "card_name=<name for the card> "
70 "card_properties=<properties for the card> "
71 "sink_name=<name for the sink> "
72 "sink_properties=<properties for the sink> "
73 "source_name=<name for the source> "
74 "source_properties=<properties for the source> "
75 "address=<address of the device> "
76 "profile=<a2dp|hsp|hfgw> "
78 "channels=<number of channels> "
79 "path=<device object path> "
80 "auto_connect=<automatically connect?> "
81 "sco_sink=<SCO over PCM sink name> "
82 "sco_source=<SCO over PCM source name>");
84 /* TODO: not close fd when entering suspend mode in a2dp */
86 static const char* const valid_modargs
[] = {
106 sbc_t sbc
; /* Codec data */
107 bool sbc_initialized
; /* Keep track if the encoder is initialized */
108 size_t codesize
, frame_length
; /* SBC Codesize, frame_length. We simply cache those values here */
110 void* buffer
; /* Codec transfer buffer */
111 size_t buffer_size
; /* Size of the buffer */
113 uint16_t seq_num
; /* Cumulative packet sequence */
120 void (*sco_sink_set_volume
)(pa_sink
*s
);
121 pa_source
*sco_source
;
122 void (*sco_source_set_volume
)(pa_source
*s
);
125 struct bluetooth_msg
{
130 typedef struct bluetooth_msg bluetooth_msg
;
131 PA_DEFINE_PRIVATE_CLASS(bluetooth_msg
, pa_msgobject
);
132 #define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o))
138 pa_bluetooth_device
*device
;
139 pa_hook_slot
*uuid_added_slot
;
142 pa_bluetooth_transport
*transport
;
143 bool transport_acquired
;
144 pa_hook_slot
*discovery_slot
;
145 pa_hook_slot
*sink_state_changed_slot
;
146 pa_hook_slot
*source_state_changed_slot
;
147 pa_hook_slot
*transport_state_changed_slot
;
148 pa_hook_slot
*transport_nrec_changed_slot
;
149 pa_hook_slot
*transport_microphone_changed_slot
;
150 pa_hook_slot
*transport_speaker_changed_slot
;
152 pa_bluetooth_discovery
*discovery
;
159 pa_thread_mq thread_mq
;
161 pa_rtpoll_item
*rtpoll_item
;
165 uint64_t read_index
, write_index
;
166 pa_usec_t started_at
;
167 pa_smoother
*read_smoother
;
169 pa_memchunk write_memchunk
;
171 pa_sample_spec sample_spec
, requested_sample_spec
;
175 size_t read_link_mtu
;
176 size_t read_block_size
;
178 size_t write_link_mtu
;
179 size_t write_block_size
;
181 struct a2dp_info a2dp
;
184 enum profile profile
;
188 int stream_write_type
;
192 BLUETOOTH_MESSAGE_IO_THREAD_FAILED
,
193 BLUETOOTH_MESSAGE_MAX
196 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
197 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
198 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
199 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
201 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
203 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
205 static int init_profile(struct userdata
*u
);
208 static void a2dp_set_bitpool(struct userdata
*u
, uint8_t bitpool
)
210 struct a2dp_info
*a2dp
;
216 if (a2dp
->sbc
.bitpool
== bitpool
)
219 if (bitpool
> a2dp
->max_bitpool
)
220 bitpool
= a2dp
->max_bitpool
;
221 else if (bitpool
< a2dp
->min_bitpool
)
222 bitpool
= a2dp
->min_bitpool
;
224 a2dp
->sbc
.bitpool
= bitpool
;
226 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
227 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
229 pa_log_debug("Bitpool has changed to %u", a2dp
->sbc
.bitpool
);
232 (u
->read_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
233 / a2dp
->frame_length
* a2dp
->codesize
;
235 u
->write_block_size
=
236 (u
->write_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
237 / a2dp
->frame_length
* a2dp
->codesize
;
239 pa_sink_set_max_request_within_thread(u
->sink
, u
->write_block_size
);
240 pa_sink_set_fixed_latency_within_thread(u
->sink
,
241 FIXED_LATENCY_PLAYBACK_A2DP
+ pa_bytes_to_usec(u
->write_block_size
, &u
->sample_spec
));
244 /* from IO thread, except in SCO over PCM */
245 static void bt_transport_config_mtu(struct userdata
*u
) {
246 /* Calculate block sizes */
247 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
248 u
->read_block_size
= u
->read_link_mtu
;
249 u
->write_block_size
= u
->write_link_mtu
;
252 (u
->read_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
253 / u
->a2dp
.frame_length
* u
->a2dp
.codesize
;
255 u
->write_block_size
=
256 (u
->write_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
257 / u
->a2dp
.frame_length
* u
->a2dp
.codesize
;
260 if (USE_SCO_OVER_PCM(u
))
264 pa_sink_set_max_request_within_thread(u
->sink
, u
->write_block_size
);
265 pa_sink_set_fixed_latency_within_thread(u
->sink
,
266 (u
->profile
== PROFILE_A2DP
?
267 FIXED_LATENCY_PLAYBACK_A2DP
: FIXED_LATENCY_PLAYBACK_HSP
) +
268 pa_bytes_to_usec(u
->write_block_size
, &u
->sample_spec
));
272 pa_source_set_fixed_latency_within_thread(u
->source
,
273 (u
->profile
== PROFILE_A2DP_SOURCE
?
274 FIXED_LATENCY_RECORD_A2DP
: FIXED_LATENCY_RECORD_HSP
) +
275 pa_bytes_to_usec(u
->read_block_size
, &u
->sample_spec
));
278 /* from IO thread, except in SCO over PCM */
280 static void setup_stream(struct userdata
*u
) {
281 struct pollfd
*pollfd
;
284 pa_log_info("Transport %s resuming", u
->transport
->path
);
286 bt_transport_config_mtu(u
);
288 pa_make_fd_nonblock(u
->stream_fd
);
289 pa_make_socket_low_delay(u
->stream_fd
);
292 if (setsockopt(u
->stream_fd
, SOL_SOCKET
, SO_TIMESTAMP
, &one
, sizeof(one
)) < 0)
293 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno
));
295 pa_log_debug("Stream properly set up, we're ready to roll!");
297 if (u
->profile
== PROFILE_A2DP
)
298 a2dp_set_bitpool(u
, u
->a2dp
.max_bitpool
);
300 u
->rtpoll_item
= pa_rtpoll_item_new(u
->rtpoll
, PA_RTPOLL_NEVER
, 1);
301 pollfd
= pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
);
302 pollfd
->fd
= u
->stream_fd
;
303 pollfd
->events
= pollfd
->revents
= 0;
305 u
->read_index
= u
->write_index
= 0;
309 u
->read_smoother
= pa_smoother_new(
319 static void teardown_stream(struct userdata
*u
) {
320 if (u
->rtpoll_item
) {
321 pa_rtpoll_item_free(u
->rtpoll_item
);
322 u
->rtpoll_item
= NULL
;
325 if (u
->stream_fd
>= 0) {
326 pa_close(u
->stream_fd
);
330 if (u
->read_smoother
) {
331 pa_smoother_free(u
->read_smoother
);
332 u
->read_smoother
= NULL
;
335 if (u
->write_memchunk
.memblock
) {
336 pa_memblock_unref(u
->write_memchunk
.memblock
);
337 pa_memchunk_reset(&u
->write_memchunk
);
340 pa_log_debug("Audio stream torn down");
343 static void bt_transport_release(struct userdata
*u
) {
344 pa_assert(u
->transport
);
346 /* Ignore if already released */
347 if (!u
->transport_acquired
)
350 pa_log_debug("Releasing transport %s", u
->transport
->path
);
352 pa_bluetooth_transport_release(u
->transport
);
354 u
->transport_acquired
= false;
359 static int bt_transport_acquire(struct userdata
*u
, bool optional
) {
360 pa_assert(u
->transport
);
362 if (u
->transport_acquired
)
365 pa_log_debug("Acquiring transport %s", u
->transport
->path
);
367 u
->stream_fd
= pa_bluetooth_transport_acquire(u
->transport
, optional
, &u
->read_link_mtu
, &u
->write_link_mtu
);
368 if (u
->stream_fd
< 0) {
370 pa_log("Failed to acquire transport %s", u
->transport
->path
);
372 pa_log_info("Failed optional acquire of transport %s", u
->transport
->path
);
377 u
->transport_acquired
= true;
378 pa_log_info("Transport %s acquired: fd %d", u
->transport
->path
, u
->stream_fd
);
383 /* Run from IO thread */
384 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
385 struct userdata
*u
= PA_SINK(o
)->userdata
;
389 pa_assert(u
->sink
== PA_SINK(o
));
390 pa_assert(u
->transport
);
394 case PA_SINK_MESSAGE_SET_STATE
:
396 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
398 case PA_SINK_SUSPENDED
:
399 /* Ignore if transition is PA_SINK_INIT->PA_SINK_SUSPENDED */
400 if (!PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
))
403 /* Stop the device if the source is suspended as well */
404 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
)
405 /* We deliberately ignore whether stopping
406 * actually worked. Since the stream_fd is
407 * closed it doesn't really matter */
408 bt_transport_release(u
);
413 case PA_SINK_RUNNING
:
414 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
417 /* Resume the device if the source was suspended as well */
418 if (!u
->source
|| !PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
)) {
419 if (bt_transport_acquire(u
, false) < 0)
426 case PA_SINK_UNLINKED
:
428 case PA_SINK_INVALID_STATE
:
433 case PA_SINK_MESSAGE_GET_LATENCY
: {
435 if (u
->read_smoother
) {
438 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
439 wi
= pa_bytes_to_usec(u
->write_index
+ u
->write_block_size
, &u
->sample_spec
);
441 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
445 ri
= pa_rtclock_now() - u
->started_at
;
446 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
448 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
451 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
456 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
458 return (r
< 0 || !failed
) ? r
: -1;
461 /* Run from IO thread */
462 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
463 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
467 pa_assert(u
->source
== PA_SOURCE(o
));
468 pa_assert(u
->transport
);
472 case PA_SOURCE_MESSAGE_SET_STATE
:
474 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
476 case PA_SOURCE_SUSPENDED
:
477 /* Ignore if transition is PA_SOURCE_INIT->PA_SOURCE_SUSPENDED */
478 if (!PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
))
481 /* Stop the device if the sink is suspended as well */
482 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
)
483 bt_transport_release(u
);
485 if (u
->read_smoother
)
486 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
490 case PA_SOURCE_RUNNING
:
491 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
494 /* Resume the device if the sink was suspended as well */
495 if (!u
->sink
|| !PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
)) {
496 if (bt_transport_acquire(u
, false) < 0)
501 /* We don't resume the smoother here. Instead we
502 * wait until the first packet arrives */
505 case PA_SOURCE_UNLINKED
:
507 case PA_SOURCE_INVALID_STATE
:
512 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
515 if (u
->read_smoother
) {
516 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
517 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
519 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
521 *((pa_usec_t
*) data
) = 0;
528 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
530 return (r
< 0 || !failed
) ? r
: -1;
533 /* Called from main thread context */
534 static int device_process_msg(pa_msgobject
*obj
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
535 struct bluetooth_msg
*u
= BLUETOOTH_MSG(obj
);
538 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED
: {
539 if (u
->card
->module
->unload_requested
)
542 pa_log_debug("Switching the profile to off due to IO thread failure.");
544 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
551 /* Run from IO thread */
552 static int hsp_process_render(struct userdata
*u
) {
556 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
559 /* First, render some data */
560 if (!u
->write_memchunk
.memblock
)
561 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
563 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
569 /* Now write that data to the socket. The socket is of type
570 * SEQPACKET, and we generated the data of the MTU size, so this
571 * should just work. */
573 p
= (const uint8_t *) pa_memblock_acquire_chunk(&u
->write_memchunk
);
574 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
575 pa_memblock_release(u
->write_memchunk
.memblock
);
582 /* Retry right away if we got interrupted */
585 else if (errno
== EAGAIN
)
586 /* Hmm, apparently the socket was not writable, give up for now */
589 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
594 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
596 if ((size_t) l
!= u
->write_memchunk
.length
) {
597 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
598 (unsigned long long) l
,
599 (unsigned long long) u
->write_memchunk
.length
);
604 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
605 pa_memblock_unref(u
->write_memchunk
.memblock
);
606 pa_memchunk_reset(&u
->write_memchunk
);
615 /* Run from IO thread */
616 static int hsp_process_push(struct userdata
*u
) {
618 pa_memchunk memchunk
;
621 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
622 pa_assert(u
->source
);
623 pa_assert(u
->read_smoother
);
625 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
626 memchunk
.index
= memchunk
.length
= 0;
635 bool found_tstamp
= false;
638 memset(&m
, 0, sizeof(m
));
639 memset(&aux
, 0, sizeof(aux
));
640 memset(&iov
, 0, sizeof(iov
));
645 m
.msg_controllen
= sizeof(aux
);
647 p
= pa_memblock_acquire(memchunk
.memblock
);
649 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
650 l
= recvmsg(u
->stream_fd
, &m
, 0);
651 pa_memblock_release(memchunk
.memblock
);
655 if (l
< 0 && errno
== EINTR
)
656 /* Retry right away if we got interrupted */
659 else if (l
< 0 && errno
== EAGAIN
)
660 /* Hmm, apparently the socket was not readable, give up for now. */
663 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
668 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
670 /* In some rare occasions, we might receive packets of a very strange
671 * size. This could potentially be possible if the SCO packet was
672 * received partially over-the-air, or more probably due to hardware
673 * issues in our Bluetooth adapter. In these cases, in order to avoid
674 * an assertion failure due to unaligned data, just discard the whole
676 if (!pa_frame_aligned(l
, &u
->sample_spec
)) {
677 pa_log_warn("SCO packet received of unaligned size: %zu", l
);
681 memchunk
.length
= (size_t) l
;
682 u
->read_index
+= (uint64_t) l
;
684 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
685 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
686 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
687 pa_rtclock_from_wallclock(tv
);
688 tstamp
= pa_timeval_load(tv
);
694 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
695 tstamp
= pa_rtclock_now();
698 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
699 pa_smoother_resume(u
->read_smoother
, tstamp
, true);
701 pa_source_post(u
->source
, &memchunk
);
707 pa_memblock_unref(memchunk
.memblock
);
712 /* Run from IO thread */
713 static void a2dp_prepare_buffer(struct userdata
*u
) {
714 size_t min_buffer_size
= PA_MAX(u
->read_link_mtu
, u
->write_link_mtu
);
718 if (u
->a2dp
.buffer_size
>= min_buffer_size
)
721 u
->a2dp
.buffer_size
= 2 * min_buffer_size
;
722 pa_xfree(u
->a2dp
.buffer
);
723 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
726 /* Run from IO thread */
727 static int a2dp_process_render(struct userdata
*u
) {
728 struct a2dp_info
*a2dp
;
729 struct rtp_header
*header
;
730 struct rtp_payload
*payload
;
734 size_t to_write
, to_encode
;
735 unsigned frame_count
;
739 pa_assert(u
->profile
== PROFILE_A2DP
);
742 /* First, render some data */
743 if (!u
->write_memchunk
.memblock
)
744 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
746 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
748 a2dp_prepare_buffer(u
);
751 header
= a2dp
->buffer
;
752 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
756 /* Try to create a packet of the full MTU */
758 p
= (const uint8_t *) pa_memblock_acquire_chunk(&u
->write_memchunk
);
759 to_encode
= u
->write_memchunk
.length
;
761 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
762 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
764 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
768 encoded
= sbc_encode(&a2dp
->sbc
,
773 if (PA_UNLIKELY(encoded
<= 0)) {
774 pa_log_error("SBC encoding error (%li)", (long) encoded
);
775 pa_memblock_release(u
->write_memchunk
.memblock
);
779 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
780 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
782 pa_assert_fp((size_t) encoded
<= to_encode
);
783 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
785 pa_assert_fp((size_t) written
<= to_write
);
786 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
788 p
= (const uint8_t*) p
+ encoded
;
789 to_encode
-= encoded
;
791 d
= (uint8_t*) d
+ written
;
797 pa_memblock_release(u
->write_memchunk
.memblock
);
799 pa_assert(to_encode
== 0);
802 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
805 /* write it to the fifo */
806 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
809 header
->sequence_number
= htons(a2dp
->seq_num
++);
810 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
811 header
->ssrc
= htonl(1);
812 payload
->frame_count
= frame_count
;
814 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
819 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
826 /* Retry right away if we got interrupted */
829 else if (errno
== EAGAIN
)
830 /* Hmm, apparently the socket was not writable, give up for now */
833 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
838 pa_assert((size_t) l
<= nbytes
);
840 if ((size_t) l
!= nbytes
) {
841 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
842 (unsigned long long) l
,
843 (unsigned long long) nbytes
);
848 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
849 pa_memblock_unref(u
->write_memchunk
.memblock
);
850 pa_memchunk_reset(&u
->write_memchunk
);
860 static int a2dp_process_push(struct userdata
*u
) {
862 pa_memchunk memchunk
;
865 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
866 pa_assert(u
->source
);
867 pa_assert(u
->read_smoother
);
869 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
870 memchunk
.index
= memchunk
.length
= 0;
873 bool found_tstamp
= false;
875 struct a2dp_info
*a2dp
;
876 struct rtp_header
*header
;
877 struct rtp_payload
*payload
;
881 size_t to_write
, to_decode
;
883 a2dp_prepare_buffer(u
);
886 header
= a2dp
->buffer
;
887 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
889 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
893 if (l
< 0 && errno
== EINTR
)
894 /* Retry right away if we got interrupted */
897 else if (l
< 0 && errno
== EAGAIN
)
898 /* Hmm, apparently the socket was not readable, give up for now. */
901 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
906 pa_assert((size_t) l
<= a2dp
->buffer_size
);
908 u
->read_index
+= (uint64_t) l
;
910 /* TODO: get timestamp from rtp */
912 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
913 tstamp
= pa_rtclock_now();
916 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
917 pa_smoother_resume(u
->read_smoother
, tstamp
, true);
919 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
920 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
922 d
= pa_memblock_acquire(memchunk
.memblock
);
923 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
925 while (PA_LIKELY(to_decode
> 0)) {
929 decoded
= sbc_decode(&a2dp
->sbc
,
934 if (PA_UNLIKELY(decoded
<= 0)) {
935 pa_log_error("SBC decoding error (%li)", (long) decoded
);
936 pa_memblock_release(memchunk
.memblock
);
937 pa_memblock_unref(memchunk
.memblock
);
941 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
942 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
944 /* Reset frame length, it can be changed due to bitpool change */
945 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
947 pa_assert_fp((size_t) decoded
<= to_decode
);
948 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
950 pa_assert_fp((size_t) written
== a2dp
->codesize
);
952 p
= (const uint8_t*) p
+ decoded
;
953 to_decode
-= decoded
;
955 d
= (uint8_t*) d
+ written
;
959 memchunk
.length
-= to_write
;
961 pa_memblock_release(memchunk
.memblock
);
963 pa_source_post(u
->source
, &memchunk
);
969 pa_memblock_unref(memchunk
.memblock
);
974 static void a2dp_reduce_bitpool(struct userdata
*u
)
976 struct a2dp_info
*a2dp
;
983 /* Check if bitpool is already at its limit */
984 if (a2dp
->sbc
.bitpool
<= BITPOOL_DEC_LIMIT
)
987 bitpool
= a2dp
->sbc
.bitpool
- BITPOOL_DEC_STEP
;
989 if (bitpool
< BITPOOL_DEC_LIMIT
)
990 bitpool
= BITPOOL_DEC_LIMIT
;
992 a2dp_set_bitpool(u
, bitpool
);
995 static void thread_func(void *userdata
) {
996 struct userdata
*u
= userdata
;
997 unsigned do_write
= 0;
998 unsigned pending_read_bytes
= 0;
999 bool writable
= false;
1002 pa_assert(u
->transport
);
1004 pa_log_debug("IO Thread starting up");
1006 if (u
->core
->realtime_scheduling
)
1007 pa_make_realtime(u
->core
->realtime_priority
);
1009 pa_thread_mq_install(&u
->thread_mq
);
1011 /* Setup the stream only if the transport was already acquired */
1012 if (u
->transport_acquired
)
1016 struct pollfd
*pollfd
;
1018 bool disable_timer
= true;
1020 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1022 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
1024 /* We should send two blocks to the device before we expect
1027 if (u
->write_index
== 0 && u
->read_index
<= 0)
1030 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
1033 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
1034 n_read
= hsp_process_push(u
);
1036 n_read
= a2dp_process_push(u
);
1041 /* We just read something, so we are supposed to write something, too */
1042 pending_read_bytes
+= n_read
;
1043 do_write
+= pending_read_bytes
/ u
->write_block_size
;
1044 pending_read_bytes
= pending_read_bytes
% u
->write_block_size
;
1048 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1050 if (PA_UNLIKELY(u
->sink
->thread_info
.rewind_requested
))
1051 pa_sink_process_rewind(u
->sink
, 0);
1054 if (pollfd
->revents
& POLLOUT
)
1057 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1058 pa_usec_t time_passed
;
1059 pa_usec_t audio_sent
;
1061 /* Hmm, there is no input stream we could synchronize
1062 * to. So let's do things by time */
1064 time_passed
= pa_rtclock_now() - u
->started_at
;
1065 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1067 if (audio_sent
<= time_passed
) {
1068 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1070 /* Never try to catch up for more than 100ms */
1071 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1072 pa_usec_t skip_usec
;
1073 uint64_t skip_bytes
;
1075 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1076 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1078 if (skip_bytes
> 0) {
1081 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1082 (unsigned long long) skip_usec
,
1083 (unsigned long long) skip_bytes
);
1085 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1086 pa_memblock_unref(tmp
.memblock
);
1087 u
->write_index
+= skip_bytes
;
1089 if (u
->profile
== PROFILE_A2DP
)
1090 a2dp_reduce_bitpool(u
);
1095 pending_read_bytes
= 0;
1099 if (writable
&& do_write
> 0) {
1102 if (u
->write_index
<= 0)
1103 u
->started_at
= pa_rtclock_now();
1105 if (u
->profile
== PROFILE_A2DP
) {
1106 if ((n_written
= a2dp_process_render(u
)) < 0)
1109 if ((n_written
= hsp_process_render(u
)) < 0)
1114 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1116 do_write
-= n_written
;
1120 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0) {
1121 pa_usec_t sleep_for
;
1122 pa_usec_t time_passed
, next_write_at
;
1125 /* Hmm, there is no input stream we could synchronize
1126 * to. So let's estimate when we need to wake up the latest */
1127 time_passed
= pa_rtclock_now() - u
->started_at
;
1128 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1129 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1130 /* 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); */
1132 /* drop stream every 500 ms */
1133 sleep_for
= PA_USEC_PER_MSEC
* 500;
1135 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1136 disable_timer
= false;
1142 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1144 /* Hmm, nothing to do. Let's sleep */
1146 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1147 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1149 if ((ret
= pa_rtpoll_run(u
->rtpoll
, true)) < 0) {
1150 pa_log_debug("pa_rtpoll_run failed with: %d", ret
);
1154 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1155 bt_transport_release(u
);
1159 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1161 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1162 pa_log_info("FD error: %s%s%s%s",
1163 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1164 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1165 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1166 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1173 /* In case of HUP, just tear down the streams */
1174 if (!pollfd
|| (pollfd
->revents
& POLLHUP
) == 0)
1178 pending_read_bytes
= 0;
1185 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1186 pa_log_debug("IO thread failed");
1187 pa_asyncmsgq_post(pa_thread_mq_get()->outq
, PA_MSGOBJECT(u
->msg
), BLUETOOTH_MESSAGE_IO_THREAD_FAILED
, NULL
, 0, NULL
, NULL
);
1188 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1191 pa_log_debug("IO thread shutting down");
1194 static pa_port_available_t
transport_state_to_availability(pa_bluetooth_transport_state_t state
) {
1195 if (state
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1196 return PA_PORT_AVAILABLE_NO
;
1197 else if (state
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
)
1198 return PA_PORT_AVAILABLE_YES
;
1200 return PA_PORT_AVAILABLE_UNKNOWN
;
1203 static pa_port_available_t
transport_state_to_availability_merged(pa_bluetooth_transport_state_t state1
,
1204 pa_bluetooth_transport_state_t state2
) {
1205 if (state1
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
&& state2
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1206 return PA_PORT_AVAILABLE_NO
;
1207 else if (state1
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
|| state2
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
)
1208 return PA_PORT_AVAILABLE_YES
;
1210 return PA_PORT_AVAILABLE_UNKNOWN
;
1213 /* Run from main thread */
1214 static void handle_transport_state_change(struct userdata
*u
, struct pa_bluetooth_transport
*transport
) {
1215 bool acquire
= false;
1216 bool release
= false;
1217 enum profile profile
;
1218 pa_bluetooth_transport_state_t state
;
1221 pa_assert(transport
);
1223 profile
= transport
->profile
;
1224 state
= transport
->state
;
1226 if (!pa_hashmap_get(u
->card
->profiles
, pa_bt_profile_to_string(profile
)))
1230 case PROFILE_HFGW
: {
1231 pa_device_port
*port
;
1232 pa_port_available_t available
= transport_state_to_availability(state
);
1234 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
1235 pa_device_port_set_available(port
, available
);
1237 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
1238 pa_device_port_set_available(port
, available
);
1240 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HFGW
);
1241 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HFGW
);
1247 pa_device_port
*port
;
1248 pa_port_available_t available
;
1249 pa_bluetooth_transport
*other
= u
->device
->transports
[PROFILE_A2DP
];
1252 available
= transport_state_to_availability(state
);
1254 available
= transport_state_to_availability_merged(state
, other
->state
);
1256 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1257 pa_device_port_set_available(port
, available
);
1259 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
1260 pa_device_port_set_available(port
, available
);
1262 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HSP
);
1263 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HSP
);
1268 case PROFILE_A2DP_SOURCE
: {
1269 pa_device_port
*port
;
1270 pa_port_available_t available
= transport_state_to_availability(state
);
1272 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
1273 pa_device_port_set_available(port
, available
);
1275 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP_SOURCE
);
1276 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP_SOURCE
);
1281 case PROFILE_A2DP
: {
1282 pa_device_port
*port
;
1283 pa_port_available_t available
;
1284 pa_bluetooth_transport
*other
= u
->device
->transports
[PROFILE_HSP
];
1287 available
= transport_state_to_availability(state
);
1289 available
= transport_state_to_availability_merged(state
, other
->state
);
1291 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1292 pa_device_port_set_available(port
, available
);
1294 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP
);
1295 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP
);
1301 pa_assert_not_reached();
1305 if (bt_transport_acquire(u
, true) >= 0) {
1307 pa_log_debug("Resuming source %s, because the bluetooth audio state changed to 'playing'.", u
->source
->name
);
1308 pa_source_suspend(u
->source
, false, PA_SUSPEND_IDLE
|PA_SUSPEND_USER
);
1312 pa_log_debug("Resuming sink %s, because the bluetooth audio state changed to 'playing'.", u
->sink
->name
);
1313 pa_sink_suspend(u
->sink
, false, PA_SUSPEND_IDLE
|PA_SUSPEND_USER
);
1317 if (release
&& u
->transport_acquired
) {
1318 /* FIXME: this release is racy, since the audio stream might have
1319 been set up again in the meantime (but not processed yet by PA).
1320 BlueZ should probably release the transport automatically, and
1321 in that case we would just mark the transport as released */
1323 /* Remote side closed the stream so we consider it PA_SUSPEND_USER */
1325 pa_log_debug("Suspending source %s, because the remote end closed the stream.", u
->source
->name
);
1326 pa_source_suspend(u
->source
, true, PA_SUSPEND_USER
);
1330 pa_log_debug("Suspending sink %s, because the remote end closed the stream.", u
->sink
->name
);
1331 pa_sink_suspend(u
->sink
, true, PA_SUSPEND_USER
);
1336 /* Run from main thread */
1337 static void sink_set_volume_cb(pa_sink
*s
) {
1346 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1347 u
= pa_shared_get(s
->core
, k
);
1351 pa_assert(u
->sink
== s
);
1352 pa_assert(u
->profile
== PROFILE_HSP
);
1353 pa_assert(u
->transport
);
1355 gain
= (dbus_uint16_t
) round((double) pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
/ PA_VOLUME_NORM
);
1356 volume
= (pa_volume_t
) round((double) gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1358 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1360 pa_bluetooth_transport_set_speaker_gain(u
->transport
, gain
);
1363 /* Run from main thread */
1364 static void source_set_volume_cb(pa_source
*s
) {
1373 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1374 u
= pa_shared_get(s
->core
, k
);
1378 pa_assert(u
->source
== s
);
1379 pa_assert(u
->profile
== PROFILE_HSP
);
1380 pa_assert(u
->transport
);
1382 gain
= (dbus_uint16_t
) round((double) pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
/ PA_VOLUME_NORM
);
1383 volume
= (pa_volume_t
) round((double) gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1385 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1387 pa_bluetooth_transport_set_microphone_gain(u
->transport
, gain
);
1390 /* Run from main thread */
1391 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, bool *namereg_fail
) {
1397 pa_assert(device_id
);
1398 pa_assert(namereg_fail
);
1400 t
= pa_sprintf_malloc("%s_name", type
);
1401 n
= pa_modargs_get_value(ma
, t
, NULL
);
1405 *namereg_fail
= true;
1406 return pa_xstrdup(n
);
1409 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1410 *namereg_fail
= true;
1413 *namereg_fail
= false;
1416 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1419 static int sco_over_pcm_state_update(struct userdata
*u
, bool changed
) {
1421 pa_assert(USE_SCO_OVER_PCM(u
));
1423 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1424 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1426 if (u
->stream_fd
>= 0)
1429 pa_log_debug("Resuming SCO over PCM");
1430 if (init_profile(u
) < 0) {
1431 pa_log("Can't resume SCO over PCM");
1435 if (bt_transport_acquire(u
, false) < 0)
1444 if (u
->stream_fd
< 0)
1447 pa_log_debug("Closing SCO over PCM");
1449 bt_transport_release(u
);
1455 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
1457 pa_sink_assert_ref(s
);
1460 if (!USE_SCO_OVER_PCM(u
) || s
!= u
->hsp
.sco_sink
)
1463 sco_over_pcm_state_update(u
, true);
1468 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
1470 pa_source_assert_ref(s
);
1473 if (!USE_SCO_OVER_PCM(u
) || s
!= u
->hsp
.sco_source
)
1476 sco_over_pcm_state_update(u
, true);
1481 static pa_hook_result_t
transport_nrec_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
, struct userdata
*u
) {
1487 if (t
!= u
->transport
)
1490 p
= pa_proplist_new();
1491 pa_proplist_sets(p
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1492 pa_source_update_proplist(u
->source
, PA_UPDATE_REPLACE
, p
);
1493 pa_proplist_free(p
);
1498 static pa_hook_result_t
transport_microphone_gain_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
,
1499 struct userdata
*u
) {
1505 if (t
!= u
->transport
)
1508 pa_assert(u
->source
);
1510 pa_cvolume_set(&v
, u
->sample_spec
.channels
,
1511 (pa_volume_t
) round((double) t
->microphone_gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
));
1512 pa_source_volume_changed(u
->source
, &v
);
1517 static pa_hook_result_t
transport_speaker_gain_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
,
1518 struct userdata
*u
) {
1524 if (t
!= u
->transport
)
1529 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) round((double) t
->speaker_gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
));
1530 pa_sink_volume_changed(u
->sink
, &v
);
1535 static void connect_ports(struct userdata
*u
, void *sink_or_source_new_data
, pa_direction_t direction
) {
1537 pa_sink_new_data
*sink_new_data
;
1538 pa_source_new_data
*source_new_data
;
1540 pa_device_port
*port
;
1542 if (direction
== PA_DIRECTION_OUTPUT
)
1543 data
.sink_new_data
= sink_or_source_new_data
;
1545 data
.source_new_data
= sink_or_source_new_data
;
1547 switch (u
->profile
) {
1549 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1550 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1551 pa_device_port_ref(port
);
1554 case PROFILE_A2DP_SOURCE
:
1555 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
1556 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1557 pa_device_port_ref(port
);
1561 if (direction
== PA_DIRECTION_OUTPUT
) {
1562 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1563 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1565 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
1566 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1568 pa_device_port_ref(port
);
1572 if (direction
== PA_DIRECTION_OUTPUT
) {
1573 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
1574 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1576 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
1577 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1579 pa_device_port_ref(port
);
1583 pa_assert_not_reached();
1587 static int sink_set_port_cb(pa_sink
*s
, pa_device_port
*p
) {
1591 static int source_set_port_cb(pa_source
*s
, pa_device_port
*p
) {
1595 /* Run from main thread */
1596 static int add_sink(struct userdata
*u
) {
1599 pa_assert(u
->transport
);
1601 if (USE_SCO_OVER_PCM(u
)) {
1604 u
->sink
= u
->hsp
.sco_sink
;
1605 p
= pa_proplist_new();
1606 pa_proplist_sets(p
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1607 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
1608 pa_proplist_free(p
);
1610 pa_sink_new_data data
;
1613 pa_sink_new_data_init(&data
);
1614 data
.driver
= __FILE__
;
1615 data
.module
= u
->module
;
1616 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1617 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1618 if (u
->profile
== PROFILE_HSP
)
1619 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1620 data
.card
= u
->card
;
1621 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
1622 data
.namereg_fail
= b
;
1624 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1625 pa_log("Invalid properties");
1626 pa_sink_new_data_done(&data
);
1629 connect_ports(u
, &data
, PA_DIRECTION_OUTPUT
);
1631 if (!u
->transport_acquired
)
1632 switch (u
->profile
) {
1635 pa_assert_not_reached(); /* Profile switch should have failed */
1638 data
.suspend_cause
= PA_SUSPEND_USER
;
1640 case PROFILE_A2DP_SOURCE
:
1642 pa_assert_not_reached();
1645 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
);
1646 pa_sink_new_data_done(&data
);
1649 pa_log_error("Failed to create sink");
1653 u
->sink
->userdata
= u
;
1654 u
->sink
->parent
.process_msg
= sink_process_msg
;
1655 u
->sink
->set_port
= sink_set_port_cb
;
1658 if (u
->profile
== PROFILE_HSP
) {
1659 pa_sink_set_set_volume_callback(u
->sink
, sink_set_volume_cb
);
1660 u
->sink
->n_volume_steps
= 16;
1662 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1663 pa_shared_set(u
->core
, k
, u
);
1670 /* Run from main thread */
1671 static int add_source(struct userdata
*u
) {
1674 pa_assert(u
->transport
);
1676 if (USE_SCO_OVER_PCM(u
)) {
1677 u
->source
= u
->hsp
.sco_source
;
1678 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1680 pa_source_new_data data
;
1683 pa_source_new_data_init(&data
);
1684 data
.driver
= __FILE__
;
1685 data
.module
= u
->module
;
1686 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1687 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1688 if (u
->profile
== PROFILE_HSP
)
1689 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1691 data
.card
= u
->card
;
1692 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
1693 data
.namereg_fail
= b
;
1695 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1696 pa_log("Invalid properties");
1697 pa_source_new_data_done(&data
);
1701 connect_ports(u
, &data
, PA_DIRECTION_INPUT
);
1703 if (!u
->transport_acquired
)
1704 switch (u
->profile
) {
1706 pa_assert_not_reached(); /* Profile switch should have failed */
1708 case PROFILE_A2DP_SOURCE
:
1710 data
.suspend_cause
= PA_SUSPEND_USER
;
1714 pa_assert_not_reached();
1717 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
);
1718 pa_source_new_data_done(&data
);
1721 pa_log_error("Failed to create source");
1725 u
->source
->userdata
= u
;
1726 u
->source
->parent
.process_msg
= source_process_msg
;
1727 u
->source
->set_port
= source_set_port_cb
;
1730 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
)) {
1731 pa_bluetooth_transport
*t
= u
->transport
;
1732 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1735 if (u
->profile
== PROFILE_HSP
) {
1736 pa_source_set_set_volume_callback(u
->source
, source_set_volume_cb
);
1737 u
->source
->n_volume_steps
= 16;
1739 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1740 pa_shared_set(u
->core
, k
, u
);
1747 static void bt_transport_config_a2dp(struct userdata
*u
) {
1748 const pa_bluetooth_transport
*t
;
1749 struct a2dp_info
*a2dp
= &u
->a2dp
;
1755 config
= (a2dp_sbc_t
*) t
->config
;
1757 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1759 if (a2dp
->sbc_initialized
)
1760 sbc_reinit(&a2dp
->sbc
, 0);
1762 sbc_init(&a2dp
->sbc
, 0);
1763 a2dp
->sbc_initialized
= true;
1765 switch (config
->frequency
) {
1766 case SBC_SAMPLING_FREQ_16000
:
1767 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
1768 u
->sample_spec
.rate
= 16000U;
1770 case SBC_SAMPLING_FREQ_32000
:
1771 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
1772 u
->sample_spec
.rate
= 32000U;
1774 case SBC_SAMPLING_FREQ_44100
:
1775 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
1776 u
->sample_spec
.rate
= 44100U;
1778 case SBC_SAMPLING_FREQ_48000
:
1779 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
1780 u
->sample_spec
.rate
= 48000U;
1783 pa_assert_not_reached();
1786 switch (config
->channel_mode
) {
1787 case SBC_CHANNEL_MODE_MONO
:
1788 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
1789 u
->sample_spec
.channels
= 1;
1791 case SBC_CHANNEL_MODE_DUAL_CHANNEL
:
1792 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
1793 u
->sample_spec
.channels
= 2;
1795 case SBC_CHANNEL_MODE_STEREO
:
1796 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
1797 u
->sample_spec
.channels
= 2;
1799 case SBC_CHANNEL_MODE_JOINT_STEREO
:
1800 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
1801 u
->sample_spec
.channels
= 2;
1804 pa_assert_not_reached();
1807 switch (config
->allocation_method
) {
1808 case SBC_ALLOCATION_SNR
:
1809 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
1811 case SBC_ALLOCATION_LOUDNESS
:
1812 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
1815 pa_assert_not_reached();
1818 switch (config
->subbands
) {
1819 case SBC_SUBBANDS_4
:
1820 a2dp
->sbc
.subbands
= SBC_SB_4
;
1822 case SBC_SUBBANDS_8
:
1823 a2dp
->sbc
.subbands
= SBC_SB_8
;
1826 pa_assert_not_reached();
1829 switch (config
->block_length
) {
1830 case SBC_BLOCK_LENGTH_4
:
1831 a2dp
->sbc
.blocks
= SBC_BLK_4
;
1833 case SBC_BLOCK_LENGTH_8
:
1834 a2dp
->sbc
.blocks
= SBC_BLK_8
;
1836 case SBC_BLOCK_LENGTH_12
:
1837 a2dp
->sbc
.blocks
= SBC_BLK_12
;
1839 case SBC_BLOCK_LENGTH_16
:
1840 a2dp
->sbc
.blocks
= SBC_BLK_16
;
1843 pa_assert_not_reached();
1846 a2dp
->min_bitpool
= config
->min_bitpool
;
1847 a2dp
->max_bitpool
= config
->max_bitpool
;
1849 /* Set minimum bitpool for source to get the maximum possible block_size */
1850 a2dp
->sbc
.bitpool
= u
->profile
== PROFILE_A2DP
? a2dp
->max_bitpool
: a2dp
->min_bitpool
;
1851 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
1852 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
1854 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
1855 a2dp
->sbc
.allocation
, a2dp
->sbc
.subbands
, a2dp
->sbc
.blocks
, a2dp
->sbc
.bitpool
);
1858 static void bt_transport_config(struct userdata
*u
) {
1859 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
1860 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1861 u
->sample_spec
.channels
= 1;
1862 u
->sample_spec
.rate
= 8000;
1864 bt_transport_config_a2dp(u
);
1867 /* Run from main thread */
1868 static pa_hook_result_t
transport_state_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
, struct userdata
*u
) {
1872 if (t
== u
->transport
&& t
->state
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1873 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
1875 if (t
->device
== u
->device
)
1876 handle_transport_state_change(u
, t
);
1881 /* Run from main thread */
1882 static int setup_transport(struct userdata
*u
) {
1883 pa_bluetooth_transport
*t
;
1886 pa_assert(!u
->transport
);
1887 pa_assert(u
->profile
!= PROFILE_OFF
);
1889 /* check if profile has a transport */
1890 t
= u
->device
->transports
[u
->profile
];
1892 pa_log_warn("Profile has no transport");
1898 if (u
->profile
== PROFILE_A2DP_SOURCE
|| u
->profile
== PROFILE_HFGW
)
1899 bt_transport_acquire(u
, true); /* In case of error, the sink/sources will be created suspended */
1900 else if (bt_transport_acquire(u
, false) < 0)
1901 return -1; /* We need to fail here until the interactions with module-suspend-on-idle and alike get improved */
1903 bt_transport_config(u
);
1908 /* Run from main thread */
1909 static int init_profile(struct userdata
*u
) {
1912 pa_assert(u
->profile
!= PROFILE_OFF
);
1914 if (setup_transport(u
) < 0)
1917 pa_assert(u
->transport
);
1919 if (u
->profile
== PROFILE_A2DP
||
1920 u
->profile
== PROFILE_HSP
||
1921 u
->profile
== PROFILE_HFGW
)
1922 if (add_sink(u
) < 0)
1925 if (u
->profile
== PROFILE_HSP
||
1926 u
->profile
== PROFILE_A2DP_SOURCE
||
1927 u
->profile
== PROFILE_HFGW
)
1928 if (add_source(u
) < 0)
1934 /* Run from main thread */
1935 static void stop_thread(struct userdata
*u
) {
1940 if (u
->sink
&& !USE_SCO_OVER_PCM(u
))
1941 pa_sink_unlink(u
->sink
);
1943 if (u
->source
&& !USE_SCO_OVER_PCM(u
))
1944 pa_source_unlink(u
->source
);
1947 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
1948 pa_thread_free(u
->thread
);
1952 if (u
->rtpoll_item
) {
1953 pa_rtpoll_item_free(u
->rtpoll_item
);
1954 u
->rtpoll_item
= NULL
;
1958 bt_transport_release(u
);
1959 u
->transport
= NULL
;
1963 if (u
->profile
== PROFILE_HSP
) {
1964 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1965 pa_shared_remove(u
->core
, k
);
1969 pa_sink_unref(u
->sink
);
1974 if (u
->profile
== PROFILE_HSP
) {
1975 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1976 pa_shared_remove(u
->core
, k
);
1980 pa_source_unref(u
->source
);
1985 pa_thread_mq_done(&u
->thread_mq
);
1987 pa_rtpoll_free(u
->rtpoll
);
1991 if (u
->read_smoother
) {
1992 pa_smoother_free(u
->read_smoother
);
1993 u
->read_smoother
= NULL
;
1997 /* Run from main thread */
1998 static int start_thread(struct userdata
*u
) {
2000 pa_assert(!u
->thread
);
2001 pa_assert(!u
->rtpoll
);
2002 pa_assert(!u
->rtpoll_item
);
2004 u
->rtpoll
= pa_rtpoll_new();
2005 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
2007 if (USE_SCO_OVER_PCM(u
)) {
2008 if (sco_over_pcm_state_update(u
, false) < 0) {
2012 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
2013 pa_shared_remove(u
->core
, k
);
2018 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
2019 pa_shared_remove(u
->core
, k
);
2026 pa_sink_ref(u
->sink
);
2027 pa_source_ref(u
->source
);
2028 /* FIXME: monitor stream_fd error */
2032 if (!(u
->thread
= pa_thread_new("bluetooth", thread_func
, u
))) {
2033 pa_log_error("Failed to create IO thread");
2038 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
2039 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
2040 pa_sink_put(u
->sink
);
2042 if (u
->sink
->set_volume
)
2043 u
->sink
->set_volume(u
->sink
);
2047 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
2048 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
2049 pa_source_put(u
->source
);
2051 if (u
->source
->set_volume
)
2052 u
->source
->set_volume(u
->source
);
2058 static void save_sco_volume_callbacks(struct userdata
*u
) {
2060 pa_assert(USE_SCO_OVER_PCM(u
));
2062 u
->hsp
.sco_sink_set_volume
= u
->hsp
.sco_sink
->set_volume
;
2063 u
->hsp
.sco_source_set_volume
= u
->hsp
.sco_source
->set_volume
;
2066 static void restore_sco_volume_callbacks(struct userdata
*u
) {
2068 pa_assert(USE_SCO_OVER_PCM(u
));
2070 pa_sink_set_set_volume_callback(u
->hsp
.sco_sink
, u
->hsp
.sco_sink_set_volume
);
2071 pa_source_set_set_volume_callback(u
->hsp
.sco_source
, u
->hsp
.sco_source_set_volume
);
2074 /* Run from main thread */
2075 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
2080 pa_assert(new_profile
);
2081 pa_assert_se(u
= c
->userdata
);
2083 d
= PA_CARD_PROFILE_DATA(new_profile
);
2085 if (*d
!= PROFILE_OFF
) {
2086 const pa_bluetooth_device
*device
= u
->device
;
2088 if (!device
->transports
[*d
]) {
2089 pa_log_warn("Profile not connected, refused to switch profile to %s", new_profile
->name
);
2096 if (USE_SCO_OVER_PCM(u
))
2097 restore_sco_volume_callbacks(u
);
2100 u
->sample_spec
= u
->requested_sample_spec
;
2102 if (USE_SCO_OVER_PCM(u
))
2103 save_sco_volume_callbacks(u
);
2105 if (u
->profile
!= PROFILE_OFF
)
2106 if (init_profile(u
) < 0)
2109 if (u
->sink
|| u
->source
)
2110 if (start_thread(u
) < 0)
2118 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
2123 static void create_ports_for_profile(struct userdata
*u
, pa_hashmap
*ports
, pa_card_profile
*profile
) {
2124 pa_bluetooth_device
*device
= u
->device
;
2125 pa_device_port
*port
;
2127 pa_bluetooth_transport
*transport
;
2128 pa_bluetooth_transport_state_t transport_state
;
2130 d
= PA_CARD_PROFILE_DATA(profile
);
2132 pa_assert(*d
!= PROFILE_OFF
);
2134 transport
= device
->transports
[*d
];
2135 transport_state
= transport
? transport
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2139 if ((port
= pa_hashmap_get(ports
, "bluetooth-output")) != NULL
) {
2140 pa_bluetooth_transport
*other
= device
->transports
[PROFILE_HSP
];
2141 pa_bluetooth_transport_state_t other_state
= other
? other
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2143 port
->priority
= PA_MAX(port
->priority
, profile
->priority
* 100);
2144 port
->available
= transport_state_to_availability_merged(transport_state
, other_state
);
2145 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2147 pa_assert_se(port
= pa_device_port_new(u
->core
, "bluetooth-output", _("Bluetooth Output"), 0));
2148 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2149 port
->is_output
= 1;
2151 port
->priority
= profile
->priority
* 100;
2152 port
->available
= transport_state_to_availability(transport_state
);
2153 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2158 case PROFILE_A2DP_SOURCE
:
2159 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2160 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2161 port
->is_output
= 0;
2163 port
->priority
= profile
->priority
* 100;
2164 port
->available
= transport_state_to_availability(transport_state
);
2165 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2169 if ((port
= pa_hashmap_get(ports
, "bluetooth-output")) != NULL
) {
2170 pa_bluetooth_transport
*other
= device
->transports
[PROFILE_A2DP
];
2171 pa_bluetooth_transport_state_t other_state
= other
? other
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2173 port
->priority
= PA_MAX(port
->priority
, profile
->priority
* 100);
2174 port
->available
= transport_state_to_availability_merged(transport_state
, other_state
);
2175 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2177 pa_assert_se(port
= pa_device_port_new(u
->core
, "bluetooth-output", _("Bluetooth Output"), 0));
2178 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2179 port
->is_output
= 1;
2181 port
->priority
= profile
->priority
* 100;
2182 port
->available
= transport_state_to_availability(transport_state
);
2183 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2186 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2187 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2188 port
->is_output
= 0;
2190 port
->priority
= profile
->priority
* 100;
2191 port
->available
= transport_state_to_availability(transport_state
);
2192 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2196 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2197 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2198 port
->is_output
= 1;
2200 port
->priority
= profile
->priority
* 100;
2201 port
->available
= transport_state_to_availability(transport_state
);
2202 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2204 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2205 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2206 port
->is_output
= 0;
2208 port
->priority
= profile
->priority
* 100;
2209 port
->available
= transport_state_to_availability(transport_state
);
2210 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2214 pa_assert_not_reached();
2219 /* Run from main thread */
2220 static pa_card_profile
*create_card_profile(struct userdata
*u
, const char *uuid
) {
2221 pa_card_profile
*p
= NULL
;
2224 if (pa_streq(uuid
, A2DP_SINK_UUID
)) {
2225 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2229 p
->max_sink_channels
= 2;
2230 p
->max_source_channels
= 0;
2232 d
= PA_CARD_PROFILE_DATA(p
);
2234 } else if (pa_streq(uuid
, A2DP_SOURCE_UUID
)) {
2235 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2239 p
->max_sink_channels
= 0;
2240 p
->max_source_channels
= 2;
2242 d
= PA_CARD_PROFILE_DATA(p
);
2243 *d
= PROFILE_A2DP_SOURCE
;
2244 } else if (pa_streq(uuid
, HSP_HS_UUID
) || pa_streq(uuid
, HFP_HS_UUID
)) {
2245 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2249 p
->max_sink_channels
= 1;
2250 p
->max_source_channels
= 1;
2252 d
= PA_CARD_PROFILE_DATA(p
);
2254 } else if (pa_streq(uuid
, HFP_AG_UUID
)) {
2255 p
= pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile
));
2259 p
->max_sink_channels
= 1;
2260 p
->max_source_channels
= 1;
2262 d
= PA_CARD_PROFILE_DATA(p
);
2269 /* Run from main thread */
2270 static int add_card(struct userdata
*u
) {
2271 pa_card_new_data data
;
2277 const char *default_profile
;
2278 const pa_bluetooth_device
*device
= u
->device
;
2279 const pa_bluetooth_uuid
*uuid
;
2284 pa_card_new_data_init(&data
);
2285 data
.driver
= __FILE__
;
2286 data
.module
= u
->module
;
2288 n
= pa_bluetooth_cleanup_name(device
->name
);
2289 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2291 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2292 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2293 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2294 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2295 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2296 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2297 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2298 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2299 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2300 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2301 data
.namereg_fail
= b
;
2303 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2304 pa_log("Invalid properties");
2305 pa_card_new_data_done(&data
);
2309 PA_LLIST_FOREACH(uuid
, device
->uuids
) {
2310 p
= create_card_profile(u
, uuid
->uuid
);
2315 if (pa_hashmap_get(data
.profiles
, p
->name
)) {
2316 pa_card_profile_free(p
);
2320 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2321 create_ports_for_profile(u
, data
.ports
, p
);
2324 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2326 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2327 d
= PA_CARD_PROFILE_DATA(p
);
2329 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2331 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2332 if (pa_hashmap_get(data
.profiles
, default_profile
))
2333 pa_card_new_data_set_profile(&data
, default_profile
);
2335 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2338 u
->card
= pa_card_new(u
->core
, &data
);
2339 pa_card_new_data_done(&data
);
2342 pa_log("Failed to allocate card.");
2346 u
->card
->userdata
= u
;
2347 u
->card
->set_profile
= card_set_profile
;
2349 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2351 if (*d
!= PROFILE_OFF
&& !device
->transports
[*d
]) {
2352 pa_log_warn("Default profile not connected, selecting off profile");
2353 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2354 u
->card
->save_profile
= false;
2357 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2360 if (USE_SCO_OVER_PCM(u
))
2361 save_sco_volume_callbacks(u
);
2366 /* Run from main thread */
2367 static pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2368 pa_bluetooth_device
*d
= NULL
;
2372 if (!address
&& !path
) {
2373 pa_log_error("Failed to get device address/path from module arguments.");
2378 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2379 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2383 if (address
&& !(pa_streq(d
->address
, address
))) {
2384 pa_log_error("Passed path %s address %s != %s don't match.", path
, d
->address
, address
);
2389 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2390 pa_log_error("%s is not known.", address
);
2396 u
->address
= pa_xstrdup(d
->address
);
2397 u
->path
= pa_xstrdup(d
->path
);
2403 /* Run from main thread */
2404 static pa_hook_result_t
uuid_added_cb(pa_bluetooth_discovery
*y
, const struct pa_bluetooth_hook_uuid_data
*data
,
2405 struct userdata
*u
) {
2407 pa_hashmap
*new_ports
;
2410 pa_assert(data
->device
);
2411 pa_assert(data
->uuid
);
2414 if (data
->device
!= u
->device
)
2417 p
= create_card_profile(u
, data
->uuid
);
2422 if (pa_hashmap_get(u
->card
->profiles
, p
->name
)) {
2423 pa_card_profile_free(p
);
2427 pa_card_add_profile(u
->card
, p
);
2429 new_ports
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
2431 create_ports_for_profile(u
, new_ports
, p
);
2433 pa_card_add_ports(u
->card
, new_ports
);
2435 pa_device_port_hashmap_free(new_ports
);
2440 /* Run from main thread */
2441 static pa_hook_result_t
discovery_hook_cb(pa_bluetooth_discovery
*y
, const pa_bluetooth_device
*d
, struct userdata
*u
) {
2449 pa_log_debug("Device %s removed: unloading module", d
->path
);
2450 else if (!pa_bluetooth_device_any_audio_connected(d
))
2451 pa_log_debug("Unloading module, because device %s doesn't have any audio profiles connected anymore.", d
->path
);
2455 pa_module_unload(u
->core
, u
->module
, true);
2460 int pa__init(pa_module
* m
) {
2464 const char *address
, *path
;
2465 pa_bluetooth_device
*device
;
2469 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
2470 pa_log_error("Failed to parse module arguments");
2474 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
2478 u
->sample_spec
= m
->core
->default_sample_spec
;
2481 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
2482 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
2483 pa_log("SCO sink not found");
2487 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
2488 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
2489 pa_log("SCO source not found");
2493 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
2494 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
2495 pa_log_error("Failed to get rate from module arguments");
2499 u
->auto_connect
= true;
2500 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
2501 pa_log("Failed to parse auto_connect= argument");
2505 channels
= u
->sample_spec
.channels
;
2506 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
2507 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
2508 pa_log_error("Failed to get channels from module arguments");
2511 u
->sample_spec
.channels
= (uint8_t) channels
;
2512 u
->requested_sample_spec
= u
->sample_spec
;
2514 address
= pa_modargs_get_value(ma
, "address", NULL
);
2515 path
= pa_modargs_get_value(ma
, "path", NULL
);
2517 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
2520 if (!(device
= find_device(u
, address
, path
)))
2526 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED
),
2527 PA_HOOK_NORMAL
, (pa_hook_cb_t
) discovery_hook_cb
, u
);
2529 u
->uuid_added_slot
=
2530 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_DEVICE_UUID_ADDED
),
2531 PA_HOOK_NORMAL
, (pa_hook_cb_t
) uuid_added_cb
, u
);
2533 u
->sink_state_changed_slot
=
2534 pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SINK_STATE_CHANGED
],
2535 PA_HOOK_NORMAL
, (pa_hook_cb_t
) sink_state_changed_cb
, u
);
2537 u
->source_state_changed_slot
=
2538 pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SOURCE_STATE_CHANGED
],
2539 PA_HOOK_NORMAL
, (pa_hook_cb_t
) source_state_changed_cb
, u
);
2541 u
->transport_state_changed_slot
=
2542 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED
),
2543 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_state_changed_cb
, u
);
2545 u
->transport_nrec_changed_slot
=
2546 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_NREC_CHANGED
),
2547 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_nrec_changed_cb
, u
);
2549 u
->transport_microphone_changed_slot
=
2550 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED
),
2551 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_microphone_gain_changed_cb
, u
);
2553 u
->transport_speaker_changed_slot
=
2554 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED
),
2555 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_speaker_gain_changed_cb
, u
);
2557 /* Add the card structure. This will also initialize the default profile */
2558 if (add_card(u
) < 0)
2561 if (!(u
->msg
= pa_msgobject_new(bluetooth_msg
)))
2564 u
->msg
->parent
.process_msg
= device_process_msg
;
2565 u
->msg
->card
= u
->card
;
2567 if (u
->profile
!= PROFILE_OFF
)
2568 if (init_profile(u
) < 0)
2571 if (u
->sink
|| u
->source
)
2572 if (start_thread(u
) < 0)
2580 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
2591 int pa__get_n_used(pa_module
*m
) {
2595 pa_assert_se(u
= m
->userdata
);
2598 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
2599 (u
->source
? pa_source_linked_by(u
->source
) : 0);
2602 void pa__done(pa_module
*m
) {
2607 if (!(u
= m
->userdata
))
2612 if (u
->discovery_slot
)
2613 pa_hook_slot_free(u
->discovery_slot
);
2615 if (u
->uuid_added_slot
)
2616 pa_hook_slot_free(u
->uuid_added_slot
);
2618 if (u
->sink_state_changed_slot
)
2619 pa_hook_slot_free(u
->sink_state_changed_slot
);
2621 if (u
->source_state_changed_slot
)
2622 pa_hook_slot_free(u
->source_state_changed_slot
);
2624 if (u
->transport_state_changed_slot
)
2625 pa_hook_slot_free(u
->transport_state_changed_slot
);
2627 if (u
->transport_nrec_changed_slot
)
2628 pa_hook_slot_free(u
->transport_nrec_changed_slot
);
2630 if (u
->transport_microphone_changed_slot
)
2631 pa_hook_slot_free(u
->transport_microphone_changed_slot
);
2633 if (u
->transport_speaker_changed_slot
)
2634 pa_hook_slot_free(u
->transport_speaker_changed_slot
);
2636 if (USE_SCO_OVER_PCM(u
))
2637 restore_sco_volume_callbacks(u
);
2643 pa_card_free(u
->card
);
2646 pa_xfree(u
->a2dp
.buffer
);
2648 sbc_finish(&u
->a2dp
.sbc
);
2651 pa_modargs_free(u
->modargs
);
2653 pa_xfree(u
->address
);
2657 pa_bluetooth_discovery_unref(u
->discovery
);