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 pa_bool_t 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
;
153 pa_bool_t auto_connect
;
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 pa_log_debug("Audio stream torn down");
338 static void bt_transport_release(struct userdata
*u
) {
339 pa_assert(u
->transport
);
341 /* Ignore if already released */
342 if (!u
->transport_acquired
)
345 pa_log_debug("Releasing transport %s", u
->transport
->path
);
347 pa_bluetooth_transport_release(u
->transport
);
349 u
->transport_acquired
= false;
354 static int bt_transport_acquire(struct userdata
*u
, pa_bool_t optional
) {
355 pa_assert(u
->transport
);
357 if (u
->transport_acquired
)
360 pa_log_debug("Acquiring transport %s", u
->transport
->path
);
362 u
->stream_fd
= pa_bluetooth_transport_acquire(u
->transport
, optional
, &u
->read_link_mtu
, &u
->write_link_mtu
);
363 if (u
->stream_fd
< 0) {
365 pa_log("Failed to acquire transport %s", u
->transport
->path
);
367 pa_log_info("Failed optional acquire of transport %s", u
->transport
->path
);
372 u
->transport_acquired
= true;
373 pa_log_info("Transport %s acquired: fd %d", u
->transport
->path
, u
->stream_fd
);
378 /* Run from IO thread */
379 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
380 struct userdata
*u
= PA_SINK(o
)->userdata
;
381 pa_bool_t failed
= FALSE
;
384 pa_assert(u
->sink
== PA_SINK(o
));
385 pa_assert(u
->transport
);
389 case PA_SINK_MESSAGE_SET_STATE
:
391 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
393 case PA_SINK_SUSPENDED
:
394 /* Ignore if transition is PA_SINK_INIT->PA_SINK_SUSPENDED */
395 if (!PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
))
398 /* Stop the device if the source is suspended as well */
399 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
)
400 /* We deliberately ignore whether stopping
401 * actually worked. Since the stream_fd is
402 * closed it doesn't really matter */
403 bt_transport_release(u
);
408 case PA_SINK_RUNNING
:
409 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
412 /* Resume the device if the source was suspended as well */
413 if (!u
->source
|| !PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
)) {
414 if (bt_transport_acquire(u
, false) < 0)
421 case PA_SINK_UNLINKED
:
423 case PA_SINK_INVALID_STATE
:
428 case PA_SINK_MESSAGE_GET_LATENCY
: {
430 if (u
->read_smoother
) {
433 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
434 wi
= pa_bytes_to_usec(u
->write_index
+ u
->write_block_size
, &u
->sample_spec
);
436 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
440 ri
= pa_rtclock_now() - u
->started_at
;
441 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
443 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
446 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
451 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
453 return (r
< 0 || !failed
) ? r
: -1;
456 /* Run from IO thread */
457 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
458 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
459 pa_bool_t failed
= FALSE
;
462 pa_assert(u
->source
== PA_SOURCE(o
));
463 pa_assert(u
->transport
);
467 case PA_SOURCE_MESSAGE_SET_STATE
:
469 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
471 case PA_SOURCE_SUSPENDED
:
472 /* Ignore if transition is PA_SOURCE_INIT->PA_SOURCE_SUSPENDED */
473 if (!PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
))
476 /* Stop the device if the sink is suspended as well */
477 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
)
478 bt_transport_release(u
);
480 if (u
->read_smoother
)
481 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
485 case PA_SOURCE_RUNNING
:
486 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
489 /* Resume the device if the sink was suspended as well */
490 if (!u
->sink
|| !PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
)) {
491 if (bt_transport_acquire(u
, false) < 0)
496 /* We don't resume the smoother here. Instead we
497 * wait until the first packet arrives */
500 case PA_SOURCE_UNLINKED
:
502 case PA_SOURCE_INVALID_STATE
:
507 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
510 if (u
->read_smoother
) {
511 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
512 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
514 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
516 *((pa_usec_t
*) data
) = 0;
523 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
525 return (r
< 0 || !failed
) ? r
: -1;
528 /* Called from main thread context */
529 static int device_process_msg(pa_msgobject
*obj
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
530 struct bluetooth_msg
*u
= BLUETOOTH_MSG(obj
);
533 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED
: {
534 if (u
->card
->module
->unload_requested
)
537 pa_log_debug("Switching the profile to off due to IO thread failure.");
539 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
546 /* Run from IO thread */
547 static int hsp_process_render(struct userdata
*u
) {
551 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
554 /* First, render some data */
555 if (!u
->write_memchunk
.memblock
)
556 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
558 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
564 /* Now write that data to the socket. The socket is of type
565 * SEQPACKET, and we generated the data of the MTU size, so this
566 * should just work. */
568 p
= (const uint8_t *) pa_memblock_acquire_chunk(&u
->write_memchunk
);
569 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
570 pa_memblock_release(u
->write_memchunk
.memblock
);
577 /* Retry right away if we got interrupted */
580 else if (errno
== EAGAIN
)
581 /* Hmm, apparently the socket was not writable, give up for now */
584 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
589 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
591 if ((size_t) l
!= u
->write_memchunk
.length
) {
592 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
593 (unsigned long long) l
,
594 (unsigned long long) u
->write_memchunk
.length
);
599 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
600 pa_memblock_unref(u
->write_memchunk
.memblock
);
601 pa_memchunk_reset(&u
->write_memchunk
);
610 /* Run from IO thread */
611 static int hsp_process_push(struct userdata
*u
) {
613 pa_memchunk memchunk
;
616 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
617 pa_assert(u
->source
);
618 pa_assert(u
->read_smoother
);
620 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
621 memchunk
.index
= memchunk
.length
= 0;
630 pa_bool_t found_tstamp
= FALSE
;
633 memset(&m
, 0, sizeof(m
));
634 memset(&aux
, 0, sizeof(aux
));
635 memset(&iov
, 0, sizeof(iov
));
640 m
.msg_controllen
= sizeof(aux
);
642 p
= pa_memblock_acquire(memchunk
.memblock
);
644 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
645 l
= recvmsg(u
->stream_fd
, &m
, 0);
646 pa_memblock_release(memchunk
.memblock
);
650 if (l
< 0 && errno
== EINTR
)
651 /* Retry right away if we got interrupted */
654 else if (l
< 0 && errno
== EAGAIN
)
655 /* Hmm, apparently the socket was not readable, give up for now. */
658 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
663 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
665 memchunk
.length
= (size_t) l
;
666 u
->read_index
+= (uint64_t) l
;
668 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
669 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
670 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
671 pa_rtclock_from_wallclock(tv
);
672 tstamp
= pa_timeval_load(tv
);
678 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
679 tstamp
= pa_rtclock_now();
682 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
683 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
685 pa_source_post(u
->source
, &memchunk
);
691 pa_memblock_unref(memchunk
.memblock
);
696 /* Run from IO thread */
697 static void a2dp_prepare_buffer(struct userdata
*u
) {
698 size_t min_buffer_size
= PA_MAX(u
->read_link_mtu
, u
->write_link_mtu
);
702 if (u
->a2dp
.buffer_size
>= min_buffer_size
)
705 u
->a2dp
.buffer_size
= 2 * min_buffer_size
;
706 pa_xfree(u
->a2dp
.buffer
);
707 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
710 /* Run from IO thread */
711 static int a2dp_process_render(struct userdata
*u
) {
712 struct a2dp_info
*a2dp
;
713 struct rtp_header
*header
;
714 struct rtp_payload
*payload
;
718 size_t to_write
, to_encode
;
719 unsigned frame_count
;
723 pa_assert(u
->profile
== PROFILE_A2DP
);
726 /* First, render some data */
727 if (!u
->write_memchunk
.memblock
)
728 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
730 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
732 a2dp_prepare_buffer(u
);
735 header
= a2dp
->buffer
;
736 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
740 /* Try to create a packet of the full MTU */
742 p
= (const uint8_t *) pa_memblock_acquire_chunk(&u
->write_memchunk
);
743 to_encode
= u
->write_memchunk
.length
;
745 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
746 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
748 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
752 encoded
= sbc_encode(&a2dp
->sbc
,
757 if (PA_UNLIKELY(encoded
<= 0)) {
758 pa_log_error("SBC encoding error (%li)", (long) encoded
);
759 pa_memblock_release(u
->write_memchunk
.memblock
);
763 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
764 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
766 pa_assert_fp((size_t) encoded
<= to_encode
);
767 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
769 pa_assert_fp((size_t) written
<= to_write
);
770 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
772 p
= (const uint8_t*) p
+ encoded
;
773 to_encode
-= encoded
;
775 d
= (uint8_t*) d
+ written
;
781 pa_memblock_release(u
->write_memchunk
.memblock
);
783 pa_assert(to_encode
== 0);
786 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
789 /* write it to the fifo */
790 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
793 header
->sequence_number
= htons(a2dp
->seq_num
++);
794 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
795 header
->ssrc
= htonl(1);
796 payload
->frame_count
= frame_count
;
798 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
803 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
810 /* Retry right away if we got interrupted */
813 else if (errno
== EAGAIN
)
814 /* Hmm, apparently the socket was not writable, give up for now */
817 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
822 pa_assert((size_t) l
<= nbytes
);
824 if ((size_t) l
!= nbytes
) {
825 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
826 (unsigned long long) l
,
827 (unsigned long long) nbytes
);
832 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
833 pa_memblock_unref(u
->write_memchunk
.memblock
);
834 pa_memchunk_reset(&u
->write_memchunk
);
844 static int a2dp_process_push(struct userdata
*u
) {
846 pa_memchunk memchunk
;
849 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
850 pa_assert(u
->source
);
851 pa_assert(u
->read_smoother
);
853 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
854 memchunk
.index
= memchunk
.length
= 0;
857 pa_bool_t found_tstamp
= FALSE
;
859 struct a2dp_info
*a2dp
;
860 struct rtp_header
*header
;
861 struct rtp_payload
*payload
;
865 size_t to_write
, to_decode
;
867 a2dp_prepare_buffer(u
);
870 header
= a2dp
->buffer
;
871 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
873 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
877 if (l
< 0 && errno
== EINTR
)
878 /* Retry right away if we got interrupted */
881 else if (l
< 0 && errno
== EAGAIN
)
882 /* Hmm, apparently the socket was not readable, give up for now. */
885 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
890 pa_assert((size_t) l
<= a2dp
->buffer_size
);
892 u
->read_index
+= (uint64_t) l
;
894 /* TODO: get timestamp from rtp */
896 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
897 tstamp
= pa_rtclock_now();
900 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
901 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
903 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
904 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
906 d
= pa_memblock_acquire(memchunk
.memblock
);
907 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
909 while (PA_LIKELY(to_decode
> 0)) {
913 decoded
= sbc_decode(&a2dp
->sbc
,
918 if (PA_UNLIKELY(decoded
<= 0)) {
919 pa_log_error("SBC decoding error (%li)", (long) decoded
);
920 pa_memblock_release(memchunk
.memblock
);
921 pa_memblock_unref(memchunk
.memblock
);
925 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
926 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
928 /* Reset frame length, it can be changed due to bitpool change */
929 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
931 pa_assert_fp((size_t) decoded
<= to_decode
);
932 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
934 pa_assert_fp((size_t) written
== a2dp
->codesize
);
936 p
= (const uint8_t*) p
+ decoded
;
937 to_decode
-= decoded
;
939 d
= (uint8_t*) d
+ written
;
943 memchunk
.length
-= to_write
;
945 pa_memblock_release(memchunk
.memblock
);
947 pa_source_post(u
->source
, &memchunk
);
953 pa_memblock_unref(memchunk
.memblock
);
958 static void a2dp_reduce_bitpool(struct userdata
*u
)
960 struct a2dp_info
*a2dp
;
967 /* Check if bitpool is already at its limit */
968 if (a2dp
->sbc
.bitpool
<= BITPOOL_DEC_LIMIT
)
971 bitpool
= a2dp
->sbc
.bitpool
- BITPOOL_DEC_STEP
;
973 if (bitpool
< BITPOOL_DEC_LIMIT
)
974 bitpool
= BITPOOL_DEC_LIMIT
;
976 a2dp_set_bitpool(u
, bitpool
);
979 static void thread_func(void *userdata
) {
980 struct userdata
*u
= userdata
;
981 unsigned do_write
= 0;
982 unsigned pending_read_bytes
= 0;
983 pa_bool_t writable
= FALSE
;
986 pa_assert(u
->transport
);
988 pa_log_debug("IO Thread starting up");
990 if (u
->core
->realtime_scheduling
)
991 pa_make_realtime(u
->core
->realtime_priority
);
993 pa_thread_mq_install(&u
->thread_mq
);
995 /* Setup the stream only if the transport was already acquired */
996 if (u
->transport_acquired
)
1000 struct pollfd
*pollfd
;
1002 pa_bool_t disable_timer
= TRUE
;
1004 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1006 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
1008 /* We should send two blocks to the device before we expect
1011 if (u
->write_index
== 0 && u
->read_index
<= 0)
1014 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
1017 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
1018 n_read
= hsp_process_push(u
);
1020 n_read
= a2dp_process_push(u
);
1025 /* We just read something, so we are supposed to write something, too */
1026 pending_read_bytes
+= n_read
;
1027 do_write
+= pending_read_bytes
/ u
->write_block_size
;
1028 pending_read_bytes
= pending_read_bytes
% u
->write_block_size
;
1032 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1034 if (PA_UNLIKELY(u
->sink
->thread_info
.rewind_requested
))
1035 pa_sink_process_rewind(u
->sink
, 0);
1038 if (pollfd
->revents
& POLLOUT
)
1041 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1042 pa_usec_t time_passed
;
1043 pa_usec_t audio_sent
;
1045 /* Hmm, there is no input stream we could synchronize
1046 * to. So let's do things by time */
1048 time_passed
= pa_rtclock_now() - u
->started_at
;
1049 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1051 if (audio_sent
<= time_passed
) {
1052 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1054 /* Never try to catch up for more than 100ms */
1055 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1056 pa_usec_t skip_usec
;
1057 uint64_t skip_bytes
;
1059 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1060 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1062 if (skip_bytes
> 0) {
1065 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1066 (unsigned long long) skip_usec
,
1067 (unsigned long long) skip_bytes
);
1069 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1070 pa_memblock_unref(tmp
.memblock
);
1071 u
->write_index
+= skip_bytes
;
1073 if (u
->profile
== PROFILE_A2DP
)
1074 a2dp_reduce_bitpool(u
);
1079 pending_read_bytes
= 0;
1083 if (writable
&& do_write
> 0) {
1086 if (u
->write_index
<= 0)
1087 u
->started_at
= pa_rtclock_now();
1089 if (u
->profile
== PROFILE_A2DP
) {
1090 if ((n_written
= a2dp_process_render(u
)) < 0)
1093 if ((n_written
= hsp_process_render(u
)) < 0)
1098 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1100 do_write
-= n_written
;
1104 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0) {
1105 pa_usec_t sleep_for
;
1106 pa_usec_t time_passed
, next_write_at
;
1109 /* Hmm, there is no input stream we could synchronize
1110 * to. So let's estimate when we need to wake up the latest */
1111 time_passed
= pa_rtclock_now() - u
->started_at
;
1112 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1113 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1114 /* 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); */
1116 /* drop stream every 500 ms */
1117 sleep_for
= PA_USEC_PER_MSEC
* 500;
1119 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1120 disable_timer
= FALSE
;
1126 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1128 /* Hmm, nothing to do. Let's sleep */
1130 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1131 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1133 if ((ret
= pa_rtpoll_run(u
->rtpoll
, TRUE
)) < 0) {
1134 pa_log_debug("pa_rtpoll_run failed with: %d", ret
);
1138 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1139 bt_transport_release(u
);
1143 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1145 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1146 pa_log_info("FD error: %s%s%s%s",
1147 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1148 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1149 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1150 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1157 /* In case of HUP, just tear down the streams */
1158 if (!pollfd
|| (pollfd
->revents
& POLLHUP
) == 0)
1162 pending_read_bytes
= 0;
1169 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1170 pa_log_debug("IO thread failed");
1171 pa_asyncmsgq_post(pa_thread_mq_get()->outq
, PA_MSGOBJECT(u
->msg
), BLUETOOTH_MESSAGE_IO_THREAD_FAILED
, NULL
, 0, NULL
, NULL
);
1172 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1175 pa_log_debug("IO thread shutting down");
1178 static pa_port_available_t
transport_state_to_availability(pa_bluetooth_transport_state_t state
) {
1179 if (state
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1180 return PA_PORT_AVAILABLE_NO
;
1181 else if (state
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
)
1182 return PA_PORT_AVAILABLE_YES
;
1184 return PA_PORT_AVAILABLE_UNKNOWN
;
1187 static pa_port_available_t
transport_state_to_availability_merged(pa_bluetooth_transport_state_t state1
,
1188 pa_bluetooth_transport_state_t state2
) {
1189 if (state1
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
&& state2
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1190 return PA_PORT_AVAILABLE_NO
;
1191 else if (state1
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
|| state2
>= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING
)
1192 return PA_PORT_AVAILABLE_YES
;
1194 return PA_PORT_AVAILABLE_UNKNOWN
;
1197 /* Run from main thread */
1198 static void handle_transport_state_change(struct userdata
*u
, struct pa_bluetooth_transport
*transport
) {
1199 bool acquire
= FALSE
;
1200 bool release
= FALSE
;
1201 enum profile profile
;
1202 pa_bluetooth_transport_state_t state
;
1205 pa_assert(transport
);
1207 profile
= transport
->profile
;
1208 state
= transport
->state
;
1210 if (!pa_hashmap_get(u
->card
->profiles
, pa_bt_profile_to_string(profile
)))
1214 case PROFILE_HFGW
: {
1215 pa_device_port
*port
;
1216 pa_port_available_t available
= transport_state_to_availability(state
);
1218 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
1219 pa_device_port_set_available(port
, available
);
1221 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
1222 pa_device_port_set_available(port
, available
);
1224 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HFGW
);
1225 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HFGW
);
1231 pa_device_port
*port
;
1232 pa_port_available_t available
;
1233 pa_bluetooth_transport
*other
= u
->device
->transports
[PROFILE_A2DP
];
1236 available
= transport_state_to_availability(state
);
1238 available
= transport_state_to_availability_merged(state
, other
->state
);
1240 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1241 pa_device_port_set_available(port
, available
);
1243 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
1244 pa_device_port_set_available(port
, available
);
1246 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HSP
);
1247 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_HSP
);
1252 case PROFILE_A2DP_SOURCE
: {
1253 pa_device_port
*port
;
1254 pa_port_available_t available
= transport_state_to_availability(state
);
1256 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
1257 pa_device_port_set_available(port
, available
);
1259 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP_SOURCE
);
1260 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP_SOURCE
);
1265 case PROFILE_A2DP
: {
1266 pa_device_port
*port
;
1267 pa_port_available_t available
;
1268 pa_bluetooth_transport
*other
= u
->device
->transports
[PROFILE_HSP
];
1271 available
= transport_state_to_availability(state
);
1273 available
= transport_state_to_availability_merged(state
, other
->state
);
1275 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1276 pa_device_port_set_available(port
, available
);
1278 acquire
= (available
== PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP
);
1279 release
= (available
!= PA_PORT_AVAILABLE_YES
&& u
->profile
== PROFILE_A2DP
);
1285 pa_assert_not_reached();
1289 if (bt_transport_acquire(u
, true) >= 0) {
1291 pa_log_debug("Resuming source %s, because the bluetooth audio state changed to 'playing'.", u
->source
->name
);
1292 pa_source_suspend(u
->source
, FALSE
, PA_SUSPEND_IDLE
|PA_SUSPEND_USER
);
1296 pa_log_debug("Resuming sink %s, because the bluetooth audio state changed to 'playing'.", u
->sink
->name
);
1297 pa_sink_suspend(u
->sink
, FALSE
, PA_SUSPEND_IDLE
|PA_SUSPEND_USER
);
1301 if (release
&& u
->transport_acquired
) {
1302 /* FIXME: this release is racy, since the audio stream might have
1303 been set up again in the meantime (but not processed yet by PA).
1304 BlueZ should probably release the transport automatically, and
1305 in that case we would just mark the transport as released */
1307 /* Remote side closed the stream so we consider it PA_SUSPEND_USER */
1309 pa_log_debug("Suspending source %s, because the remote end closed the stream.", u
->source
->name
);
1310 pa_source_suspend(u
->source
, TRUE
, PA_SUSPEND_USER
);
1314 pa_log_debug("Suspending sink %s, because the remote end closed the stream.", u
->sink
->name
);
1315 pa_sink_suspend(u
->sink
, TRUE
, PA_SUSPEND_USER
);
1320 /* Run from main thread */
1321 static void sink_set_volume_cb(pa_sink
*s
) {
1330 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1331 u
= pa_shared_get(s
->core
, k
);
1335 pa_assert(u
->sink
== s
);
1336 pa_assert(u
->profile
== PROFILE_HSP
);
1337 pa_assert(u
->transport
);
1339 gain
= (dbus_uint16_t
) round((double) pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
/ PA_VOLUME_NORM
);
1340 volume
= (pa_volume_t
) round((double) gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1342 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1344 pa_bluetooth_transport_set_speaker_gain(u
->transport
, gain
);
1347 /* Run from main thread */
1348 static void source_set_volume_cb(pa_source
*s
) {
1357 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1358 u
= pa_shared_get(s
->core
, k
);
1362 pa_assert(u
->source
== s
);
1363 pa_assert(u
->profile
== PROFILE_HSP
);
1364 pa_assert(u
->transport
);
1366 gain
= (dbus_uint16_t
) round((double) pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
/ PA_VOLUME_NORM
);
1367 volume
= (pa_volume_t
) round((double) gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1369 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1371 pa_bluetooth_transport_set_microphone_gain(u
->transport
, gain
);
1374 /* Run from main thread */
1375 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, pa_bool_t
*namereg_fail
) {
1381 pa_assert(device_id
);
1382 pa_assert(namereg_fail
);
1384 t
= pa_sprintf_malloc("%s_name", type
);
1385 n
= pa_modargs_get_value(ma
, t
, NULL
);
1389 *namereg_fail
= TRUE
;
1390 return pa_xstrdup(n
);
1393 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1394 *namereg_fail
= TRUE
;
1397 *namereg_fail
= FALSE
;
1400 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1403 static int sco_over_pcm_state_update(struct userdata
*u
, pa_bool_t changed
) {
1405 pa_assert(USE_SCO_OVER_PCM(u
));
1407 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1408 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1410 if (u
->stream_fd
>= 0)
1413 pa_log_debug("Resuming SCO over PCM");
1414 if (init_profile(u
) < 0) {
1415 pa_log("Can't resume SCO over PCM");
1419 if (bt_transport_acquire(u
, false) < 0)
1428 if (u
->stream_fd
< 0)
1431 pa_log_debug("Closing SCO over PCM");
1433 bt_transport_release(u
);
1439 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
1441 pa_sink_assert_ref(s
);
1444 if (!USE_SCO_OVER_PCM(u
) || s
!= u
->hsp
.sco_sink
)
1447 sco_over_pcm_state_update(u
, TRUE
);
1452 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
1454 pa_source_assert_ref(s
);
1457 if (!USE_SCO_OVER_PCM(u
) || s
!= u
->hsp
.sco_source
)
1460 sco_over_pcm_state_update(u
, TRUE
);
1465 static pa_hook_result_t
transport_nrec_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
, struct userdata
*u
) {
1471 if (t
!= u
->transport
)
1474 p
= pa_proplist_new();
1475 pa_proplist_sets(p
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1476 pa_source_update_proplist(u
->source
, PA_UPDATE_REPLACE
, p
);
1477 pa_proplist_free(p
);
1482 static pa_hook_result_t
transport_microphone_gain_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
,
1483 struct userdata
*u
) {
1489 if (t
!= u
->transport
)
1492 pa_assert(u
->source
);
1494 pa_cvolume_set(&v
, u
->sample_spec
.channels
,
1495 (pa_volume_t
) round((double) t
->microphone_gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
));
1496 pa_source_volume_changed(u
->source
, &v
);
1501 static pa_hook_result_t
transport_speaker_gain_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
,
1502 struct userdata
*u
) {
1508 if (t
!= u
->transport
)
1513 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) round((double) t
->speaker_gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
));
1514 pa_sink_volume_changed(u
->sink
, &v
);
1519 static void connect_ports(struct userdata
*u
, void *sink_or_source_new_data
, pa_direction_t direction
) {
1521 pa_sink_new_data
*sink_new_data
;
1522 pa_source_new_data
*source_new_data
;
1524 pa_device_port
*port
;
1526 if (direction
== PA_DIRECTION_OUTPUT
)
1527 data
.sink_new_data
= sink_or_source_new_data
;
1529 data
.source_new_data
= sink_or_source_new_data
;
1531 switch (u
->profile
) {
1533 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1534 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1535 pa_device_port_ref(port
);
1538 case PROFILE_A2DP_SOURCE
:
1539 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
1540 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1541 pa_device_port_ref(port
);
1545 if (direction
== PA_DIRECTION_OUTPUT
) {
1546 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "bluetooth-output"));
1547 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1549 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
1550 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1552 pa_device_port_ref(port
);
1556 if (direction
== PA_DIRECTION_OUTPUT
) {
1557 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
1558 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1560 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
1561 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1563 pa_device_port_ref(port
);
1567 pa_assert_not_reached();
1571 static int sink_set_port_cb(pa_sink
*s
, pa_device_port
*p
) {
1575 static int source_set_port_cb(pa_source
*s
, pa_device_port
*p
) {
1579 /* Run from main thread */
1580 static int add_sink(struct userdata
*u
) {
1583 pa_assert(u
->transport
);
1585 if (USE_SCO_OVER_PCM(u
)) {
1588 u
->sink
= u
->hsp
.sco_sink
;
1589 p
= pa_proplist_new();
1590 pa_proplist_sets(p
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1591 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
1592 pa_proplist_free(p
);
1594 pa_sink_new_data data
;
1597 pa_sink_new_data_init(&data
);
1598 data
.driver
= __FILE__
;
1599 data
.module
= u
->module
;
1600 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1601 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1602 if (u
->profile
== PROFILE_HSP
)
1603 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1604 data
.card
= u
->card
;
1605 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
1606 data
.namereg_fail
= b
;
1608 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1609 pa_log("Invalid properties");
1610 pa_sink_new_data_done(&data
);
1613 connect_ports(u
, &data
, PA_DIRECTION_OUTPUT
);
1615 if (!u
->transport_acquired
)
1616 switch (u
->profile
) {
1619 pa_assert_not_reached(); /* Profile switch should have failed */
1622 data
.suspend_cause
= PA_SUSPEND_USER
;
1624 case PROFILE_A2DP_SOURCE
:
1626 pa_assert_not_reached();
1629 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
);
1630 pa_sink_new_data_done(&data
);
1633 pa_log_error("Failed to create sink");
1637 u
->sink
->userdata
= u
;
1638 u
->sink
->parent
.process_msg
= sink_process_msg
;
1639 u
->sink
->set_port
= sink_set_port_cb
;
1642 if (u
->profile
== PROFILE_HSP
) {
1643 pa_sink_set_set_volume_callback(u
->sink
, sink_set_volume_cb
);
1644 u
->sink
->n_volume_steps
= 16;
1646 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1647 pa_shared_set(u
->core
, k
, u
);
1654 /* Run from main thread */
1655 static int add_source(struct userdata
*u
) {
1658 pa_assert(u
->transport
);
1660 if (USE_SCO_OVER_PCM(u
)) {
1661 u
->source
= u
->hsp
.sco_source
;
1662 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1664 pa_source_new_data data
;
1667 pa_source_new_data_init(&data
);
1668 data
.driver
= __FILE__
;
1669 data
.module
= u
->module
;
1670 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1671 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", pa_bt_profile_to_string(u
->profile
));
1672 if (u
->profile
== PROFILE_HSP
)
1673 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1675 data
.card
= u
->card
;
1676 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
1677 data
.namereg_fail
= b
;
1679 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1680 pa_log("Invalid properties");
1681 pa_source_new_data_done(&data
);
1685 connect_ports(u
, &data
, PA_DIRECTION_INPUT
);
1687 if (!u
->transport_acquired
)
1688 switch (u
->profile
) {
1690 pa_assert_not_reached(); /* Profile switch should have failed */
1692 case PROFILE_A2DP_SOURCE
:
1694 data
.suspend_cause
= PA_SUSPEND_USER
;
1698 pa_assert_not_reached();
1701 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
);
1702 pa_source_new_data_done(&data
);
1705 pa_log_error("Failed to create source");
1709 u
->source
->userdata
= u
;
1710 u
->source
->parent
.process_msg
= source_process_msg
;
1711 u
->source
->set_port
= source_set_port_cb
;
1714 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
)) {
1715 pa_bluetooth_transport
*t
= u
->transport
;
1716 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1719 if (u
->profile
== PROFILE_HSP
) {
1720 pa_source_set_set_volume_callback(u
->source
, source_set_volume_cb
);
1721 u
->source
->n_volume_steps
= 16;
1723 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1724 pa_shared_set(u
->core
, k
, u
);
1731 static void bt_transport_config_a2dp(struct userdata
*u
) {
1732 const pa_bluetooth_transport
*t
;
1733 struct a2dp_info
*a2dp
= &u
->a2dp
;
1739 config
= (a2dp_sbc_t
*) t
->config
;
1741 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1743 if (a2dp
->sbc_initialized
)
1744 sbc_reinit(&a2dp
->sbc
, 0);
1746 sbc_init(&a2dp
->sbc
, 0);
1747 a2dp
->sbc_initialized
= TRUE
;
1749 switch (config
->frequency
) {
1750 case SBC_SAMPLING_FREQ_16000
:
1751 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
1752 u
->sample_spec
.rate
= 16000U;
1754 case SBC_SAMPLING_FREQ_32000
:
1755 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
1756 u
->sample_spec
.rate
= 32000U;
1758 case SBC_SAMPLING_FREQ_44100
:
1759 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
1760 u
->sample_spec
.rate
= 44100U;
1762 case SBC_SAMPLING_FREQ_48000
:
1763 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
1764 u
->sample_spec
.rate
= 48000U;
1767 pa_assert_not_reached();
1770 switch (config
->channel_mode
) {
1771 case SBC_CHANNEL_MODE_MONO
:
1772 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
1773 u
->sample_spec
.channels
= 1;
1775 case SBC_CHANNEL_MODE_DUAL_CHANNEL
:
1776 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
1777 u
->sample_spec
.channels
= 2;
1779 case SBC_CHANNEL_MODE_STEREO
:
1780 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
1781 u
->sample_spec
.channels
= 2;
1783 case SBC_CHANNEL_MODE_JOINT_STEREO
:
1784 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
1785 u
->sample_spec
.channels
= 2;
1788 pa_assert_not_reached();
1791 switch (config
->allocation_method
) {
1792 case SBC_ALLOCATION_SNR
:
1793 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
1795 case SBC_ALLOCATION_LOUDNESS
:
1796 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
1799 pa_assert_not_reached();
1802 switch (config
->subbands
) {
1803 case SBC_SUBBANDS_4
:
1804 a2dp
->sbc
.subbands
= SBC_SB_4
;
1806 case SBC_SUBBANDS_8
:
1807 a2dp
->sbc
.subbands
= SBC_SB_8
;
1810 pa_assert_not_reached();
1813 switch (config
->block_length
) {
1814 case SBC_BLOCK_LENGTH_4
:
1815 a2dp
->sbc
.blocks
= SBC_BLK_4
;
1817 case SBC_BLOCK_LENGTH_8
:
1818 a2dp
->sbc
.blocks
= SBC_BLK_8
;
1820 case SBC_BLOCK_LENGTH_12
:
1821 a2dp
->sbc
.blocks
= SBC_BLK_12
;
1823 case SBC_BLOCK_LENGTH_16
:
1824 a2dp
->sbc
.blocks
= SBC_BLK_16
;
1827 pa_assert_not_reached();
1830 a2dp
->min_bitpool
= config
->min_bitpool
;
1831 a2dp
->max_bitpool
= config
->max_bitpool
;
1833 /* Set minimum bitpool for source to get the maximum possible block_size */
1834 a2dp
->sbc
.bitpool
= u
->profile
== PROFILE_A2DP
? a2dp
->max_bitpool
: a2dp
->min_bitpool
;
1835 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
1836 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
1838 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
1839 a2dp
->sbc
.allocation
, a2dp
->sbc
.subbands
, a2dp
->sbc
.blocks
, a2dp
->sbc
.bitpool
);
1842 static void bt_transport_config(struct userdata
*u
) {
1843 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
1844 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1845 u
->sample_spec
.channels
= 1;
1846 u
->sample_spec
.rate
= 8000;
1848 bt_transport_config_a2dp(u
);
1851 /* Run from main thread */
1852 static pa_hook_result_t
transport_state_changed_cb(pa_bluetooth_discovery
*y
, pa_bluetooth_transport
*t
, struct userdata
*u
) {
1856 if (t
== u
->transport
&& t
->state
== PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
)
1857 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
1859 if (t
->device
== u
->device
)
1860 handle_transport_state_change(u
, t
);
1865 /* Run from main thread */
1866 static int setup_transport(struct userdata
*u
) {
1867 pa_bluetooth_transport
*t
;
1870 pa_assert(!u
->transport
);
1871 pa_assert(u
->profile
!= PROFILE_OFF
);
1873 /* check if profile has a transport */
1874 t
= u
->device
->transports
[u
->profile
];
1876 pa_log_warn("Profile has no transport");
1882 if (u
->profile
== PROFILE_A2DP_SOURCE
|| u
->profile
== PROFILE_HFGW
)
1883 bt_transport_acquire(u
, true); /* In case of error, the sink/sources will be created suspended */
1884 else if (bt_transport_acquire(u
, false) < 0)
1885 return -1; /* We need to fail here until the interactions with module-suspend-on-idle and alike get improved */
1887 bt_transport_config(u
);
1892 /* Run from main thread */
1893 static int init_profile(struct userdata
*u
) {
1896 pa_assert(u
->profile
!= PROFILE_OFF
);
1898 if (setup_transport(u
) < 0)
1901 pa_assert(u
->transport
);
1903 if (u
->profile
== PROFILE_A2DP
||
1904 u
->profile
== PROFILE_HSP
||
1905 u
->profile
== PROFILE_HFGW
)
1906 if (add_sink(u
) < 0)
1909 if (u
->profile
== PROFILE_HSP
||
1910 u
->profile
== PROFILE_A2DP_SOURCE
||
1911 u
->profile
== PROFILE_HFGW
)
1912 if (add_source(u
) < 0)
1918 /* Run from main thread */
1919 static void stop_thread(struct userdata
*u
) {
1924 if (u
->sink
&& !USE_SCO_OVER_PCM(u
))
1925 pa_sink_unlink(u
->sink
);
1927 if (u
->source
&& !USE_SCO_OVER_PCM(u
))
1928 pa_source_unlink(u
->source
);
1931 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
1932 pa_thread_free(u
->thread
);
1936 if (u
->rtpoll_item
) {
1937 pa_rtpoll_item_free(u
->rtpoll_item
);
1938 u
->rtpoll_item
= NULL
;
1942 bt_transport_release(u
);
1943 u
->transport
= NULL
;
1947 if (u
->profile
== PROFILE_HSP
) {
1948 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1949 pa_shared_remove(u
->core
, k
);
1953 pa_sink_unref(u
->sink
);
1958 if (u
->profile
== PROFILE_HSP
) {
1959 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1960 pa_shared_remove(u
->core
, k
);
1964 pa_source_unref(u
->source
);
1969 pa_thread_mq_done(&u
->thread_mq
);
1971 pa_rtpoll_free(u
->rtpoll
);
1975 if (u
->read_smoother
) {
1976 pa_smoother_free(u
->read_smoother
);
1977 u
->read_smoother
= NULL
;
1981 /* Run from main thread */
1982 static int start_thread(struct userdata
*u
) {
1984 pa_assert(!u
->thread
);
1985 pa_assert(!u
->rtpoll
);
1986 pa_assert(!u
->rtpoll_item
);
1988 u
->rtpoll
= pa_rtpoll_new();
1989 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
1991 if (USE_SCO_OVER_PCM(u
)) {
1992 if (sco_over_pcm_state_update(u
, FALSE
) < 0) {
1996 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1997 pa_shared_remove(u
->core
, k
);
2002 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
2003 pa_shared_remove(u
->core
, k
);
2010 pa_sink_ref(u
->sink
);
2011 pa_source_ref(u
->source
);
2012 /* FIXME: monitor stream_fd error */
2016 if (!(u
->thread
= pa_thread_new("bluetooth", thread_func
, u
))) {
2017 pa_log_error("Failed to create IO thread");
2022 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
2023 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
2024 pa_sink_put(u
->sink
);
2026 if (u
->sink
->set_volume
)
2027 u
->sink
->set_volume(u
->sink
);
2031 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
2032 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
2033 pa_source_put(u
->source
);
2035 if (u
->source
->set_volume
)
2036 u
->source
->set_volume(u
->source
);
2042 static void save_sco_volume_callbacks(struct userdata
*u
) {
2044 pa_assert(USE_SCO_OVER_PCM(u
));
2046 u
->hsp
.sco_sink_set_volume
= u
->hsp
.sco_sink
->set_volume
;
2047 u
->hsp
.sco_source_set_volume
= u
->hsp
.sco_source
->set_volume
;
2050 static void restore_sco_volume_callbacks(struct userdata
*u
) {
2052 pa_assert(USE_SCO_OVER_PCM(u
));
2054 pa_sink_set_set_volume_callback(u
->hsp
.sco_sink
, u
->hsp
.sco_sink_set_volume
);
2055 pa_source_set_set_volume_callback(u
->hsp
.sco_source
, u
->hsp
.sco_source_set_volume
);
2058 /* Run from main thread */
2059 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
2064 pa_assert(new_profile
);
2065 pa_assert_se(u
= c
->userdata
);
2067 d
= PA_CARD_PROFILE_DATA(new_profile
);
2069 if (*d
!= PROFILE_OFF
) {
2070 const pa_bluetooth_device
*device
= u
->device
;
2072 if (!device
->transports
[*d
]) {
2073 pa_log_warn("Profile not connected, refused to switch profile to %s", new_profile
->name
);
2080 if (USE_SCO_OVER_PCM(u
))
2081 restore_sco_volume_callbacks(u
);
2084 u
->sample_spec
= u
->requested_sample_spec
;
2086 if (USE_SCO_OVER_PCM(u
))
2087 save_sco_volume_callbacks(u
);
2089 if (u
->profile
!= PROFILE_OFF
)
2090 if (init_profile(u
) < 0)
2093 if (u
->sink
|| u
->source
)
2094 if (start_thread(u
) < 0)
2102 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
2107 static void create_ports_for_profile(struct userdata
*u
, pa_hashmap
*ports
, pa_card_profile
*profile
) {
2108 pa_bluetooth_device
*device
= u
->device
;
2109 pa_device_port
*port
;
2111 pa_bluetooth_transport
*transport
;
2112 pa_bluetooth_transport_state_t transport_state
;
2114 d
= PA_CARD_PROFILE_DATA(profile
);
2116 pa_assert(*d
!= PROFILE_OFF
);
2118 transport
= device
->transports
[*d
];
2119 transport_state
= transport
? transport
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2123 if ((port
= pa_hashmap_get(ports
, "bluetooth-output")) != NULL
) {
2124 pa_bluetooth_transport
*other
= device
->transports
[PROFILE_HSP
];
2125 pa_bluetooth_transport_state_t other_state
= other
? other
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2127 port
->priority
= PA_MAX(port
->priority
, profile
->priority
* 100);
2128 port
->available
= transport_state_to_availability_merged(transport_state
, other_state
);
2129 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2131 pa_assert_se(port
= pa_device_port_new(u
->core
, "bluetooth-output", _("Bluetooth Output"), 0));
2132 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2133 port
->is_output
= 1;
2135 port
->priority
= profile
->priority
* 100;
2136 port
->available
= transport_state_to_availability(transport_state
);
2137 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2142 case PROFILE_A2DP_SOURCE
:
2143 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2144 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2145 port
->is_output
= 0;
2147 port
->priority
= profile
->priority
* 100;
2148 port
->available
= transport_state_to_availability(transport_state
);
2149 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2153 if ((port
= pa_hashmap_get(ports
, "bluetooth-output")) != NULL
) {
2154 pa_bluetooth_transport
*other
= device
->transports
[PROFILE_A2DP
];
2155 pa_bluetooth_transport_state_t other_state
= other
? other
->state
: PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED
;
2157 port
->priority
= PA_MAX(port
->priority
, profile
->priority
* 100);
2158 port
->available
= transport_state_to_availability_merged(transport_state
, other_state
);
2159 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2161 pa_assert_se(port
= pa_device_port_new(u
->core
, "bluetooth-output", _("Bluetooth Output"), 0));
2162 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2163 port
->is_output
= 1;
2165 port
->priority
= profile
->priority
* 100;
2166 port
->available
= transport_state_to_availability(transport_state
);
2167 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2170 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2171 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2172 port
->is_output
= 0;
2174 port
->priority
= profile
->priority
* 100;
2175 port
->available
= transport_state_to_availability(transport_state
);
2176 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2180 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2181 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2182 port
->is_output
= 1;
2184 port
->priority
= profile
->priority
* 100;
2185 port
->available
= transport_state_to_availability(transport_state
);
2186 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2188 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2189 pa_assert_se(pa_hashmap_put(ports
, port
->name
, port
) >= 0);
2190 port
->is_output
= 0;
2192 port
->priority
= profile
->priority
* 100;
2193 port
->available
= transport_state_to_availability(transport_state
);
2194 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2198 pa_assert_not_reached();
2203 /* Run from main thread */
2204 static pa_card_profile
*create_card_profile(struct userdata
*u
, const char *uuid
) {
2205 pa_card_profile
*p
= NULL
;
2208 if (pa_streq(uuid
, A2DP_SINK_UUID
)) {
2209 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2213 p
->max_sink_channels
= 2;
2214 p
->max_source_channels
= 0;
2216 d
= PA_CARD_PROFILE_DATA(p
);
2218 } else if (pa_streq(uuid
, A2DP_SOURCE_UUID
)) {
2219 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2223 p
->max_sink_channels
= 0;
2224 p
->max_source_channels
= 2;
2226 d
= PA_CARD_PROFILE_DATA(p
);
2227 *d
= PROFILE_A2DP_SOURCE
;
2228 } else if (pa_streq(uuid
, HSP_HS_UUID
) || pa_streq(uuid
, HFP_HS_UUID
)) {
2229 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2233 p
->max_sink_channels
= 1;
2234 p
->max_source_channels
= 1;
2236 d
= PA_CARD_PROFILE_DATA(p
);
2238 } else if (pa_streq(uuid
, HFP_AG_UUID
)) {
2239 p
= pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile
));
2243 p
->max_sink_channels
= 1;
2244 p
->max_source_channels
= 1;
2246 d
= PA_CARD_PROFILE_DATA(p
);
2253 /* Run from main thread */
2254 static int add_card(struct userdata
*u
) {
2255 pa_card_new_data data
;
2261 const char *default_profile
;
2262 const pa_bluetooth_device
*device
= u
->device
;
2263 const pa_bluetooth_uuid
*uuid
;
2268 pa_card_new_data_init(&data
);
2269 data
.driver
= __FILE__
;
2270 data
.module
= u
->module
;
2272 n
= pa_bluetooth_cleanup_name(device
->name
);
2273 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2275 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2276 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2277 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2278 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2279 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2280 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2281 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2282 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2283 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2284 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2285 data
.namereg_fail
= b
;
2287 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2288 pa_log("Invalid properties");
2289 pa_card_new_data_done(&data
);
2293 PA_LLIST_FOREACH(uuid
, device
->uuids
) {
2294 p
= create_card_profile(u
, uuid
->uuid
);
2299 if (pa_hashmap_get(data
.profiles
, p
->name
)) {
2300 pa_card_profile_free(p
);
2304 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2305 create_ports_for_profile(u
, data
.ports
, p
);
2308 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2310 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2311 d
= PA_CARD_PROFILE_DATA(p
);
2313 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2315 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2316 if (pa_hashmap_get(data
.profiles
, default_profile
))
2317 pa_card_new_data_set_profile(&data
, default_profile
);
2319 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2322 u
->card
= pa_card_new(u
->core
, &data
);
2323 pa_card_new_data_done(&data
);
2326 pa_log("Failed to allocate card.");
2330 u
->card
->userdata
= u
;
2331 u
->card
->set_profile
= card_set_profile
;
2333 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2335 if (*d
!= PROFILE_OFF
&& !device
->transports
[*d
]) {
2336 pa_log_warn("Default profile not connected, selecting off profile");
2337 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2338 u
->card
->save_profile
= FALSE
;
2341 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2344 if (USE_SCO_OVER_PCM(u
))
2345 save_sco_volume_callbacks(u
);
2350 /* Run from main thread */
2351 static pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2352 pa_bluetooth_device
*d
= NULL
;
2356 if (!address
&& !path
) {
2357 pa_log_error("Failed to get device address/path from module arguments.");
2362 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2363 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2367 if (address
&& !(pa_streq(d
->address
, address
))) {
2368 pa_log_error("Passed path %s address %s != %s don't match.", path
, d
->address
, address
);
2373 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2374 pa_log_error("%s is not known.", address
);
2380 u
->address
= pa_xstrdup(d
->address
);
2381 u
->path
= pa_xstrdup(d
->path
);
2387 /* Run from main thread */
2388 static pa_hook_result_t
uuid_added_cb(pa_bluetooth_discovery
*y
, const struct pa_bluetooth_hook_uuid_data
*data
,
2389 struct userdata
*u
) {
2391 pa_hashmap
*new_ports
;
2394 pa_assert(data
->device
);
2395 pa_assert(data
->uuid
);
2398 if (data
->device
!= u
->device
)
2401 p
= create_card_profile(u
, data
->uuid
);
2406 if (pa_hashmap_get(u
->card
->profiles
, p
->name
)) {
2407 pa_card_profile_free(p
);
2411 pa_card_add_profile(u
->card
, p
);
2413 new_ports
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
2415 create_ports_for_profile(u
, new_ports
, p
);
2417 pa_card_add_ports(u
->card
, new_ports
);
2419 pa_device_port_hashmap_free(new_ports
);
2424 /* Run from main thread */
2425 static pa_hook_result_t
discovery_hook_cb(pa_bluetooth_discovery
*y
, const pa_bluetooth_device
*d
, struct userdata
*u
) {
2433 pa_log_debug("Device %s removed: unloading module", d
->path
);
2434 else if (!pa_bluetooth_device_any_audio_connected(d
))
2435 pa_log_debug("Unloading module, because device %s doesn't have any audio profiles connected anymore.", d
->path
);
2439 pa_module_unload(u
->core
, u
->module
, true);
2444 int pa__init(pa_module
* m
) {
2448 const char *address
, *path
;
2449 pa_bluetooth_device
*device
;
2453 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
2454 pa_log_error("Failed to parse module arguments");
2458 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
2462 u
->sample_spec
= m
->core
->default_sample_spec
;
2465 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
2466 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
2467 pa_log("SCO sink not found");
2471 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
2472 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
2473 pa_log("SCO source not found");
2477 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
2478 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
2479 pa_log_error("Failed to get rate from module arguments");
2483 u
->auto_connect
= TRUE
;
2484 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
2485 pa_log("Failed to parse auto_connect= argument");
2489 channels
= u
->sample_spec
.channels
;
2490 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
2491 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
2492 pa_log_error("Failed to get channels from module arguments");
2495 u
->sample_spec
.channels
= (uint8_t) channels
;
2496 u
->requested_sample_spec
= u
->sample_spec
;
2498 address
= pa_modargs_get_value(ma
, "address", NULL
);
2499 path
= pa_modargs_get_value(ma
, "path", NULL
);
2501 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
2504 if (!(device
= find_device(u
, address
, path
)))
2510 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED
),
2511 PA_HOOK_NORMAL
, (pa_hook_cb_t
) discovery_hook_cb
, u
);
2513 u
->uuid_added_slot
=
2514 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_DEVICE_UUID_ADDED
),
2515 PA_HOOK_NORMAL
, (pa_hook_cb_t
) uuid_added_cb
, u
);
2517 u
->sink_state_changed_slot
=
2518 pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SINK_STATE_CHANGED
],
2519 PA_HOOK_NORMAL
, (pa_hook_cb_t
) sink_state_changed_cb
, u
);
2521 u
->source_state_changed_slot
=
2522 pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SOURCE_STATE_CHANGED
],
2523 PA_HOOK_NORMAL
, (pa_hook_cb_t
) source_state_changed_cb
, u
);
2525 u
->transport_state_changed_slot
=
2526 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED
),
2527 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_state_changed_cb
, u
);
2529 u
->transport_nrec_changed_slot
=
2530 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_NREC_CHANGED
),
2531 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_nrec_changed_cb
, u
);
2533 u
->transport_microphone_changed_slot
=
2534 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED
),
2535 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_microphone_gain_changed_cb
, u
);
2537 u
->transport_speaker_changed_slot
=
2538 pa_hook_connect(pa_bluetooth_discovery_hook(u
->discovery
, PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED
),
2539 PA_HOOK_NORMAL
, (pa_hook_cb_t
) transport_speaker_gain_changed_cb
, u
);
2541 /* Add the card structure. This will also initialize the default profile */
2542 if (add_card(u
) < 0)
2545 if (!(u
->msg
= pa_msgobject_new(bluetooth_msg
)))
2548 u
->msg
->parent
.process_msg
= device_process_msg
;
2549 u
->msg
->card
= u
->card
;
2551 if (u
->profile
!= PROFILE_OFF
)
2552 if (init_profile(u
) < 0)
2555 if (u
->sink
|| u
->source
)
2556 if (start_thread(u
) < 0)
2564 pa_assert_se(pa_card_set_profile(u
->card
, "off", false) >= 0);
2575 int pa__get_n_used(pa_module
*m
) {
2579 pa_assert_se(u
= m
->userdata
);
2582 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
2583 (u
->source
? pa_source_linked_by(u
->source
) : 0);
2586 void pa__done(pa_module
*m
) {
2591 if (!(u
= m
->userdata
))
2596 if (u
->discovery_slot
)
2597 pa_hook_slot_free(u
->discovery_slot
);
2599 if (u
->uuid_added_slot
)
2600 pa_hook_slot_free(u
->uuid_added_slot
);
2602 if (u
->sink_state_changed_slot
)
2603 pa_hook_slot_free(u
->sink_state_changed_slot
);
2605 if (u
->source_state_changed_slot
)
2606 pa_hook_slot_free(u
->source_state_changed_slot
);
2608 if (u
->transport_state_changed_slot
)
2609 pa_hook_slot_free(u
->transport_state_changed_slot
);
2611 if (u
->transport_nrec_changed_slot
)
2612 pa_hook_slot_free(u
->transport_nrec_changed_slot
);
2614 if (u
->transport_microphone_changed_slot
)
2615 pa_hook_slot_free(u
->transport_microphone_changed_slot
);
2617 if (u
->transport_speaker_changed_slot
)
2618 pa_hook_slot_free(u
->transport_speaker_changed_slot
);
2620 if (USE_SCO_OVER_PCM(u
))
2621 restore_sco_volume_callbacks(u
);
2627 pa_card_free(u
->card
);
2630 pa_xfree(u
->a2dp
.buffer
);
2632 sbc_finish(&u
->a2dp
.sbc
);
2635 pa_modargs_free(u
->modargs
);
2637 pa_xfree(u
->address
);
2641 pa_bluetooth_discovery_unref(u
->discovery
);