Skip to content

Commit

Permalink
sfos: bluez5: Handle deferred acquire a bit better on ofono backend.
Browse files Browse the repository at this point in the history
  • Loading branch information
jusa committed Mar 22, 2019
1 parent 9b8ba28 commit d2694ec
Showing 1 changed file with 25 additions and 6 deletions.
31 changes: 25 additions & 6 deletions src/modules/bluetooth/backend-ofono.c
Expand Up @@ -59,13 +59,19 @@
" </interface>" \
"</node>"

enum hf_audio_card_state {
HF_AUDIO_CARD_DISCONNECTED,
HF_AUDIO_CARD_CONNECTING,
HF_AUDIO_CARD_CONNECTED,
};

struct hf_audio_card {
pa_bluetooth_backend *backend;
char *path;
char *remote_address;
char *local_address;

bool connecting;
enum hf_audio_card_state state;
int fd;
uint8_t codec;

Expand Down Expand Up @@ -160,25 +166,30 @@ static int hf_audio_agent_transport_acquire(pa_bluetooth_transport *t, bool opti
DBusMessage *m, *r;
DBusError derr;

if (card->connecting)
if (card->state == HF_AUDIO_CARD_CONNECTING)
return -EAGAIN;

card->connecting = true;
card->state = HF_AUDIO_CARD_CONNECTING;

dbus_error_init(&derr);
pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.ofono.HandsfreeAudioCard", "Connect"));
r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(card->backend->connection), m, -1, &derr);
dbus_message_unref(m);
m = NULL;

if (!r)
if (!r) {
pa_log_debug("transport acquire error: %s:%s",derr.name, derr.message);
card->state = HF_AUDIO_CARD_DISCONNECTED;
dbus_error_free(&derr);
return -1;
}

dbus_message_unref(r);
r = NULL;

if (card->connecting)
if (card->state == HF_AUDIO_CARD_CONNECTING) {
return -EAGAIN;
}
}

/* The correct block size should take into account the SCO MTU from
Expand All @@ -196,9 +207,12 @@ static int hf_audio_agent_transport_acquire(pa_bluetooth_transport *t, bool opti
err = socket_accept(card->fd);
if (err < 0) {
pa_log_error("Deferred setup failed on fd %d: %s", card->fd, pa_cstrerror(-err));
card->state = HF_AUDIO_CARD_DISCONNECTED;
return -1;
}

card->state = HF_AUDIO_CARD_CONNECTED;

return card->fd;
}

Expand Down Expand Up @@ -547,16 +561,21 @@ static DBusMessage *hf_audio_agent_new_connection(DBusConnection *c, DBusMessage

card = pa_hashmap_get(backend->cards, path);

card->connecting = false;
if (card && card->state == HF_AUDIO_CARD_DISCONNECTED)
pa_log_debug("oFono initiated connection");

if (!card || codec != HFP_AUDIO_CODEC_CVSD || card->fd >= 0) {
pa_log_warn("New audio connection invalid arguments (path=%s fd=%d, codec=%d)", path, fd, codec);
pa_assert_se(r = dbus_message_new_error(m, "org.ofono.Error.InvalidArguments", "Invalid arguments in method call"));
shutdown(fd, SHUT_RDWR);
close(fd);
if (card)
card->state = HF_AUDIO_CARD_DISCONNECTED;
return r;
}

card->state = HF_AUDIO_CARD_CONNECTED;

pa_log_debug("New audio connection on card %s (fd=%d, codec=%d)", path, fd, codec);

card->fd = fd;
Expand Down

0 comments on commit d2694ec

Please sign in to comment.