diff options
Diffstat (limited to 'audio')
-rw-r--r-- | audio/pcm_bluetooth.c | 62 | ||||
-rw-r--r-- | audio/unix.c | 47 |
2 files changed, 85 insertions, 24 deletions
diff --git a/audio/pcm_bluetooth.c b/audio/pcm_bluetooth.c index bc962012..7cf802b8 100644 --- a/audio/pcm_bluetooth.c +++ b/audio/pcm_bluetooth.c @@ -215,6 +215,62 @@ iter_sleep: } } +static int bluetooth_state_init(struct ipc_packet *pkt, int newstate) +{ + struct ipc_data_state *state = (void *) pkt->data; + + pkt->length = sizeof(*state); + pkt->type = PKT_TYPE_STATE_REQ; + pkt->error = PKT_ERROR_NONE; + state->state = newstate; + + return 0; +} + +static int bluetooth_state(struct bluetooth_data *data, int newstate) +{ + char buf[IPC_MTU]; + struct ipc_packet *pkt = (void *) buf; + struct ipc_data_state *state = (void *) pkt->data; + int ret, total; + + memset(buf, 0, sizeof(buf)); + + ret = bluetooth_state_init(pkt, newstate); + if (ret < 0) + return -ret; + + ret = send(data->sock, pkt, sizeof(*pkt) + pkt->length, 0); + if (ret < 0) + return -errno; + else if (ret == 0) + return -EIO; + + DBG("OK - %d bytes sent. Waiting for response...", ret); + + memset(buf, 0, sizeof(buf)); + + ret = recv(data->sock, buf, sizeof(*pkt) + sizeof(*state), 0); + if (ret < 0) + return -errno; + else if (ret == 0) + return -EIO; + + total = ret; + + if (pkt->type != PKT_TYPE_STATE_RSP) { + SNDERR("Unexpected packet type %d received", pkt->type); + return -EINVAL; + } + + if (pkt->error != PKT_ERROR_NONE) { + SNDERR("Error %d while configuring device", pkt->error); + return -pkt->error; + } + + return 0; +} + static int bluetooth_playback_start(snd_pcm_ioplug_t *io) { struct bluetooth_data *data = io->private_data; @@ -222,6 +278,9 @@ static int bluetooth_playback_start(snd_pcm_ioplug_t *io) DBG("%p", io); +#if 0 + bluetooth_state(data, STATE_STREAMING); +#endif data->stopped = 0; if (data->hw_thread) @@ -238,6 +297,9 @@ static int bluetooth_playback_stop(snd_pcm_ioplug_t *io) DBG("%p", io); +#if 0 + bluetooth_state(data, STATE_CONNECTED); +#endif data->stopped = 1; return 0; diff --git a/audio/unix.c b/audio/unix.c index c39c80c4..accf6efb 100644 --- a/audio/unix.c +++ b/audio/unix.c @@ -637,6 +637,27 @@ static void ctl_event(struct unix_client *client, { } +static int reply_state(int sock, struct ipc_packet *pkt) +{ + struct ipc_data_state *state = (struct ipc_data_state *) pkt->data; + int len; + + info("status=%u", state->state); + + pkt->type = PKT_TYPE_STATE_RSP; + pkt->length = sizeof(struct ipc_data_state); + pkt->error = PKT_ERROR_NONE; + + len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state); + len = send(sock, pkt, len, 0); + if (len < 0) + error("Error %s(%d)", strerror(errno), errno); + + debug("%d bytes sent", len); + + return 0; +} + static void state_event(struct unix_client *client, struct ipc_packet *pkt, int len) { @@ -648,9 +669,9 @@ static void state_event(struct unix_client *client, device_set_state(dev, state->state); else state->state = device_get_state(dev); - - unix_send_state(client->sock, pkt); #endif + + reply_state(client->sock, pkt); } static gboolean client_cb(GIOChannel *chan, GIOCondition cond, gpointer data) @@ -812,25 +833,3 @@ void unix_exit(void) unix_sock = -1; } -#if 0 -static int unix_send_state(int sock, struct ipc_packet *pkt) -{ - struct ipc_data_state *state = (struct ipc_data_state *) pkt->data; - int len; - - info("status=%u", state->state); - - pkt->type = PKT_TYPE_STATE_RSP; - pkt->length = sizeof(struct ipc_data_state); - pkt->error = PKT_ERROR_NONE; - - len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state); - len = send(sock, pkt, len, 0); - if (len < 0) - error("Error %s(%d)", strerror(errno), errno); - - debug("%d bytes sent", len); - - return 0; -} -#endif |