Index: audio/headset.c =================================================================== RCS file: /cvsroot/bluez/utils/audio/headset.c,v retrieving revision 1.156 diff -u -5 -p -r1.156 headset.c --- audio/headset.c 9 Jan 2008 12:36:58 -0000 1.156 +++ audio/headset.c 10 Jan 2008 15:04:17 -0000 @@ -1447,10 +1453,67 @@ static DBusHandlerResult hf_setup_call(D send_message_and_unref(conn, reply); return DBUS_HANDLER_RESULT_HANDLED; } +static DBusHandlerResult hf_set_inband(DBusConnection *conn, + DBusMessage *msg, + void *data) +{ + struct device *device = data; + struct headset *hs = device->headset; + DBusMessage *reply; + DBusError derr; + gboolean *active; + int err; + + if (!hs->hfp_active) + return error_not_supported(device->conn, msg); + + if (hs->state < HEADSET_STATE_CONNECTED) + return error_not_connected(conn, msg); + + dbus_error_init(&derr); + dbus_message_get_args(msg, &derr, DBUS_TYPE_BOOLEAN, &active, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&derr)) { + error_invalid_arguments(conn, msg, derr.message); + dbus_error_free(&derr); + return DBUS_HANDLER_RESULT_HANDLED; + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + if (active && !(ag_features & AG_FEATURE_INBAND_RINGTONE)) { + ag_features |= AG_FEATURE_INBAND_RINGTONE; + err = headset_send(hs, "\r\n+BSIR:1\r\n"); + } + + if (!active && (ag_features & AG_FEATURE_INBAND_RINGTONE)) { + ag_features &= ~AG_FEATURE_INBAND_RINGTONE; + err = headset_send(hs, "\r\n+BSIR:0\r\n"); + } + + if (err < 0) { + dbus_message_unref(reply); + return error_failed(conn, msg, "Unable to send to headset"); + } + + dbus_connection_emit_signal(conn, device->path, + AUDIO_HEADSET_INTERFACE, + "InBandSettingChanged", + DBUS_TYPE_BOOLEAN, &active, + DBUS_TYPE_INVALID); + + send_message_and_unref(conn, reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + static DBusMethodVTable headset_methods[] = { { "Connect", hs_connect, "", "" }, { "Disconnect", hs_disconnect, "", "" }, { "IsConnected", hs_is_connected, "", "b" }, { "IndicateCall", hs_ring, "", "" }, @@ -1461,10 +1524,11 @@ static DBusMethodVTable headset_methods[ { "GetSpeakerGain", hs_get_speaker_gain, "", "q" }, { "GetMicrophoneGain", hs_get_mic_gain, "", "q" }, { "SetSpeakerGain", hs_set_speaker_gain, "q", "" }, { "SetMicrophoneGain", hs_set_mic_gain, "q", "" }, { "SetupCall", hf_setup_call, "s", "" }, + { "SetInbandRingtone", hf_set_inband, "b", "" }, { NULL, NULL, NULL, NULL } }; static DBusSignalVTable headset_signals[] = { { "Connected", "" }, @@ -1473,10 +1537,11 @@ static DBusSignalVTable headset_signals[ { "Stopped", "" }, { "Playing", "" }, { "SpeakerGainChanged", "q" }, { "MicrophoneGainChanged", "q" }, { "CallTerminated", "" }, + { "InBandSettingChanged", "b" }, { NULL, NULL } }; static void headset_set_channel(struct headset *headset, sdp_record_t *record) {