static void close_cfm(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, struct avdtp_error *err, void *user_data) { struct a2dp_sep *a2dp_sep = user_data; struct a2dp_setup *setup; if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK) DBG("Sink %p: Close_Cfm", sep); else DBG("Source %p: Close_Cfm", sep); setup = find_setup_by_session(session); if (!setup) return; if (err) { setup->stream = NULL; setup->err = err; finalize_config(setup); return; } if (setup->reconfigure) g_timeout_add(RECONFIGURE_TIMEOUT, a2dp_reconfigure, setup); }
static void reconf_cfm(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, struct avdtp_error *err, void *user_data) { struct a2dp_sep *a2dp_sep = user_data; struct a2dp_setup *setup; if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK) debug("Sink %p: ReConfigure_Cfm", sep); else debug("Source %p: ReConfigure_Cfm", sep); setup = find_setup_by_session(session); if (!setup) return; if (setup->canceled) { if (!err) avdtp_close(session, stream); setup_unref(setup); return; } if (err) { setup->stream = NULL; setup->err = err; } finalize_config(setup); }
static void open_cfm(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, struct avdtp_error *err, void *user_data) { struct a2dp_sep *a2dp_sep = user_data; struct a2dp_setup *setup; if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK) DBG("Sink %p: Open_Cfm", sep); else DBG("Source %p: Open_Cfm", sep); setup = find_setup_by_session(session); if (!setup) return; if (setup->reconfigure) setup->reconfigure = FALSE; if (err) { setup->stream = NULL; setup->err = err; } finalize_config(setup); }
static gboolean auto_config(gpointer data) { struct a2dp_setup *setup = data; /* Check if configuration was aborted */ if (setup->sep->stream == NULL) return FALSE; if (setup->err != NULL) goto done; avdtp_stream_add_cb(setup->session, setup->stream, stream_state_changed, setup->sep); if (setup->sep->type == AVDTP_SEP_TYPE_SOURCE) sink_new_stream(setup->dev, setup->session, setup->stream); else source_new_stream(setup->dev, setup->session, setup->stream); done: if (setup->setconf_cb) setup->setconf_cb(setup->session, setup->stream, setup->err); finalize_config(setup); if (setup->err) { g_free(setup->err); setup->err = NULL; } setup_unref(setup); return FALSE; }
static gboolean finalize_config_errno(struct a2dp_setup *s, int err) { struct avdtp_error avdtp_err; avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, -err); s->err = err ? &avdtp_err : NULL; return finalize_config(s); }
/* The parser calls this callback after it finishes parsing all * --foo=bar options inside the script. At this point we know all * command line and in-script options, and can finalize our * configuration. Notably, this allows us to know when we parse a TCP * packet line in the script whether we should create an IPv4 or IPv6 * packet. */ void parse_and_finalize_config(struct invocation *invocation) { DEBUGP("parse_and_finalize_config\n"); /* Parse options in script */ parse_script_options(invocation->config, invocation->script->option_list); /* Command line options overwrite options in script */ parse_command_line_options(invocation->argc, invocation->argv, invocation->config); /* Now take care of the last details */ finalize_config(invocation->config); }
static void setconf_cfm(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, struct avdtp_error *err, void *user_data) { struct a2dp_sep *a2dp_sep = user_data; struct a2dp_setup *setup; struct audio_device *dev; int ret; if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK) DBG("Sink %p: Set_Configuration_Cfm", sep); else DBG("Source %p: Set_Configuration_Cfm", sep); setup = find_setup_by_session(session); if (err) { if (setup) { setup->err = err; finalize_config(setup); } return; } avdtp_stream_add_cb(session, stream, stream_state_changed, a2dp_sep); a2dp_sep->stream = stream; if (!setup) return; dev = a2dp_get_dev(session); /* Notify D-Bus interface of the new stream */ if (a2dp_sep->type == AVDTP_SEP_TYPE_SOURCE) sink_new_stream(dev, session, setup->stream); else source_new_stream(dev, session, setup->stream); ret = avdtp_open(session, stream); if (ret < 0) { error("Error on avdtp_open %s (%d)", strerror(-ret), -ret); setup->stream = NULL; finalize_config_errno(setup, ret); } }
static gboolean auto_config(gpointer data) { struct a2dp_setup *setup = data; struct btd_device *dev = avdtp_get_device(setup->session); struct btd_service *service; /* Check if configuration was aborted */ if (setup->sep->stream == NULL) return FALSE; if (setup->err != NULL) goto done; avdtp_stream_add_cb(setup->session, setup->stream, stream_state_changed, setup->sep); if (setup->sep->type == AVDTP_SEP_TYPE_SOURCE) { service = btd_device_get_service(dev, A2DP_SINK_UUID); sink_new_stream(service, setup->session, setup->stream); } else { service = btd_device_get_service(dev, A2DP_SOURCE_UUID); source_new_stream(service, setup->session, setup->stream); } done: if (setup->setconf_cb) setup->setconf_cb(setup->session, setup->stream, setup->err); finalize_config(setup); if (setup->err) { g_free(setup->err); setup->err = NULL; } setup_unref(setup); return FALSE; }