static void send_command(void) { avdtp_state_t state = avdtp_sep_get_state(local_sep); switch (command) { case CMD_GET_CONF: avdtp_get_configuration(avdtp, avdtp_stream); break; case CMD_OPEN: if (state == AVDTP_STATE_CONFIGURED) avdtp_open(avdtp, avdtp_stream); break; case CMD_START: if (state == AVDTP_STATE_OPEN) avdtp_start(avdtp, avdtp_stream); break; case CMD_SUSPEND: if (state == AVDTP_STATE_STREAMING) avdtp_suspend(avdtp , avdtp_stream); break; case CMD_CLOSE: if (state == AVDTP_STATE_STREAMING) avdtp_close(avdtp, avdtp_stream, FALSE); break; case CMD_ABORT: avdtp_abort(avdtp , avdtp_stream); break; case CMD_DELAY: avdtp_delay_report(avdtp , avdtp_stream , 250); break; default: break; } }
static void handle_delay_report_req(struct unix_client *client, struct bt_delay_report_req *req) { char buf[BT_SUGGESTED_BUFFER_SIZE]; struct bt_set_configuration_rsp *rsp = (void *) buf; struct a2dp_data *a2dp; int err; if (!client->dev) { err = -ENODEV; goto failed; } switch (client->type) { case TYPE_HEADSET: case TYPE_GATEWAY: err = -EINVAL; goto failed; case TYPE_SOURCE: case TYPE_SINK: a2dp = &client->d.a2dp; if (a2dp->session && a2dp->stream) { err = avdtp_delay_report(a2dp->session, a2dp->stream, req->delay); if (err < 0) goto failed; } else { err = -EINVAL; goto failed; } break; default: error("No known services for device"); err = -EINVAL; goto failed; } memset(buf, 0, sizeof(buf)); rsp->h.type = BT_RESPONSE; rsp->h.name = BT_DELAY_REPORT; rsp->h.length = sizeof(*rsp); unix_ipc_sendmsg(client, &rsp->h); return; failed: unix_ipc_error(client, BT_DELAY_REPORT, -err); }