Skip to content

Commit

Permalink
Start PCM thread manager after PCM initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
arkq committed Dec 27, 2023
1 parent 0495d17 commit f9e91f0
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 14 deletions.
40 changes: 30 additions & 10 deletions src/ba-transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,11 +362,6 @@ static struct ba_transport *transport_new(

if (pipe(t->thread_manager_pipe) == -1)
goto fail;
if ((errno = pthread_create(&t->thread_manager_thread_id,
NULL, PTHREAD_FUNC(transport_thread_manager), t)) != 0) {
t->thread_manager_thread_id = config.main_thread;
goto fail;
}

if ((t->bluez_dbus_owner = strdup(dbus_owner)) == NULL)
goto fail;
Expand Down Expand Up @@ -510,6 +505,7 @@ struct ba_transport *ba_transport_new_a2dp(

const bool is_sink = profile & BA_TRANSPORT_PROFILE_A2DP_SINK;
struct ba_transport *t;
int err = 0;

if ((t = transport_new(device, dbus_owner, dbus_path)) == NULL)
return NULL;
Expand All @@ -520,18 +516,27 @@ struct ba_transport *ba_transport_new_a2dp(
memcpy(&t->a2dp.configuration, configuration, codec->capabilities_size);
t->a2dp.state = BLUEZ_A2DP_TRANSPORT_STATE_IDLE;

transport_pcm_init(&t->a2dp.pcm,
err |= transport_pcm_init(&t->a2dp.pcm,
is_sink ? BA_TRANSPORT_PCM_MODE_SOURCE : BA_TRANSPORT_PCM_MODE_SINK,
is_sink ? &t->thread_dec : &t->thread_enc,
true);
t->a2dp.pcm.soft_volume = !config.a2dp.volume;

transport_pcm_init(&t->a2dp.pcm_bc,
err |= transport_pcm_init(&t->a2dp.pcm_bc,
is_sink ? BA_TRANSPORT_PCM_MODE_SINK : BA_TRANSPORT_PCM_MODE_SOURCE,
is_sink ? &t->thread_enc : &t->thread_dec,
false);
t->a2dp.pcm_bc.soft_volume = !config.a2dp.volume;

if (err != 0)
goto fail;

if ((errno = pthread_create(&t->thread_manager_thread_id,
NULL, PTHREAD_FUNC(transport_thread_manager), t)) != 0) {
t->thread_manager_thread_id = config.main_thread;
goto fail;
}

t->acquire = transport_acquire_bt_a2dp;
t->release = transport_release_bt_a2dp;

Expand All @@ -546,6 +551,12 @@ struct ba_transport *ba_transport_new_a2dp(
bluealsa_dbus_pcm_register(&t->a2dp.pcm_bc);

return t;

fail:
err = errno;
ba_transport_unref(t);
errno = err;
return NULL;
}

static int transport_acquire_bt_sco(struct ba_transport *t) {
Expand Down Expand Up @@ -615,7 +626,7 @@ struct ba_transport *ba_transport_new_sco(
const bool is_ag = profile & BA_TRANSPORT_PROFILE_MASK_AG;
uint16_t codec_id = HFP_CODEC_UNDEFINED;
struct ba_transport *t;
int err;
int err = 0;

/* BlueALSA can only support one SCO transport per device, so we arbitrarily
* accept only the first profile connection, with no preference for HFP.
Expand All @@ -637,16 +648,25 @@ struct ba_transport *ba_transport_new_sco(

t->profile = profile;

transport_pcm_init(&t->sco.pcm_spk,
err |= transport_pcm_init(&t->sco.pcm_spk,
is_ag ? BA_TRANSPORT_PCM_MODE_SINK : BA_TRANSPORT_PCM_MODE_SOURCE,
is_ag ? &t->thread_enc : &t->thread_dec,
true);

transport_pcm_init(&t->sco.pcm_mic,
err |= transport_pcm_init(&t->sco.pcm_mic,
is_ag ? BA_TRANSPORT_PCM_MODE_SOURCE : BA_TRANSPORT_PCM_MODE_SINK,
is_ag ? &t->thread_dec : &t->thread_enc,
false);

if (err != 0)
goto fail;

if ((errno = pthread_create(&t->thread_manager_thread_id,
NULL, PTHREAD_FUNC(transport_thread_manager), t)) != 0) {
t->thread_manager_thread_id = config.main_thread;
goto fail;
}

t->acquire = transport_acquire_bt_sco;
t->release = transport_release_bt_sco;

Expand Down
1 change: 1 addition & 0 deletions test/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ test_ba_SOURCES = \
../src/audio.c \
../src/ba-adapter.c \
../src/ba-device.c \
../src/ba-transport.c \
../src/ba-transport-pcm.c \
../src/bluealsa-config.c \
../src/codec-sbc.c \
Expand Down
9 changes: 5 additions & 4 deletions test/test-ba.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
#include "shared/a2dp-codecs.h"
#include "shared/log.h"

#include "../src/ba-transport.c"
#include "inc/check.inc"

#define TEST_BLUEALSA_STORAGE_DIR "/tmp/bluealsa-test-ba-storage"
Expand Down Expand Up @@ -130,13 +129,14 @@ CK_START_TEST(test_ba_transport) {
ck_assert_ptr_ne(a = ba_adapter_new(0), NULL);
ck_assert_ptr_ne(d = ba_device_new(a, &addr), NULL);

ck_assert_ptr_ne(t = transport_new(d, "/owner", "/path"), NULL);
ck_assert_ptr_ne(t = ba_transport_new_sco(d,
BA_TRANSPORT_PROFILE_HFP_AG, "/owner", "/path", -1), NULL);

ba_adapter_unref(a);
ba_device_unref(d);

ck_assert_ptr_eq(t->d, d);
ck_assert_int_eq(t->profile, BA_TRANSPORT_PROFILE_NONE);
ck_assert_int_eq(t->profile, BA_TRANSPORT_PROFILE_HFP_AG);
ck_assert_str_eq(t->bluez_dbus_owner, "/owner");
ck_assert_str_eq(t->bluez_dbus_path, "/path");

Expand Down Expand Up @@ -328,7 +328,8 @@ CK_START_TEST(test_cascade_free) {

ck_assert_ptr_ne(a = ba_adapter_new(0), NULL);
ck_assert_ptr_ne(d = ba_device_new(a, &addr), NULL);
ck_assert_ptr_ne(t = transport_new(d, "/owner", "/path"), NULL);
ck_assert_ptr_ne(t = ba_transport_new_sco(d,
BA_TRANSPORT_PROFILE_HFP_AG, "/owner", "/path", -1), NULL);

t->bt_fd = 0; /* release() is called for acquired transport only */
t->release = test_cascade_free_transport_unref;
Expand Down

0 comments on commit f9e91f0

Please sign in to comment.