2 This file is part of PulseAudio.
4 Copyright 2008-2009 Joao Paulo Rechi Vita
5 Copyright 2011-2012 BMW Car IT GmbH.
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29 #include <linux/sockios.h>
30 #include <arpa/inet.h>
32 #include <pulse/rtclock.h>
33 #include <pulse/sample.h>
34 #include <pulse/timeval.h>
35 #include <pulse/xmalloc.h>
37 #include <pulsecore/i18n.h>
38 #include <pulsecore/module.h>
39 #include <pulsecore/modargs.h>
40 #include <pulsecore/core-rtclock.h>
41 #include <pulsecore/core-util.h>
42 #include <pulsecore/core-error.h>
43 #include <pulsecore/shared.h>
44 #include <pulsecore/socket-util.h>
45 #include <pulsecore/thread.h>
46 #include <pulsecore/thread-mq.h>
47 #include <pulsecore/poll.h>
48 #include <pulsecore/rtpoll.h>
49 #include <pulsecore/time-smoother.h>
50 #include <pulsecore/namereg.h>
51 #include <pulsecore/dbus-shared.h>
53 #include "module-bluetooth-device-symdef.h"
56 #include "a2dp-codecs.h"
58 #include "bluetooth-util.h"
60 #define BITPOOL_DEC_LIMIT 32
61 #define BITPOOL_DEC_STEP 5
62 #define HSP_MAX_GAIN 15
64 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
65 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
66 PA_MODULE_VERSION(PACKAGE_VERSION
);
67 PA_MODULE_LOAD_ONCE(FALSE
);
69 "name=<name for the card/sink/source, to be prefixed> "
70 "card_name=<name for the card> "
71 "card_properties=<properties for the card> "
72 "sink_name=<name for the sink> "
73 "sink_properties=<properties for the sink> "
74 "source_name=<name for the source> "
75 "source_properties=<properties for the source> "
76 "address=<address of the device> "
77 "profile=<a2dp|hsp|hfgw> "
79 "channels=<number of channels> "
80 "path=<device object path> "
81 "auto_connect=<automatically connect?> "
82 "sco_sink=<SCO over PCM sink name> "
83 "sco_source=<SCO over PCM source name>");
85 /* TODO: not close fd when entering suspend mode in a2dp */
87 static const char* const valid_modargs
[] = {
107 sbc_capabilities_t sbc_capabilities
;
108 sbc_t sbc
; /* Codec data */
109 pa_bool_t sbc_initialized
; /* Keep track if the encoder is initialized */
110 size_t codesize
, frame_length
; /* SBC Codesize, frame_length. We simply cache those values here */
112 void* buffer
; /* Codec transfer buffer */
113 size_t buffer_size
; /* Size of the buffer */
115 uint16_t seq_num
; /* Cumulative packet sequence */
121 pcm_capabilities_t pcm_capabilities
;
123 void (*sco_sink_set_volume
)(pa_sink
*s
);
124 pa_source
*sco_source
;
125 void (*sco_source_set_volume
)(pa_source
*s
);
126 pa_hook_slot
*sink_state_changed_slot
;
127 pa_hook_slot
*source_state_changed_slot
;
128 pa_hook_slot
*nrec_changed_slot
;
131 struct bluetooth_msg
{
136 typedef struct bluetooth_msg bluetooth_msg
;
137 PA_DEFINE_PRIVATE_CLASS(bluetooth_msg
, pa_msgobject
);
138 #define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o))
149 pa_bluetooth_discovery
*discovery
;
150 pa_bool_t auto_connect
;
152 pa_dbus_connection
*connection
;
158 pa_thread_mq thread_mq
;
160 pa_rtpoll_item
*rtpoll_item
;
164 uint64_t read_index
, write_index
;
165 pa_usec_t started_at
;
166 pa_smoother
*read_smoother
;
168 pa_memchunk write_memchunk
;
170 pa_sample_spec sample_spec
, requested_sample_spec
;
174 size_t read_link_mtu
;
175 size_t read_block_size
;
177 size_t write_link_mtu
;
178 size_t write_block_size
;
180 struct a2dp_info a2dp
;
183 enum profile profile
;
187 int stream_write_type
;
189 pa_bool_t filter_added
;
193 BLUETOOTH_MESSAGE_IO_THREAD_FAILED
,
194 BLUETOOTH_MESSAGE_MAX
197 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
198 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
199 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
200 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
202 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
204 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
206 static int init_profile(struct userdata
*u
);
209 static void a2dp_set_bitpool(struct userdata
*u
, uint8_t bitpool
)
211 struct a2dp_info
*a2dp
;
217 if (a2dp
->sbc
.bitpool
== bitpool
)
220 if (bitpool
> a2dp
->max_bitpool
)
221 bitpool
= a2dp
->max_bitpool
;
222 else if (bitpool
< a2dp
->min_bitpool
)
223 bitpool
= a2dp
->min_bitpool
;
225 a2dp
->sbc
.bitpool
= bitpool
;
227 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
228 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
230 pa_log_debug("Bitpool has changed to %u", a2dp
->sbc
.bitpool
);
233 (u
->read_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
234 / a2dp
->frame_length
* a2dp
->codesize
;
236 u
->write_block_size
=
237 (u
->write_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
238 / a2dp
->frame_length
* a2dp
->codesize
;
240 pa_sink_set_max_request_within_thread(u
->sink
, u
->write_block_size
);
241 pa_sink_set_fixed_latency_within_thread(u
->sink
,
242 FIXED_LATENCY_PLAYBACK_A2DP
+ pa_bytes_to_usec(u
->write_block_size
, &u
->sample_spec
));
245 /* from IO thread, except in SCO over PCM */
247 static int setup_stream(struct userdata
*u
) {
248 struct pollfd
*pollfd
;
251 pa_make_fd_nonblock(u
->stream_fd
);
252 pa_make_socket_low_delay(u
->stream_fd
);
255 if (setsockopt(u
->stream_fd
, SOL_SOCKET
, SO_TIMESTAMP
, &one
, sizeof(one
)) < 0)
256 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno
));
258 pa_log_debug("Stream properly set up, we're ready to roll!");
260 if (u
->profile
== PROFILE_A2DP
)
261 a2dp_set_bitpool(u
, u
->a2dp
.max_bitpool
);
263 u
->rtpoll_item
= pa_rtpoll_item_new(u
->rtpoll
, PA_RTPOLL_NEVER
, 1);
264 pollfd
= pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
);
265 pollfd
->fd
= u
->stream_fd
;
266 pollfd
->events
= pollfd
->revents
= 0;
268 u
->read_index
= u
->write_index
= 0;
272 u
->read_smoother
= pa_smoother_new(
284 static void bt_transport_release(struct userdata
*u
) {
285 const char *accesstype
= "rw";
286 const pa_bluetooth_transport
*t
;
288 /* Ignore if already released */
292 pa_log_debug("Releasing transport %s", u
->transport
);
294 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
296 pa_bluetooth_transport_release(t
, accesstype
);
298 pa_xfree(u
->accesstype
);
299 u
->accesstype
= NULL
;
301 if (u
->rtpoll_item
) {
302 pa_rtpoll_item_free(u
->rtpoll_item
);
303 u
->rtpoll_item
= NULL
;
306 if (u
->stream_fd
>= 0) {
307 pa_close(u
->stream_fd
);
311 if (u
->read_smoother
) {
312 pa_smoother_free(u
->read_smoother
);
313 u
->read_smoother
= NULL
;
317 static int bt_transport_acquire(struct userdata
*u
, pa_bool_t start
) {
318 const char *accesstype
= "rw";
319 const pa_bluetooth_transport
*t
;
327 pa_log_debug("Acquiring transport %s", u
->transport
);
329 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
331 pa_log("Transport %s no longer available", u
->transport
);
332 pa_xfree(u
->transport
);
337 u
->stream_fd
= pa_bluetooth_transport_acquire(t
, accesstype
, &u
->read_link_mtu
, &u
->write_link_mtu
);
338 if (u
->stream_fd
< 0)
341 u
->accesstype
= pa_xstrdup(accesstype
);
342 pa_log_info("Transport %s acquired: fd %d", u
->transport
, u
->stream_fd
);
348 pa_log_info("Transport %s resuming", u
->transport
);
349 return setup_stream(u
);
352 /* Run from IO thread */
353 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
354 struct userdata
*u
= PA_SINK(o
)->userdata
;
355 pa_bool_t failed
= FALSE
;
358 pa_assert(u
->sink
== PA_SINK(o
));
359 pa_assert(u
->transport
);
363 case PA_SINK_MESSAGE_SET_STATE
:
365 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
367 case PA_SINK_SUSPENDED
:
368 pa_assert(PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
));
370 /* Stop the device if the source is suspended as well */
371 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
)
372 /* We deliberately ignore whether stopping
373 * actually worked. Since the stream_fd is
374 * closed it doesn't really matter */
375 bt_transport_release(u
);
380 case PA_SINK_RUNNING
:
381 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
384 /* Resume the device if the source was suspended as well */
385 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
) {
386 if (bt_transport_acquire(u
, TRUE
) < 0)
391 case PA_SINK_UNLINKED
:
393 case PA_SINK_INVALID_STATE
:
398 case PA_SINK_MESSAGE_GET_LATENCY
: {
400 if (u
->read_smoother
) {
403 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
404 wi
= pa_bytes_to_usec(u
->write_index
+ u
->write_block_size
, &u
->sample_spec
);
406 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
410 ri
= pa_rtclock_now() - u
->started_at
;
411 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
413 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
416 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
421 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
423 return (r
< 0 || !failed
) ? r
: -1;
426 /* Run from IO thread */
427 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
428 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
429 pa_bool_t failed
= FALSE
;
432 pa_assert(u
->source
== PA_SOURCE(o
));
433 pa_assert(u
->transport
);
437 case PA_SOURCE_MESSAGE_SET_STATE
:
439 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
441 case PA_SOURCE_SUSPENDED
:
442 pa_assert(PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
));
444 /* Stop the device if the sink is suspended as well */
445 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
)
446 bt_transport_release(u
);
448 if (u
->read_smoother
)
449 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
453 case PA_SOURCE_RUNNING
:
454 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
457 /* Resume the device if the sink was suspended as well */
458 if (!u
->sink
|| u
->sink
->thread_info
.state
== PA_SINK_SUSPENDED
) {
459 if (bt_transport_acquire(u
, TRUE
) < 0)
462 /* We don't resume the smoother here. Instead we
463 * wait until the first packet arrives */
466 case PA_SOURCE_UNLINKED
:
468 case PA_SOURCE_INVALID_STATE
:
473 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
476 if (u
->read_smoother
) {
477 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
478 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
480 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
482 *((pa_usec_t
*) data
) = 0;
489 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
491 return (r
< 0 || !failed
) ? r
: -1;
494 /* Called from main thread context */
495 static int device_process_msg(pa_msgobject
*obj
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
496 struct bluetooth_msg
*u
= BLUETOOTH_MSG(obj
);
499 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED
: {
500 if (u
->card
->module
->unload_requested
)
503 pa_log_debug("Switching the profile to off due to IO thread failure.");
505 if (pa_card_set_profile(u
->card
, "off", FALSE
) < 0)
506 pa_log_debug("Failed to switch profile to off");
513 /* Run from IO thread */
514 static int hsp_process_render(struct userdata
*u
) {
518 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
521 /* First, render some data */
522 if (!u
->write_memchunk
.memblock
)
523 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
525 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
531 /* Now write that data to the socket. The socket is of type
532 * SEQPACKET, and we generated the data of the MTU size, so this
533 * should just work. */
535 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
536 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
537 pa_memblock_release(u
->write_memchunk
.memblock
);
544 /* Retry right away if we got interrupted */
547 else if (errno
== EAGAIN
)
548 /* Hmm, apparently the socket was not writable, give up for now */
551 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
556 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
558 if ((size_t) l
!= u
->write_memchunk
.length
) {
559 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
560 (unsigned long long) l
,
561 (unsigned long long) u
->write_memchunk
.length
);
566 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
567 pa_memblock_unref(u
->write_memchunk
.memblock
);
568 pa_memchunk_reset(&u
->write_memchunk
);
577 /* Run from IO thread */
578 static int hsp_process_push(struct userdata
*u
) {
580 pa_memchunk memchunk
;
583 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
584 pa_assert(u
->source
);
585 pa_assert(u
->read_smoother
);
587 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
588 memchunk
.index
= memchunk
.length
= 0;
597 pa_bool_t found_tstamp
= FALSE
;
600 memset(&m
, 0, sizeof(m
));
601 memset(&aux
, 0, sizeof(aux
));
602 memset(&iov
, 0, sizeof(iov
));
607 m
.msg_controllen
= sizeof(aux
);
609 p
= pa_memblock_acquire(memchunk
.memblock
);
611 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
612 l
= recvmsg(u
->stream_fd
, &m
, 0);
613 pa_memblock_release(memchunk
.memblock
);
617 if (l
< 0 && errno
== EINTR
)
618 /* Retry right away if we got interrupted */
621 else if (l
< 0 && errno
== EAGAIN
)
622 /* Hmm, apparently the socket was not readable, give up for now. */
625 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
630 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
632 memchunk
.length
= (size_t) l
;
633 u
->read_index
+= (uint64_t) l
;
635 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
636 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
637 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
638 pa_rtclock_from_wallclock(tv
);
639 tstamp
= pa_timeval_load(tv
);
645 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
646 tstamp
= pa_rtclock_now();
649 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
650 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
652 pa_source_post(u
->source
, &memchunk
);
658 pa_memblock_unref(memchunk
.memblock
);
663 /* Run from IO thread */
664 static void a2dp_prepare_buffer(struct userdata
*u
) {
665 size_t min_buffer_size
= PA_MAX(u
->read_link_mtu
, u
->write_link_mtu
);
669 if (u
->a2dp
.buffer_size
>= min_buffer_size
)
672 u
->a2dp
.buffer_size
= 2 * min_buffer_size
;
673 pa_xfree(u
->a2dp
.buffer
);
674 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
677 /* Run from IO thread */
678 static int a2dp_process_render(struct userdata
*u
) {
679 struct a2dp_info
*a2dp
;
680 struct rtp_header
*header
;
681 struct rtp_payload
*payload
;
685 size_t to_write
, to_encode
;
686 unsigned frame_count
;
690 pa_assert(u
->profile
== PROFILE_A2DP
);
693 /* First, render some data */
694 if (!u
->write_memchunk
.memblock
)
695 pa_sink_render_full(u
->sink
, u
->write_block_size
, &u
->write_memchunk
);
697 pa_assert(u
->write_memchunk
.length
== u
->write_block_size
);
699 a2dp_prepare_buffer(u
);
702 header
= a2dp
->buffer
;
703 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
707 /* Try to create a packet of the full MTU */
709 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
710 to_encode
= u
->write_memchunk
.length
;
712 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
713 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
715 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
719 encoded
= sbc_encode(&a2dp
->sbc
,
724 if (PA_UNLIKELY(encoded
<= 0)) {
725 pa_log_error("SBC encoding error (%li)", (long) encoded
);
726 pa_memblock_release(u
->write_memchunk
.memblock
);
730 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
731 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
733 pa_assert_fp((size_t) encoded
<= to_encode
);
734 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
736 pa_assert_fp((size_t) written
<= to_write
);
737 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
739 p
= (const uint8_t*) p
+ encoded
;
740 to_encode
-= encoded
;
742 d
= (uint8_t*) d
+ written
;
748 pa_memblock_release(u
->write_memchunk
.memblock
);
750 pa_assert(to_encode
== 0);
753 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
756 /* write it to the fifo */
757 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
760 header
->sequence_number
= htons(a2dp
->seq_num
++);
761 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
762 header
->ssrc
= htonl(1);
763 payload
->frame_count
= frame_count
;
765 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
770 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
777 /* Retry right away if we got interrupted */
780 else if (errno
== EAGAIN
)
781 /* Hmm, apparently the socket was not writable, give up for now */
784 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
789 pa_assert((size_t) l
<= nbytes
);
791 if ((size_t) l
!= nbytes
) {
792 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
793 (unsigned long long) l
,
794 (unsigned long long) nbytes
);
799 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
800 pa_memblock_unref(u
->write_memchunk
.memblock
);
801 pa_memchunk_reset(&u
->write_memchunk
);
811 static int a2dp_process_push(struct userdata
*u
) {
813 pa_memchunk memchunk
;
816 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
817 pa_assert(u
->source
);
818 pa_assert(u
->read_smoother
);
820 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->read_block_size
);
821 memchunk
.index
= memchunk
.length
= 0;
824 pa_bool_t found_tstamp
= FALSE
;
826 struct a2dp_info
*a2dp
;
827 struct rtp_header
*header
;
828 struct rtp_payload
*payload
;
832 size_t to_write
, to_decode
;
834 a2dp_prepare_buffer(u
);
837 header
= a2dp
->buffer
;
838 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
840 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
844 if (l
< 0 && errno
== EINTR
)
845 /* Retry right away if we got interrupted */
848 else if (l
< 0 && errno
== EAGAIN
)
849 /* Hmm, apparently the socket was not readable, give up for now. */
852 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
857 pa_assert((size_t) l
<= a2dp
->buffer_size
);
859 u
->read_index
+= (uint64_t) l
;
861 /* TODO: get timestamp from rtp */
863 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
864 tstamp
= pa_rtclock_now();
867 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
868 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
870 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
871 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
873 d
= pa_memblock_acquire(memchunk
.memblock
);
874 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
876 while (PA_LIKELY(to_decode
> 0)) {
880 decoded
= sbc_decode(&a2dp
->sbc
,
885 if (PA_UNLIKELY(decoded
<= 0)) {
886 pa_log_error("SBC decoding error (%li)", (long) decoded
);
887 pa_memblock_release(memchunk
.memblock
);
888 pa_memblock_unref(memchunk
.memblock
);
892 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
893 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
895 /* Reset frame length, it can be changed due to bitpool change */
896 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
898 pa_assert_fp((size_t) decoded
<= to_decode
);
899 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
901 pa_assert_fp((size_t) written
== a2dp
->codesize
);
903 p
= (const uint8_t*) p
+ decoded
;
904 to_decode
-= decoded
;
906 d
= (uint8_t*) d
+ written
;
910 memchunk
.length
-= to_write
;
912 pa_memblock_release(memchunk
.memblock
);
914 pa_source_post(u
->source
, &memchunk
);
920 pa_memblock_unref(memchunk
.memblock
);
925 static void a2dp_reduce_bitpool(struct userdata
*u
)
927 struct a2dp_info
*a2dp
;
934 /* Check if bitpool is already at its limit */
935 if (a2dp
->sbc
.bitpool
<= BITPOOL_DEC_LIMIT
)
938 bitpool
= a2dp
->sbc
.bitpool
- BITPOOL_DEC_STEP
;
940 if (bitpool
< BITPOOL_DEC_LIMIT
)
941 bitpool
= BITPOOL_DEC_LIMIT
;
943 a2dp_set_bitpool(u
, bitpool
);
946 static void thread_func(void *userdata
) {
947 struct userdata
*u
= userdata
;
948 unsigned do_write
= 0;
949 unsigned pending_read_bytes
= 0;
950 pa_bool_t writable
= FALSE
;
953 pa_assert(u
->transport
);
955 pa_log_debug("IO Thread starting up");
957 if (u
->core
->realtime_scheduling
)
958 pa_make_realtime(u
->core
->realtime_priority
);
960 pa_thread_mq_install(&u
->thread_mq
);
962 if (bt_transport_acquire(u
, TRUE
) < 0)
966 struct pollfd
*pollfd
;
968 pa_bool_t disable_timer
= TRUE
;
970 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
972 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
974 /* We should send two blocks to the device before we expect
977 if (u
->write_index
== 0 && u
->read_index
<= 0)
980 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
983 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
984 n_read
= hsp_process_push(u
);
986 n_read
= a2dp_process_push(u
);
991 /* We just read something, so we are supposed to write something, too */
992 pending_read_bytes
+= n_read
;
993 do_write
+= pending_read_bytes
/ u
->write_block_size
;
994 pending_read_bytes
= pending_read_bytes
% u
->write_block_size
;
998 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1000 if (u
->sink
->thread_info
.rewind_requested
)
1001 pa_sink_process_rewind(u
->sink
, 0);
1004 if (pollfd
->revents
& POLLOUT
)
1007 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1008 pa_usec_t time_passed
;
1009 pa_usec_t audio_sent
;
1011 /* Hmm, there is no input stream we could synchronize
1012 * to. So let's do things by time */
1014 time_passed
= pa_rtclock_now() - u
->started_at
;
1015 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1017 if (audio_sent
<= time_passed
) {
1018 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1020 /* Never try to catch up for more than 100ms */
1021 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1022 pa_usec_t skip_usec
;
1023 uint64_t skip_bytes
;
1025 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1026 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1028 if (skip_bytes
> 0) {
1031 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1032 (unsigned long long) skip_usec
,
1033 (unsigned long long) skip_bytes
);
1035 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1036 pa_memblock_unref(tmp
.memblock
);
1037 u
->write_index
+= skip_bytes
;
1039 if (u
->profile
== PROFILE_A2DP
)
1040 a2dp_reduce_bitpool(u
);
1045 pending_read_bytes
= 0;
1049 if (writable
&& do_write
> 0) {
1052 if (u
->write_index
<= 0)
1053 u
->started_at
= pa_rtclock_now();
1055 if (u
->profile
== PROFILE_A2DP
) {
1056 if ((n_written
= a2dp_process_render(u
)) < 0)
1059 if ((n_written
= hsp_process_render(u
)) < 0)
1064 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1066 do_write
-= n_written
;
1070 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0) {
1071 pa_usec_t sleep_for
;
1072 pa_usec_t time_passed
, next_write_at
;
1075 /* Hmm, there is no input stream we could synchronize
1076 * to. So let's estimate when we need to wake up the latest */
1077 time_passed
= pa_rtclock_now() - u
->started_at
;
1078 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1079 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1080 /* 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); */
1082 /* drop stream every 500 ms */
1083 sleep_for
= PA_USEC_PER_MSEC
* 500;
1085 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1086 disable_timer
= FALSE
;
1092 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1094 /* Hmm, nothing to do. Let's sleep */
1096 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1097 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1099 if ((ret
= pa_rtpoll_run(u
->rtpoll
, TRUE
)) < 0) {
1100 pa_log_debug("pa_rtpoll_run failed with: %d", ret
);
1104 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1105 bt_transport_release(u
);
1109 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1111 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1112 pa_log_info("FD error: %s%s%s%s",
1113 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1114 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1115 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1116 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1122 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1123 pa_log_debug("IO thread failed");
1124 pa_asyncmsgq_post(pa_thread_mq_get()->outq
, PA_MSGOBJECT(u
->msg
), BLUETOOTH_MESSAGE_IO_THREAD_FAILED
, NULL
, 0, NULL
, NULL
);
1125 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1128 pa_log_debug("IO thread shutting down");
1131 /* Run from main thread */
1132 static DBusHandlerResult
filter_cb(DBusConnection
*bus
, DBusMessage
*m
, void *userdata
) {
1138 pa_assert_se(u
= userdata
);
1140 dbus_error_init(&err
);
1142 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1143 dbus_message_get_interface(m
),
1144 dbus_message_get_path(m
),
1145 dbus_message_get_member(m
));
1147 if (!dbus_message_has_path(m
, u
->path
) && !dbus_message_has_path(m
, u
->transport
))
1150 if (dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged") ||
1151 dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1156 if (!dbus_message_get_args(m
, &err
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
) || gain
> HSP_MAX_GAIN
) {
1157 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err
.message
);
1161 if (u
->profile
== PROFILE_HSP
) {
1162 if (u
->sink
&& dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged")) {
1163 pa_volume_t volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1165 /* increment volume by one to correct rounding errors */
1166 if (volume
< PA_VOLUME_NORM
)
1169 pa_cvolume_set(&v
, u
->sample_spec
.channels
, volume
);
1170 pa_sink_volume_changed(u
->sink
, &v
);
1172 } else if (u
->source
&& dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1173 pa_volume_t volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1175 /* increment volume by one to correct rounding errors */
1176 if (volume
< PA_VOLUME_NORM
)
1179 pa_cvolume_set(&v
, u
->sample_spec
.channels
, volume
);
1180 pa_source_volume_changed(u
->source
, &v
);
1183 } else if (dbus_message_is_signal(m
, "org.bluez.HandsfreeGateway", "PropertyChanged")) {
1185 DBusMessageIter iter
;
1186 DBusMessageIter variant
;
1187 pa_bt_audio_state_t state
= PA_BT_AUDIO_STATE_INVALID
;
1189 if (!dbus_message_iter_init(m
, &iter
)) {
1190 pa_log("Failed to parse PropertyChanged: %s", err
.message
);
1194 if (dbus_message_iter_get_arg_type(&iter
) != DBUS_TYPE_STRING
) {
1195 pa_log("Property name not a string.");
1199 dbus_message_iter_get_basic(&iter
, &key
);
1201 if (!dbus_message_iter_next(&iter
)) {
1202 pa_log("Property value missing");
1206 dbus_message_iter_recurse(&iter
, &variant
);
1208 if (dbus_message_iter_get_arg_type(&variant
) == DBUS_TYPE_STRING
) {
1210 dbus_message_iter_get_basic(&variant
, &value
);
1212 if (pa_streq(key
, "State")) {
1213 pa_log_debug("dbus: HSHFAG property 'State' changed to value '%s'", value
);
1214 state
= pa_bt_audio_state_from_string(value
);
1219 case PA_BT_AUDIO_STATE_INVALID
:
1220 case PA_BT_AUDIO_STATE_DISCONNECTED
:
1221 case PA_BT_AUDIO_STATE_CONNECTED
:
1222 case PA_BT_AUDIO_STATE_CONNECTING
:
1225 case PA_BT_AUDIO_STATE_PLAYING
:
1227 pa_log_debug("Changing profile to hfgw");
1228 if (pa_card_set_profile(u
->card
, "hfgw", FALSE
) < 0)
1229 pa_log("Failed to change profile to hfgw");
1236 dbus_error_free(&err
);
1238 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
1241 /* Run from main thread */
1242 static void sink_set_volume_cb(pa_sink
*s
) {
1252 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1253 u
= pa_shared_get(s
->core
, k
);
1257 pa_assert(u
->sink
== s
);
1258 pa_assert(u
->profile
== PROFILE_HSP
);
1260 gain
= (pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
) / PA_VOLUME_NORM
;
1262 if (gain
> HSP_MAX_GAIN
)
1263 gain
= HSP_MAX_GAIN
;
1265 volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1267 /* increment volume by one to correct rounding errors */
1268 if (volume
< PA_VOLUME_NORM
)
1271 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1273 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetSpeakerGain"));
1274 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1275 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1276 dbus_message_unref(m
);
1279 /* Run from main thread */
1280 static void source_set_volume_cb(pa_source
*s
) {
1290 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1291 u
= pa_shared_get(s
->core
, k
);
1295 pa_assert(u
->source
== s
);
1296 pa_assert(u
->profile
== PROFILE_HSP
);
1298 gain
= (pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
) / PA_VOLUME_NORM
;
1300 if (gain
> HSP_MAX_GAIN
)
1301 gain
= HSP_MAX_GAIN
;
1303 volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1305 /* increment volume by one to correct rounding errors */
1306 if (volume
< PA_VOLUME_NORM
)
1309 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1311 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetMicrophoneGain"));
1312 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1313 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1314 dbus_message_unref(m
);
1317 /* Run from main thread */
1318 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, pa_bool_t
*namereg_fail
) {
1324 pa_assert(device_id
);
1325 pa_assert(namereg_fail
);
1327 t
= pa_sprintf_malloc("%s_name", type
);
1328 n
= pa_modargs_get_value(ma
, t
, NULL
);
1332 *namereg_fail
= TRUE
;
1333 return pa_xstrdup(n
);
1336 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1337 *namereg_fail
= TRUE
;
1340 *namereg_fail
= FALSE
;
1343 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1346 static int sco_over_pcm_state_update(struct userdata
*u
, pa_bool_t changed
) {
1348 pa_assert(USE_SCO_OVER_PCM(u
));
1350 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1351 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1353 if (u
->stream_fd
>= 0)
1356 pa_log_debug("Resuming SCO over PCM");
1357 if (init_profile(u
) < 0) {
1358 pa_log("Can't resume SCO over PCM");
1362 return bt_transport_acquire(u
, TRUE
);
1366 if (u
->stream_fd
< 0)
1369 pa_log_debug("Closing SCO over PCM");
1371 bt_transport_release(u
);
1377 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
1379 pa_sink_assert_ref(s
);
1382 if (s
!= u
->hsp
.sco_sink
)
1385 sco_over_pcm_state_update(u
, TRUE
);
1390 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
1392 pa_source_assert_ref(s
);
1395 if (s
!= u
->hsp
.sco_source
)
1398 sco_over_pcm_state_update(u
, TRUE
);
1403 static pa_hook_result_t
nrec_changed_cb(pa_bluetooth_transport
*t
, void *call_data
, struct userdata
*u
) {
1409 p
= pa_proplist_new();
1410 pa_proplist_sets(p
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1411 pa_source_update_proplist(u
->source
, PA_UPDATE_REPLACE
, p
);
1412 pa_proplist_free(p
);
1417 static void connect_ports(struct userdata
*u
, void *sink_or_source_new_data
, pa_direction_t direction
) {
1419 pa_sink_new_data
*sink_new_data
;
1420 pa_source_new_data
*source_new_data
;
1422 pa_device_port
*port
;
1424 if (direction
== PA_DIRECTION_OUTPUT
)
1425 data
.sink_new_data
= sink_or_source_new_data
;
1427 data
.source_new_data
= sink_or_source_new_data
;
1429 switch (u
->profile
) {
1431 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-output"));
1432 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1433 pa_device_port_ref(port
);
1436 case PROFILE_A2DP_SOURCE
:
1437 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
1438 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1439 pa_device_port_ref(port
);
1443 if (direction
== PA_DIRECTION_OUTPUT
) {
1444 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-output"));
1445 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1447 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
1448 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1450 pa_device_port_ref(port
);
1454 if (direction
== PA_DIRECTION_OUTPUT
) {
1455 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
1456 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
1458 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
1459 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
1461 pa_device_port_ref(port
);
1465 pa_assert_not_reached();
1469 /* Run from main thread */
1470 static int add_sink(struct userdata
*u
) {
1473 if (USE_SCO_OVER_PCM(u
)) {
1476 u
->sink
= u
->hsp
.sco_sink
;
1477 p
= pa_proplist_new();
1478 pa_proplist_sets(p
, "bluetooth.protocol", "sco");
1479 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
1480 pa_proplist_free(p
);
1482 if (!u
->hsp
.sink_state_changed_slot
)
1483 u
->hsp
.sink_state_changed_slot
= pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SINK_STATE_CHANGED
], PA_HOOK_NORMAL
, (pa_hook_cb_t
) sink_state_changed_cb
, u
);
1486 pa_sink_new_data data
;
1489 pa_sink_new_data_init(&data
);
1490 data
.driver
= __FILE__
;
1491 data
.module
= u
->module
;
1492 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1493 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP
? "a2dp" : "sco");
1494 if (u
->profile
== PROFILE_HSP
)
1495 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1496 data
.card
= u
->card
;
1497 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
1498 data
.namereg_fail
= b
;
1500 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1501 pa_log("Invalid properties");
1502 pa_sink_new_data_done(&data
);
1505 connect_ports(u
, &data
, PA_DIRECTION_OUTPUT
);
1507 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
);
1508 pa_sink_new_data_done(&data
);
1511 pa_log_error("Failed to create sink");
1515 u
->sink
->userdata
= u
;
1516 u
->sink
->parent
.process_msg
= sink_process_msg
;
1518 pa_sink_set_max_request(u
->sink
, u
->write_block_size
);
1519 pa_sink_set_fixed_latency(u
->sink
,
1520 (u
->profile
== PROFILE_A2DP
? FIXED_LATENCY_PLAYBACK_A2DP
: FIXED_LATENCY_PLAYBACK_HSP
) +
1521 pa_bytes_to_usec(u
->write_block_size
, &u
->sample_spec
));
1524 if (u
->profile
== PROFILE_HSP
) {
1525 pa_sink_set_set_volume_callback(u
->sink
, sink_set_volume_cb
);
1526 u
->sink
->n_volume_steps
= 16;
1528 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1529 pa_shared_set(u
->core
, k
, u
);
1536 /* Run from main thread */
1537 static int add_source(struct userdata
*u
) {
1540 if (USE_SCO_OVER_PCM(u
)) {
1541 u
->source
= u
->hsp
.sco_source
;
1542 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", "hsp");
1544 if (!u
->hsp
.source_state_changed_slot
)
1545 u
->hsp
.source_state_changed_slot
= pa_hook_connect(&u
->core
->hooks
[PA_CORE_HOOK_SOURCE_STATE_CHANGED
], PA_HOOK_NORMAL
, (pa_hook_cb_t
) source_state_changed_cb
, u
);
1548 pa_source_new_data data
;
1551 pa_source_new_data_init(&data
);
1552 data
.driver
= __FILE__
;
1553 data
.module
= u
->module
;
1554 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1555 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP_SOURCE
? "a2dp_source" : "hsp");
1556 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
))
1557 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1559 data
.card
= u
->card
;
1560 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
1561 data
.namereg_fail
= b
;
1563 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1564 pa_log("Invalid properties");
1565 pa_source_new_data_done(&data
);
1569 connect_ports(u
, &data
, PA_DIRECTION_INPUT
);
1570 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
);
1571 pa_source_new_data_done(&data
);
1574 pa_log_error("Failed to create source");
1578 u
->source
->userdata
= u
;
1579 u
->source
->parent
.process_msg
= source_process_msg
;
1581 pa_source_set_fixed_latency(u
->source
,
1582 (u
->profile
== PROFILE_A2DP_SOURCE
? FIXED_LATENCY_RECORD_A2DP
: FIXED_LATENCY_RECORD_HSP
) +
1583 pa_bytes_to_usec(u
->read_block_size
, &u
->sample_spec
));
1586 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
)) {
1587 pa_bluetooth_transport
*t
;
1588 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
1590 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", t
->nrec
? "1" : "0");
1592 if (!u
->hsp
.nrec_changed_slot
)
1593 u
->hsp
.nrec_changed_slot
= pa_hook_connect(&t
->hooks
[PA_BLUETOOTH_TRANSPORT_HOOK_NREC_CHANGED
], PA_HOOK_NORMAL
, (pa_hook_cb_t
) nrec_changed_cb
, u
);
1596 if (u
->profile
== PROFILE_HSP
) {
1597 pa_source_set_set_volume_callback(u
->source
, source_set_volume_cb
);
1598 u
->source
->n_volume_steps
= 16;
1600 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1601 pa_shared_set(u
->core
, k
, u
);
1608 static int bt_transport_config_a2dp(struct userdata
*u
) {
1609 const pa_bluetooth_transport
*t
;
1610 struct a2dp_info
*a2dp
= &u
->a2dp
;
1613 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
1616 config
= (a2dp_sbc_t
*) t
->config
;
1618 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1620 if (a2dp
->sbc_initialized
)
1621 sbc_reinit(&a2dp
->sbc
, 0);
1623 sbc_init(&a2dp
->sbc
, 0);
1624 a2dp
->sbc_initialized
= TRUE
;
1626 switch (config
->frequency
) {
1627 case BT_SBC_SAMPLING_FREQ_16000
:
1628 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
1629 u
->sample_spec
.rate
= 16000U;
1631 case BT_SBC_SAMPLING_FREQ_32000
:
1632 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
1633 u
->sample_spec
.rate
= 32000U;
1635 case BT_SBC_SAMPLING_FREQ_44100
:
1636 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
1637 u
->sample_spec
.rate
= 44100U;
1639 case BT_SBC_SAMPLING_FREQ_48000
:
1640 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
1641 u
->sample_spec
.rate
= 48000U;
1644 pa_assert_not_reached();
1647 switch (config
->channel_mode
) {
1648 case BT_A2DP_CHANNEL_MODE_MONO
:
1649 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
1650 u
->sample_spec
.channels
= 1;
1652 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
1653 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
1654 u
->sample_spec
.channels
= 2;
1656 case BT_A2DP_CHANNEL_MODE_STEREO
:
1657 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
1658 u
->sample_spec
.channels
= 2;
1660 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
1661 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
1662 u
->sample_spec
.channels
= 2;
1665 pa_assert_not_reached();
1668 switch (config
->allocation_method
) {
1669 case BT_A2DP_ALLOCATION_SNR
:
1670 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
1672 case BT_A2DP_ALLOCATION_LOUDNESS
:
1673 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
1676 pa_assert_not_reached();
1679 switch (config
->subbands
) {
1680 case BT_A2DP_SUBBANDS_4
:
1681 a2dp
->sbc
.subbands
= SBC_SB_4
;
1683 case BT_A2DP_SUBBANDS_8
:
1684 a2dp
->sbc
.subbands
= SBC_SB_8
;
1687 pa_assert_not_reached();
1690 switch (config
->block_length
) {
1691 case BT_A2DP_BLOCK_LENGTH_4
:
1692 a2dp
->sbc
.blocks
= SBC_BLK_4
;
1694 case BT_A2DP_BLOCK_LENGTH_8
:
1695 a2dp
->sbc
.blocks
= SBC_BLK_8
;
1697 case BT_A2DP_BLOCK_LENGTH_12
:
1698 a2dp
->sbc
.blocks
= SBC_BLK_12
;
1700 case BT_A2DP_BLOCK_LENGTH_16
:
1701 a2dp
->sbc
.blocks
= SBC_BLK_16
;
1704 pa_assert_not_reached();
1707 a2dp
->min_bitpool
= config
->min_bitpool
;
1708 a2dp
->max_bitpool
= config
->max_bitpool
;
1710 /* Set minimum bitpool for source to get the maximum possible block_size */
1711 a2dp
->sbc
.bitpool
= u
->profile
== PROFILE_A2DP
? a2dp
->max_bitpool
: a2dp
->min_bitpool
;
1712 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
1713 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
1715 u
->read_block_size
=
1716 (u
->read_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
1717 / a2dp
->frame_length
* a2dp
->codesize
;
1719 u
->write_block_size
=
1720 (u
->write_link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
1721 / a2dp
->frame_length
* a2dp
->codesize
;
1723 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
1724 a2dp
->sbc
.allocation
, a2dp
->sbc
.subbands
, a2dp
->sbc
.blocks
, a2dp
->sbc
.bitpool
);
1729 static int bt_transport_config(struct userdata
*u
) {
1730 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
1731 u
->read_block_size
= u
->read_link_mtu
;
1732 u
->write_block_size
= u
->write_link_mtu
;
1733 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
1734 u
->sample_spec
.channels
= 1;
1735 u
->sample_spec
.rate
= 8000;
1739 return bt_transport_config_a2dp(u
);
1742 /* Run from main thread */
1743 static int setup_bt(struct userdata
*u
) {
1744 const pa_bluetooth_device
*d
;
1745 const pa_bluetooth_transport
*t
;
1749 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
1750 pa_log_error("Failed to get device object.");
1754 /* release transport if exist */
1756 bt_transport_release(u
);
1757 pa_xfree(u
->transport
);
1758 u
->transport
= NULL
;
1761 /* check if profile has a transport */
1762 t
= pa_bluetooth_device_get_transport(d
, u
->profile
);
1764 pa_log_warn("Profile has no transport");
1768 u
->transport
= pa_xstrdup(t
->path
);
1770 if (bt_transport_acquire(u
, FALSE
) < 0)
1773 return bt_transport_config(u
);
1776 /* Run from main thread */
1777 static int init_profile(struct userdata
*u
) {
1780 pa_assert(u
->profile
!= PROFILE_OFF
);
1782 if (setup_bt(u
) < 0)
1785 if (u
->profile
== PROFILE_A2DP
||
1786 u
->profile
== PROFILE_HSP
||
1787 u
->profile
== PROFILE_HFGW
)
1788 if (add_sink(u
) < 0)
1791 if (u
->profile
== PROFILE_HSP
||
1792 u
->profile
== PROFILE_A2DP_SOURCE
||
1793 u
->profile
== PROFILE_HFGW
)
1794 if (add_source(u
) < 0)
1800 /* Run from main thread */
1801 static void stop_thread(struct userdata
*u
) {
1807 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
1808 pa_thread_free(u
->thread
);
1812 if (u
->rtpoll_item
) {
1813 pa_rtpoll_item_free(u
->rtpoll_item
);
1814 u
->rtpoll_item
= NULL
;
1817 if (u
->hsp
.sink_state_changed_slot
) {
1818 pa_hook_slot_free(u
->hsp
.sink_state_changed_slot
);
1819 u
->hsp
.sink_state_changed_slot
= NULL
;
1822 if (u
->hsp
.source_state_changed_slot
) {
1823 pa_hook_slot_free(u
->hsp
.source_state_changed_slot
);
1824 u
->hsp
.source_state_changed_slot
= NULL
;
1827 if (u
->hsp
.nrec_changed_slot
) {
1828 pa_hook_slot_free(u
->hsp
.nrec_changed_slot
);
1829 u
->hsp
.nrec_changed_slot
= NULL
;
1833 if (u
->profile
== PROFILE_HSP
) {
1834 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1835 pa_shared_remove(u
->core
, k
);
1839 pa_sink_unref(u
->sink
);
1844 if (u
->profile
== PROFILE_HSP
) {
1845 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1846 pa_shared_remove(u
->core
, k
);
1850 pa_source_unref(u
->source
);
1855 pa_thread_mq_done(&u
->thread_mq
);
1857 pa_rtpoll_free(u
->rtpoll
);
1861 if (u
->read_smoother
) {
1862 pa_smoother_free(u
->read_smoother
);
1863 u
->read_smoother
= NULL
;
1867 /* Run from main thread */
1868 static int start_thread(struct userdata
*u
) {
1870 pa_assert(!u
->thread
);
1871 pa_assert(!u
->rtpoll
);
1872 pa_assert(!u
->rtpoll_item
);
1874 u
->rtpoll
= pa_rtpoll_new();
1875 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
1877 if (USE_SCO_OVER_PCM(u
)) {
1878 if (sco_over_pcm_state_update(u
, FALSE
) < 0) {
1882 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
1883 pa_shared_remove(u
->core
, k
);
1888 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
1889 pa_shared_remove(u
->core
, k
);
1896 pa_sink_ref(u
->sink
);
1897 pa_source_ref(u
->source
);
1898 /* FIXME: monitor stream_fd error */
1902 if (!(u
->thread
= pa_thread_new("bluetooth", thread_func
, u
))) {
1903 pa_log_error("Failed to create IO thread");
1909 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
1910 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
1911 pa_sink_put(u
->sink
);
1913 if (u
->sink
->set_volume
)
1914 u
->sink
->set_volume(u
->sink
);
1918 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
1919 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
1920 pa_source_put(u
->source
);
1922 if (u
->source
->set_volume
)
1923 u
->source
->set_volume(u
->source
);
1929 static void save_sco_volume_callbacks(struct userdata
*u
) {
1931 pa_assert(USE_SCO_OVER_PCM(u
));
1933 u
->hsp
.sco_sink_set_volume
= u
->hsp
.sco_sink
->set_volume
;
1934 u
->hsp
.sco_source_set_volume
= u
->hsp
.sco_source
->set_volume
;
1937 static void restore_sco_volume_callbacks(struct userdata
*u
) {
1939 pa_assert(USE_SCO_OVER_PCM(u
));
1941 pa_sink_set_set_volume_callback(u
->hsp
.sco_sink
, u
->hsp
.sco_sink_set_volume
);
1942 pa_source_set_set_volume_callback(u
->hsp
.sco_source
, u
->hsp
.sco_source_set_volume
);
1945 /* Run from main thread */
1946 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
1949 pa_queue
*inputs
= NULL
, *outputs
= NULL
;
1950 const pa_bluetooth_device
*device
;
1953 pa_assert(new_profile
);
1954 pa_assert_se(u
= c
->userdata
);
1956 d
= PA_CARD_PROFILE_DATA(new_profile
);
1958 if (!(device
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
1959 pa_log_error("Failed to get device object.");
1963 /* The state signal is sent by bluez, so it is racy to check
1964 strictly for CONNECTED, we should also accept STREAMING state
1965 as being good enough. However, if the profile is used
1966 concurrently (which is unlikely), ipc will fail later on, and
1967 module will be unloaded. */
1968 if (device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) {
1969 pa_log_warn("HSP is not connected, refused to switch profile");
1972 else if (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) {
1973 pa_log_warn("A2DP is not connected, refused to switch profile");
1976 else if (device
->hfgw_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
) {
1977 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
1982 inputs
= pa_sink_move_all_start(u
->sink
, NULL
);
1984 if (!USE_SCO_OVER_PCM(u
))
1985 pa_sink_unlink(u
->sink
);
1989 outputs
= pa_source_move_all_start(u
->source
, NULL
);
1991 if (!USE_SCO_OVER_PCM(u
))
1992 pa_source_unlink(u
->source
);
1997 if (u
->profile
!= PROFILE_OFF
&& u
->transport
) {
1998 bt_transport_release(u
);
1999 pa_xfree(u
->transport
);
2000 u
->transport
= NULL
;
2003 if (USE_SCO_OVER_PCM(u
))
2004 restore_sco_volume_callbacks(u
);
2007 u
->sample_spec
= u
->requested_sample_spec
;
2009 if (USE_SCO_OVER_PCM(u
))
2010 save_sco_volume_callbacks(u
);
2012 if (u
->profile
!= PROFILE_OFF
)
2015 if (u
->sink
|| u
->source
)
2020 pa_sink_move_all_finish(u
->sink
, inputs
, FALSE
);
2022 pa_sink_move_all_fail(inputs
);
2027 pa_source_move_all_finish(u
->source
, outputs
, FALSE
);
2029 pa_source_move_all_fail(outputs
);
2035 static void create_ports_for_profile(struct userdata
*u
, pa_card_new_data
*card_new_data
, pa_card_profile
*profile
) {
2036 pa_device_port
*port
;
2039 d
= PA_CARD_PROFILE_DATA(profile
);
2043 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-output", _("Bluetooth High Quality (A2DP)"), 0));
2044 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2045 port
->is_output
= 1;
2047 port
->priority
= profile
->priority
* 100;
2048 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2051 case PROFILE_A2DP_SOURCE
:
2052 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2053 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2054 port
->is_output
= 0;
2056 port
->priority
= profile
->priority
* 100;
2057 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2061 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-output", _("Bluetooth Telephony (HSP/HFP)"), 0));
2062 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2063 port
->is_output
= 1;
2065 port
->priority
= profile
->priority
* 100;
2066 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2068 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2069 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2070 port
->is_output
= 0;
2072 port
->priority
= profile
->priority
* 100;
2073 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2077 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2078 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2079 port
->is_output
= 1;
2081 port
->priority
= profile
->priority
* 100;
2082 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2084 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2085 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2086 port
->is_output
= 0;
2088 port
->priority
= profile
->priority
* 100;
2089 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2093 pa_assert_not_reached();
2098 /* Run from main thread */
2099 static int add_card(struct userdata
*u
, const pa_bluetooth_device
*device
) {
2100 pa_card_new_data data
;
2106 const char *default_profile
;
2111 pa_card_new_data_init(&data
);
2112 data
.driver
= __FILE__
;
2113 data
.module
= u
->module
;
2115 n
= pa_bluetooth_cleanup_name(device
->name
);
2116 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2118 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2119 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2120 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2121 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2122 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2123 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2124 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2125 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2126 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2127 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2128 data
.namereg_fail
= b
;
2130 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2131 pa_log("Invalid properties");
2132 pa_card_new_data_done(&data
);
2136 /* we base hsp/a2dp availability on UUIDs.
2137 Ideally, it would be based on "Connected" state, but
2138 we can't afford to wait for this information when
2139 we are loaded with profile="hsp", for instance */
2140 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SINK_UUID
)) {
2141 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2145 p
->max_sink_channels
= 2;
2146 p
->max_source_channels
= 0;
2148 d
= PA_CARD_PROFILE_DATA(p
);
2150 create_ports_for_profile(u
, &data
, p
);
2152 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2155 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SOURCE_UUID
)) {
2156 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2160 p
->max_sink_channels
= 0;
2161 p
->max_source_channels
= 2;
2163 d
= PA_CARD_PROFILE_DATA(p
);
2164 *d
= PROFILE_A2DP_SOURCE
;
2165 create_ports_for_profile(u
, &data
, p
);
2167 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2170 if (pa_bluetooth_uuid_has(device
->uuids
, HSP_HS_UUID
) ||
2171 pa_bluetooth_uuid_has(device
->uuids
, HFP_HS_UUID
)) {
2172 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2176 p
->max_sink_channels
= 1;
2177 p
->max_source_channels
= 1;
2179 d
= PA_CARD_PROFILE_DATA(p
);
2181 create_ports_for_profile(u
, &data
, p
);
2183 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2186 if (pa_bluetooth_uuid_has(device
->uuids
, HFP_AG_UUID
)) {
2187 p
= pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile
));
2191 p
->max_sink_channels
= 1;
2192 p
->max_source_channels
= 1;
2194 d
= PA_CARD_PROFILE_DATA(p
);
2196 create_ports_for_profile(u
, &data
, p
);
2198 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2201 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2203 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2204 d
= PA_CARD_PROFILE_DATA(p
);
2206 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2208 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2209 if (pa_hashmap_get(data
.profiles
, default_profile
))
2210 pa_card_new_data_set_profile(&data
, default_profile
);
2212 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2215 u
->card
= pa_card_new(u
->core
, &data
);
2216 pa_card_new_data_done(&data
);
2219 pa_log("Failed to allocate card.");
2223 u
->card
->userdata
= u
;
2224 u
->card
->set_profile
= card_set_profile
;
2226 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2228 if ((device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) ||
2229 (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) ||
2230 (device
->hfgw_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
)) {
2231 pa_log_warn("Default profile not connected, selecting off profile");
2232 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2233 u
->card
->save_profile
= FALSE
;
2236 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2239 if (USE_SCO_OVER_PCM(u
))
2240 save_sco_volume_callbacks(u
);
2245 /* Run from main thread */
2246 static const pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2247 const pa_bluetooth_device
*d
= NULL
;
2251 if (!address
&& !path
) {
2252 pa_log_error("Failed to get device address/path from module arguments.");
2257 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2258 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2262 if (address
&& !(pa_streq(d
->address
, address
))) {
2263 pa_log_error("Passed path %s address %s != %s don't match.", path
, d
->address
, address
);
2268 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2269 pa_log_error("%s is not known.", address
);
2275 u
->address
= pa_xstrdup(d
->address
);
2276 u
->path
= pa_xstrdup(d
->path
);
2282 /* Run from main thread */
2283 static int setup_dbus(struct userdata
*u
) {
2286 dbus_error_init(&err
);
2288 u
->connection
= pa_dbus_bus_get(u
->core
, DBUS_BUS_SYSTEM
, &err
);
2290 if (dbus_error_is_set(&err
) || !u
->connection
) {
2291 pa_log("Failed to get D-Bus connection: %s", err
.message
);
2292 dbus_error_free(&err
);
2299 int pa__init(pa_module
* m
) {
2303 const char *address
, *path
;
2305 char *mike
, *speaker
;
2306 const pa_bluetooth_device
*device
;
2310 dbus_error_init(&err
);
2312 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
2313 pa_log_error("Failed to parse module arguments");
2317 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
2321 u
->sample_spec
= m
->core
->default_sample_spec
;
2324 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
2325 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
2326 pa_log("SCO sink not found");
2330 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
2331 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
2332 pa_log("SCO source not found");
2336 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
2337 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
2338 pa_log_error("Failed to get rate from module arguments");
2342 u
->auto_connect
= TRUE
;
2343 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
2344 pa_log("Failed to parse auto_connect= argument");
2348 channels
= u
->sample_spec
.channels
;
2349 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
2350 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
2351 pa_log_error("Failed to get channels from module arguments");
2354 u
->sample_spec
.channels
= (uint8_t) channels
;
2355 u
->requested_sample_spec
= u
->sample_spec
;
2357 address
= pa_modargs_get_value(ma
, "address", NULL
);
2358 path
= pa_modargs_get_value(ma
, "path", NULL
);
2360 if (setup_dbus(u
) < 0)
2363 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
2366 if (!(device
= find_device(u
, address
, path
)))
2369 /* Add the card structure. This will also initialize the default profile */
2370 if (add_card(u
, device
) < 0)
2373 if (!(u
->msg
= pa_msgobject_new(bluetooth_msg
)))
2376 u
->msg
->parent
.process_msg
= device_process_msg
;
2377 u
->msg
->card
= u
->card
;
2379 if (!dbus_connection_add_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
, NULL
)) {
2380 pa_log_error("Failed to add filter function");
2383 u
->filter_added
= TRUE
;
2385 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2386 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2388 if (pa_dbus_add_matches(
2389 pa_dbus_connection_get(u
->connection
), &err
,
2392 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2393 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2399 pa_log("Failed to add D-Bus matches: %s", err
.message
);
2406 if (u
->profile
!= PROFILE_OFF
)
2407 if (init_profile(u
) < 0)
2410 if (u
->sink
|| u
->source
)
2411 if (start_thread(u
) < 0)
2420 dbus_error_free(&err
);
2425 int pa__get_n_used(pa_module
*m
) {
2429 pa_assert_se(u
= m
->userdata
);
2432 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
2433 (u
->source
? pa_source_linked_by(u
->source
) : 0);
2436 void pa__done(pa_module
*m
) {
2441 if (!(u
= m
->userdata
))
2444 if (u
->sink
&& !USE_SCO_OVER_PCM(u
))
2445 pa_sink_unlink(u
->sink
);
2447 if (u
->source
&& !USE_SCO_OVER_PCM(u
))
2448 pa_source_unlink(u
->source
);
2452 if (USE_SCO_OVER_PCM(u
))
2453 restore_sco_volume_callbacks(u
);
2455 if (u
->connection
) {
2458 char *speaker
, *mike
;
2459 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2460 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2462 pa_dbus_remove_matches(pa_dbus_connection_get(u
->connection
), speaker
, mike
,
2463 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
2464 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
2471 if (u
->filter_added
)
2472 dbus_connection_remove_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
);
2474 pa_dbus_connection_unref(u
->connection
);
2481 pa_card_free(u
->card
);
2483 if (u
->read_smoother
)
2484 pa_smoother_free(u
->read_smoother
);
2487 pa_xfree(u
->a2dp
.buffer
);
2489 sbc_finish(&u
->a2dp
.sbc
);
2492 pa_modargs_free(u
->modargs
);
2494 pa_xfree(u
->address
);
2498 bt_transport_release(u
);
2499 pa_xfree(u
->transport
);
2503 pa_bluetooth_discovery_unref(u
->discovery
);