diff --git a/android/avdtptest.c b/android/avdtptest.c
index c8f7340..58168be 100644
--- a/android/avdtptest.c
+++ b/android/avdtptest.c
static bool fragment = false;
+static enum {
+ CMD_GET_CONF,
+ CMD_OPEN,
+ CMD_START,
+ CMD_SUSPEND,
+ CMD_CLOSE,
+ CMD_ABORT,
+ CMD_DELAY,
+ CMD_NONE,
+} command = CMD_NONE;
+
static const char sbc_codec[] = {0x00, 0x00, 0x11, 0x15, 0x02, 0x40};
static const char sbc_media_frame[] = {
0x00, 0x60, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x3b, 0x3b, 0xaf, 0xc6, 0xd4, 0x37, 0x68, 0x94, 0x0a, 0xbb
};
+static void parse_command(const char *cmd)
+{
+ if (!strncmp(cmd, "getconf", sizeof("getconf"))) {
+ command = CMD_GET_CONF;
+ } else if (!strncmp(cmd, "open", sizeof("open"))) {
+ command = CMD_OPEN;
+ } else if (!strncmp(cmd, "start", sizeof("start"))) {
+ command = CMD_START;
+ } else if (!strncmp(cmd, "suspend", sizeof("suspend"))) {
+ command = CMD_SUSPEND;
+ } else if (!strncmp(cmd, "close", sizeof("close"))) {
+ command = CMD_CLOSE;
+ } else if (!strncmp(cmd, "abort", sizeof("abort"))) {
+ command = CMD_ABORT;
+ } else if (!strncmp(cmd, "delay", sizeof("delay"))) {
+ command = CMD_DELAY;
+ } else {
+ printf("Unknown command '%s'\n", cmd);
+ printf("(getconf open start suspend close abort delay)\n");
+ exit(1);
+ }
+}
+
+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 gboolean media_writer(gpointer user_data)
{
uint16_t omtu;
else
to_write = sizeof(sbc_media_frame);
- if (write(fd, sbc_media_frame, to_write))
+ if (write(fd, sbc_media_frame, to_write) < 0)
return TRUE;
+ send_command();
+
return TRUE;
}
decode = true;
}
+ send_command();
+
return TRUE;
}
g_io_channel_set_close_on_unref(chan, FALSE);
+ send_command();
+
return;
}
cb(session, stream, NULL);
+ send_command();
+
return TRUE;
}
if (reject)
return FALSE;
+ send_command();
+
return TRUE;
}
else
start_media_recorder();
+ send_command();
+
return TRUE;
}
"\t-l listen\n"
"\t-r reject commands\n"
"\t-f fragment\n"
- "-t-p configure stream\n");
+ "\t-p configure stream\n"
+ "\t-s <command> send command\n");
}
static struct option main_options[] = {
{ "reject", 0, 0, 'r' },
{ "fragment", 0, 0, 'f' },
{ "preconf", 0, 0, 'p' },
+ { "send", 1, 0, 's' },
{ 0, 0, 0, 0 }
};
exit(1);
}
- while ((opt = getopt_long(argc, argv, "d:hi:c:lrfp",
+ while ((opt = getopt_long(argc, argv, "d:hi:s:c:lrfp",
main_options, NULL)) != EOF) {
switch (opt) {
case 'i':
case 'p':
preconf = true;
break;
+ case 's':
+ parse_command(optarg);
+ break;
case 'h':
default:
usage();