diff options
-rw-r--r-- | audio/Makefile.am | 4 | ||||
-rw-r--r-- | audio/audio.conf | 27 | ||||
-rw-r--r-- | audio/headset.c | 3 | ||||
-rw-r--r-- | audio/headset.h | 3 | ||||
-rw-r--r-- | audio/main.c | 57 |
5 files changed, 89 insertions, 5 deletions
diff --git a/audio/Makefile.am b/audio/Makefile.am index 63448a86..2285ed7f 100644 --- a/audio/Makefile.am +++ b/audio/Makefile.am @@ -3,7 +3,7 @@ if AUDIOSERVICE if CONFIGFILES confdir = $(sysconfdir)/bluetooth -conf_DATA = audio.service +conf_DATA = audio.service audio.conf endif servicedir = $(libdir)/bluetooth @@ -35,6 +35,6 @@ AM_CFLAGS = @BLUEZ_CFLAGS@ @DBUS_CFLAGS@ @GLIB_CFLAGS@ @ALSA_CFLAGS@ @SBC_CFLAGS INCLUDES = -I$(top_srcdir)/common -EXTRA_DIST = audio.service audio-api.txt asound.conf +EXTRA_DIST = audio.service audio.conf audio-api.txt asound.conf MAINTAINERCLEANFILES = Makefile.in diff --git a/audio/audio.conf b/audio/audio.conf new file mode 100644 index 00000000..f88668e4 --- /dev/null +++ b/audio/audio.conf @@ -0,0 +1,27 @@ +# Configuration file for the audio service + +# This section contains options which are not specific to any +# particular interface +[General] + +# If we want to disable support for specific services +# Defaults to supporting all implemented services +#Disable=Control,Source + +# SCO routing. Either PCM or HCI (in which case audio is routed to/from ALSA) +# Defaults to HCI +SCORouting=PCM + +# Headset interface specific options (i.e. options which affect how the audio +# service interacts with remote headset devices) +[Headset] + +# Set to true to only support HSP +# Defaults to false +DisableHFP=true + +# Just an example of potential config options for the other interfaces +#[Sink] +#Codecs=SBC,MPEG12 +#SBCChannelMode=joint +#SBCBitpool=51 diff --git a/audio/headset.c b/audio/headset.c index d9e26459..45f989bc 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -1702,7 +1702,8 @@ gboolean headset_is_connected(headset_t *headset) return FALSE; } -int headset_server_init(DBusConnection *conn, gboolean no_hfp) +int headset_server_init(DBusConnection *conn, gboolean no_hfp, + gboolean sco_hci) { uint8_t chan = DEFAULT_HS_AG_CHANNEL; sdp_buf_t buf; diff --git a/audio/headset.h b/audio/headset.h index c02f36a3..0325e755 100644 --- a/audio/headset.h +++ b/audio/headset.h @@ -42,7 +42,8 @@ void headset_update(headset_t *headset, sdp_record_t *record, uint16_t svc); gboolean headset_is_connected(headset_t *headset); -int headset_server_init(DBusConnection *conn, gboolean disable_hfp); +int headset_server_init(DBusConnection *conn, gboolean disable_hfp, + gboolean sco_hci); void headset_exit(void); diff --git a/audio/main.c b/audio/main.c index b0eb30c8..796af3b5 100644 --- a/audio/main.c +++ b/audio/main.c @@ -40,6 +40,10 @@ #include "manager.h" #include "headset.h" +/* Configuration settings */ +static gboolean disable_hfp = FALSE; +static gboolean sco_hci = TRUE; + static GMainLoop *main_loop = NULL; static void sig_term(int sig) @@ -47,6 +51,55 @@ static void sig_term(int sig) g_main_loop_quit(main_loop); } +void read_config(const char *file) +{ + GKeyFile *keyfile; + GError *err = NULL; + gboolean no_hfp; + char *sco_routing; + + keyfile = g_key_file_new(); + + if (!g_key_file_load_from_file(keyfile, file, 0, &err)) { + error("Parsing %s failed: %s", file, err->message); + g_error_free(err); + g_key_file_free(keyfile); + return; + } + + sco_routing = g_key_file_get_string(keyfile, "General", + "SCORouting", &err); + if (err) { + debug("%s: %s", file, err->message); + g_error_free(err); + err = NULL; + } else { + if (strcmp(sco_routing, "PCM") == 0) + sco_hci = FALSE; + else if (strcmp(sco_routing, "HCI") == 0) + sco_hci = TRUE; + else + error("Invalid Headset Routing value: %s", + sco_routing); + g_free(sco_routing); + } + + no_hfp = g_key_file_get_boolean(keyfile, "Headset", + "DisableHFP", &err); + if (err) { + debug("%s: %s", file, err->message); + g_error_free(err); + err = NULL; + } else + disable_hfp = no_hfp; + + debug("Config options: DisableHFP=%s, SCORouting=%s", + disable_hfp ? "true" : "false", + sco_hci ? "HCI" : "PCM"); + + g_key_file_free(keyfile); +} + int main(int argc, char *argv[]) { DBusConnection *conn; @@ -66,6 +119,8 @@ int main(int argc, char *argv[]) enable_debug(); + read_config(CONFIGDIR "/audio.conf"); + main_loop = g_main_loop_new(NULL, FALSE); conn = dbus_bus_system_setup_with_main_loop(NULL, NULL, NULL); @@ -84,7 +139,7 @@ int main(int argc, char *argv[]) exit(1); } - if (headset_server_init(conn, TRUE) < 0) { + if (headset_server_init(conn, disable_hfp, sco_hci) < 0) { error("Headset initialization failed!"); exit(1); } |