diff options
-rw-r--r-- | audio/a2dp.c | 91 | ||||
-rw-r--r-- | audio/a2dp.h | 2 | ||||
-rw-r--r-- | audio/audio.conf | 3 | ||||
-rw-r--r-- | audio/avdtp.c | 2 | ||||
-rw-r--r-- | audio/manager.c | 28 |
5 files changed, 90 insertions, 36 deletions
diff --git a/audio/a2dp.c b/audio/a2dp.c index 01738118..fa5ff2bf 100644 --- a/audio/a2dp.c +++ b/audio/a2dp.c @@ -969,7 +969,7 @@ static int a2dp_source_record(sdp_buf_t *buf) static int a2dp_sink_record(sdp_buf_t *buf) { - return 0; + return -1; } static struct a2dp_sep *a2dp_add_sep(DBusConnection *conn, uint8_t type, @@ -1008,6 +1008,7 @@ static struct a2dp_sep *a2dp_add_sep(DBusConnection *conn, uint8_t type, if (*record_id != 0) goto add; + memset(&buf, 0, sizeof(buf)); if (create_record(&buf) < 0) { error("Unable to allocate new service record"); avdtp_unregister_sep(sep->sep); @@ -1030,25 +1031,95 @@ add: return sep; } -int a2dp_init(DBusConnection *conn, int sources, int sinks) +int a2dp_init(DBusConnection *conn, GKeyFile *config) { + int sbc_srcs = 1, sbc_sinks = 0; + int mpeg12_srcs = 0, mpeg12_sinks = 0; + gboolean src = TRUE, sink = TRUE; + char *str; + GError *err = NULL; int i; - if (!sources && !sinks) - return 0; + if (!config) + goto proceed; + + str = g_key_file_get_string(config, "General", "Disable", &err); + + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else { + if (strstr(str, "Sink")) + sink = FALSE; + if (strstr(str, "Source")) + src = FALSE; + g_free(str); + } + str = g_key_file_get_string(config, "A2DP", "SBCSources", &err); + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else { + sbc_srcs = atoi(str); + g_free(str); + } + + str = g_key_file_get_string(config, "A2DP", "MPEG12Sources", &err); + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else { + mpeg12_srcs = atoi(str); + g_free(str); + } + + str = g_key_file_get_string(config, "A2DP", "SBCSinks", &err); + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else { + sbc_sinks = atoi(str); + g_free(str); + } + + str = g_key_file_get_string(config, "A2DP", "MPEG12Sinks", &err); + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else { + mpeg12_sinks = atoi(str); + g_free(str); + } + +proceed: connection = dbus_connection_ref(conn); avdtp_init(); - for (i = 0; i < sources; i++) { - a2dp_add_sep(conn, AVDTP_SEP_TYPE_SOURCE, A2DP_CODEC_SBC); - a2dp_add_sep(conn, AVDTP_SEP_TYPE_SOURCE, A2DP_CODEC_MPEG12); + if (src) { + for (i = 0; i < sbc_srcs; i++) + a2dp_add_sep(conn, AVDTP_SEP_TYPE_SOURCE, + A2DP_CODEC_SBC); + + for (i = 0; i < mpeg12_srcs; i++) + a2dp_add_sep(conn, AVDTP_SEP_TYPE_SOURCE, + A2DP_CODEC_MPEG12); } - for (i = 0; i < sinks; i++) { - a2dp_add_sep(conn, AVDTP_SEP_TYPE_SINK, A2DP_CODEC_SBC); - a2dp_add_sep(conn, AVDTP_SEP_TYPE_SINK, A2DP_CODEC_MPEG12); + if (sink) { + for (i = 0; i < sbc_sinks; i++) + a2dp_add_sep(conn, AVDTP_SEP_TYPE_SINK, + A2DP_CODEC_SBC); + + for (i = 0; i < mpeg12_sinks; i++) + a2dp_add_sep(conn, AVDTP_SEP_TYPE_SINK, + A2DP_CODEC_MPEG12); } return 0; diff --git a/audio/a2dp.h b/audio/a2dp.h index 84301bad..a83b523a 100644 --- a/audio/a2dp.h +++ b/audio/a2dp.h @@ -129,7 +129,7 @@ typedef void (*a2dp_stream_cb_t) (struct avdtp *session, struct avdtp_error *err, void *user_data); -int a2dp_init(DBusConnection *conn, int sources, int sinks); +int a2dp_init(DBusConnection *conn, GKeyFile *config); void a2dp_exit(void); unsigned int a2dp_source_config(struct avdtp *session, a2dp_config_cb_t cb, diff --git a/audio/audio.conf b/audio/audio.conf index ae9742b8..0d733105 100644 --- a/audio/audio.conf +++ b/audio/audio.conf @@ -34,4 +34,5 @@ ExtendedErrorResultCodes=false # Just an example of potential config options for the other interfaces #[A2DP] -#SourceCount=2 +#SBCSources=1 +#MPEG12Sources=0 diff --git a/audio/avdtp.c b/audio/avdtp.c index 97868a07..55addb0b 100644 --- a/audio/avdtp.c +++ b/audio/avdtp.c @@ -2717,6 +2717,8 @@ struct avdtp_local_sep *avdtp_register_sep(uint8_t type, uint8_t media_type, sep->cfm = cfm; sep->user_data = user_data; + debug("SEP %p registered: type:%d codec:%d seid:%d", sep, + sep->info.type, sep->codec, sep->info.seid); local_seps = g_slist_append(local_seps, sep); return sep; diff --git a/audio/manager.c b/audio/manager.c index 931af069..1c8970d1 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -1634,7 +1634,6 @@ static void server_exit(void) int audio_init(DBusConnection *conn, GKeyFile *config) { - int sinks, sources; char *str; GError *err = NULL; @@ -1693,29 +1692,10 @@ int audio_init(DBusConnection *conn, GKeyFile *config) goto failed; } - if (enabled.sink) { - if (config) { - str = g_key_file_get_string(config, "A2DP", - "SourceCount", &err); - if (err) { - debug("audio.conf: %s", err->message); - g_error_free(err); - err = NULL; - } else { - sources = atoi(str); - g_free(str); - } - } - } else - sources = 0; - - if (enabled.source) - sinks = 1; - else - sinks = 0; - - if (a2dp_init(conn, sources, sinks) < 0) - goto failed; + if (enabled.source || enabled.sink) { + if (a2dp_init(conn, config) < 0) + goto failed; + } if (enabled.control && avrcp_init(conn) < 0) goto failed; |