linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Handset voice dial signalling patch
@ 2010-01-13  7:36 Peter Zotov
  2010-01-13  8:32 ` Johan Hedberg
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Zotov @ 2010-01-13  7:36 UTC (permalink / raw)
  To: linux-bluetooth

[-- Attachment #1: Type: text/plain, Size: 564 bytes --]

Hello.

I wrote a patch (attached) that makes dummy telephony interface send a 
DBus signal (through org.bluez.TelephonyTest interface) every time a 
voice dialing is started. It may be useful when you have only this 
button on a handset (e.g. SonyEricsson HBH602 owned by me) and want to 
answer some VoIP client call with it.

Patch works both with BlueZ 4.60 and 4.57-1 built with dpkg-buildpackage.

I have an example Skype client that answers calls using this feature and 
Skype DBus API, and can post it if someone is interested in.

-- 
   WBR, Peter Zotov

[-- Attachment #2: bluez-4.60-voice_dial.patch --]
[-- Type: text/x-patch, Size: 4164 bytes --]

diff -ur bluez-4.60.old/audio/headset.c bluez-4.60.new/audio/headset.c
--- bluez-4.60.old/audio/headset.c	2010-01-09 23:52:17.000000000 +0300
+++ bluez-4.60.new/audio/headset.c	2010-01-13 06:22:15.000000000 +0300
@@ -157,6 +157,8 @@
 	gboolean inband_ring;
 	gboolean nrec;
 	gboolean nrec_req;
+	gboolean voice_dial;
+	gboolean voice_dial_req;
 
 	headset_state_t state;
 	struct pending_connect *pending;
@@ -1084,6 +1086,17 @@
 	return telephony_generic_rsp(telephony_device, err);
 }
 
+int telephony_voice_dial_rsp(void *telephony_device, cme_error_t err)
+{
+	struct audio_device *device = telephony_device;
+	struct headset *hs = device->headset;
+
+	if (err == CME_ERROR_NONE)
+		hs->voice_dial = hs->voice_dial_req;
+
+	return telephony_generic_rsp(telephony_device, err);
+}
+
 int telephony_operator_selection_ind(int mode, const char *oper)
 {
 	if (!active_devices)
@@ -1132,6 +1145,23 @@
 	return 0;
 }
 
+static int voice_dial(struct audio_device *device, const char *buf)
+{
+	struct headset* hs = device->headset;
+
+	if (strlen(buf) < 9)
+		return -EINVAL;
+
+	if (buf[8] == '0')
+		hs->voice_dial_req = FALSE;
+	else
+		hs->voice_dial_req = TRUE;
+
+	telephony_voice_dial_req(device, hs->voice_dial_req);
+
+	return 0;
+}
+
 static struct event event_callbacks[] = {
 	{ "ATA", answer_call },
 	{ "ATD", dial_number },
@@ -1152,6 +1182,7 @@
 	{ "AT+CCWA", call_waiting_notify },
 	{ "AT+COPS", operator_selection },
 	{ "AT+NREC", nr_and_ec },
+	{ "AT+BVRA", voice_dial },
 	{ 0 }
 };
 
diff -ur bluez-4.60.old/audio/telephony-dummy.c bluez-4.60.new/audio/telephony-dummy.c
--- bluez-4.60.old/audio/telephony-dummy.c	2010-01-09 23:52:17.000000000 +0300
+++ bluez-4.60.new/audio/telephony-dummy.c	2010-01-13 06:17:44.000000000 +0300
@@ -36,6 +36,8 @@
 #include "logging.h"
 #include "telephony.h"
 
+static DBusConnection *connection = NULL;
+
 static const char *chld_str = "0,1,1x,2,2x,3,4";
 static char *subscriber_number = NULL;
 static char *active_call_number = NULL;
@@ -205,6 +207,18 @@
 	telephony_nr_and_ec_rsp(telephony_device, CME_ERROR_NONE);
 }
 
+void telephony_voice_dial_req(void *telephony_device, gboolean enable)
+{
+	debug("telephony-dummy: got %s voice dial request",
+			enable ? "enable" : "disable");
+
+	g_dbus_emit_signal(connection, "/org/bluez/test",
+			"org.bluez.TelephonyTest", "VoiceDial",
+			DBUS_TYPE_INVALID);
+
+	telephony_voice_dial_rsp(telephony_device, CME_ERROR_NOT_SUPPORTED);
+}
+
 void telephony_key_press_req(void *telephony_device, const char *keys)
 {
 	debug("telephony-dummy: got key press request for %s", keys);
@@ -389,7 +403,10 @@
 	{ }
 };
 
-static DBusConnection *connection = NULL;
+static GDBusSignalTable dummy_signals[] = {
+	{ "VoiceDial",	"" },
+	{ }
+};
 
 int telephony_init(void)
 {
@@ -401,7 +418,7 @@
 
 	g_dbus_register_interface(connection, "/org/bluez/test",
 					"org.bluez.TelephonyTest",
-					dummy_methods, NULL,
+					dummy_methods, dummy_signals,
 					NULL, NULL, NULL);
 
 	telephony_ready_ind(features, dummy_indicators, response_and_hold,
diff -ur bluez-4.60.old/audio/telephony.h bluez-4.60.new/audio/telephony.h
--- bluez-4.60.old/audio/telephony.h	2010-01-09 23:52:17.000000000 +0300
+++ bluez-4.60.new/audio/telephony.h	2010-01-13 05:48:54.000000000 +0300
@@ -155,6 +155,7 @@
 void telephony_operator_selection_req(void *telephony_device);
 void telephony_call_hold_req(void *telephony_device, const char *cmd);
 void telephony_nr_and_ec_req(void *telephony_device, gboolean enable);
+void telephony_voice_dial_req(void *telephony_device, gboolean enable);
 void telephony_key_press_req(void *telephony_device, const char *keys);
 
 /* AG responses to HF requests. These are implemented by headset.c */
@@ -170,6 +171,7 @@
 int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err);
 int telephony_call_hold_rsp(void *telephony_device, cme_error_t err);
 int telephony_nr_and_ec_rsp(void *telephony_device, cme_error_t err);
+int telephony_voice_dial_rsp(void *telephony_device, cme_error_t err);
 int telephony_key_press_rsp(void *telephony_device, cme_error_t err);
 
 /* Event indications by AG. These are implemented by headset.c */

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-01-15  6:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-13  7:36 Handset voice dial signalling patch Peter Zotov
2010-01-13  8:32 ` Johan Hedberg
2010-01-13  9:03   ` Peter Zotov
2010-01-13  9:26     ` Johan Hedberg
2010-01-13 21:26       ` Peter Zotov
2010-01-14 14:41         ` Johan Hedberg
2010-01-14 21:26           ` Peter Zotov
2010-01-15  6:57             ` Johan Hedberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).