ADHD: Add dBus message for microphone jack state.
Details
Adds code to generate a dbus message each time the microphone jack is
changed.
The message has a string and a boolean:
"microphone" : The name of the jack which is reporting
true : The headphones have been inserted.
false : The headphones have been removed.
Testing
On a Kaen:
dbus-monitor --system
Alter the state of the headphone switch.
The messages will be displayed, as follows:
signal sender=:1.20 -> dest=(null destination) serial=8 path=/gavd/jack; interface=gavd.jack.state; member=jack
string "microphone"
boolean false
signal sender=:1.20 -> dest=(null destination) serial=9 path=/gavd/jack; interface=gavd.jack.state; member=jack
string "microphone"
boolean true
BUG=chromium-os:19558
TEST=See above.
Change-Id: Idb25f1b92433aed2b721416c24e1fab1e2394d70
Signed-off-by: Taylor Hutt <thutt@chromium.org>
diff --git a/gavd/dbus_connection.c b/gavd/dbus_connection.c
index 4dbaa27..fa1e447 100644
--- a/gavd/dbus_connection.c
+++ b/gavd/dbus_connection.c
@@ -23,7 +23,7 @@
static const char *dbus_connection_name = "org.chromium.gavd";
-static void dbus_connection_jack_state(const char *jack, unsigned state)
+void dbus_connection_jack_state(const char *jack, unsigned state)
{
dbus_uint32_t serial = 0;
DBusMessage *msg;
@@ -61,16 +61,6 @@
}
-void dbus_connection_headphone_state(unsigned state)
-{
- dbus_connection_jack_state("headphone", state);
-}
-
-void dbus_connection_microphone_state(unsigned state)
-{
- dbus_connection_jack_state("microphone", state);
-}
-
static void initialize(void)
{
DBusError error;
diff --git a/gavd/dbus_connection.h b/gavd/dbus_connection.h
index 4abcf53..c9eaa99 100644
--- a/gavd/dbus_connection.h
+++ b/gavd/dbus_connection.h
@@ -2,17 +2,11 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
-#if !defined(_GAVD_DBUS_H_)
-#define _GAVD_DBUS_H__
+#if !defined(_DBUS_CONNECTION_H_)
+#define _DBUS_CONNECTION_H__
-/* state = 0 -> headphone unplugged
- * state = 1 -> headphone plugged
+/* state = 0 -> jack unplugged
+ * state = 1 -> jack plugged
*/
-void dbus_connection_headphone_state(unsigned state);
-
-/* state = 0 -> mircophone unplugged
- * state = 1 -> mircophone plugged
- */
-void dbus_connection_microphone_state(unsigned state);
-
+void dbus_connection_jack_state(const char *jack_name, unsigned state);
#endif
diff --git a/gavd/dbus_to_chrome_fifo.c b/gavd/dbus_to_chrome_fifo.c
index 7b96b7f..2191c89 100644
--- a/gavd/dbus_to_chrome_fifo.c
+++ b/gavd/dbus_to_chrome_fifo.c
@@ -20,8 +20,9 @@
#include "dbus_to_chrome_fifo.h"
typedef struct state_t {
- unsigned state; /* 0 -> Speaker enabled, headphone disabled.
- * 1 -> Speaker disabled, headphone enabled.
+ const char *jack; /* non-NULL jack name */
+ unsigned state; /* 0 -> jack unplugged.
+ * 1 -> jack plugged.
* other -> llegal.
*/
} state_t;
@@ -91,17 +92,19 @@
verbose_log(0, LOG_INFO, "%s: speaker: %s. headphone: %s", __FUNCTION__,
speaker, headphone);
- dbus_connection_headphone_state(state);
+ dbus_connection_jack_state(p->jack, state);
free(data);
});
-void dbus_to_chrome_fifo_internal_speaker_headphone_state(unsigned state)
+void dbus_to_chrome_fifo_internal_speaker_headphone_state(const char *jack,
+ unsigned state)
{
state_t *data = calloc((size_t)1, sizeof(state_t));
assert(state == 0 || state == 1);
if (data != NULL) {
data->state = state;
+ data->jack = jack;
if (!FIFO_ADD_ITEM(dbus_to_chrome_fifo,
internal_speaker_headphone_state, data)) {
free(data);
diff --git a/gavd/dbus_to_chrome_fifo.h b/gavd/dbus_to_chrome_fifo.h
index 59a315e..ba6b3fc 100644
--- a/gavd/dbus_to_chrome_fifo.h
+++ b/gavd/dbus_to_chrome_fifo.h
@@ -12,9 +12,12 @@
/* dbus_to_chrome_fifo_internal_speaker_headphone_state
* Indicate state change to internal speaker / heaphones.
*
- * state = 0 -> Speaker enable, headphone disabled.
- * state = 1 -> Speaker disabled, headphone enabled.
+ * jack == NULL -> Invalid invocation.
+ * jack != NULL -> Name of the jack.
+ * state = 0 -> Speaker enable, headphone disabled.
+ * state = 1 -> Speaker disabled, headphone enabled.
* state not in {0, 1} -> error
*/
-void dbus_to_chrome_fifo_internal_speaker_headphone_state(unsigned state);
+void dbus_to_chrome_fifo_internal_speaker_headphone_state(const char *jack,
+ unsigned state);
#endif
diff --git a/gavd/gpio_switch_monitor.c b/gavd/gpio_switch_monitor.c
index 8ae4616..27e1c24 100644
--- a/gavd/gpio_switch_monitor.c
+++ b/gavd/gpio_switch_monitor.c
@@ -22,7 +22,7 @@
typedef struct switch_state_t {
const char *thread_name;
- const char *device_name;
+ const char *jack;
const char *insert_command;
const char *remove_command;
unsigned state; /* 0 -> remove, 1 -> insert */
@@ -51,7 +51,8 @@
threads_lock_hardware();
utils_execute_command(cmd);
threads_unlock_hardware();
- dbus_to_chrome_fifo_internal_speaker_headphone_state(ss->state);
+ dbus_to_chrome_fifo_internal_speaker_headphone_state(ss->jack,
+ ss->state);
} else {
/* If there is no command for insertion, or there is no
* command for removal, then both commands must not exist. In
@@ -70,6 +71,7 @@
});
static void gpio_switch_monitor_work(const char *thread_name,
+ const char *jack,
unsigned switch_event,
const char *insert_command,
const char *remove_command,
@@ -100,6 +102,7 @@
*/
if (ss != NULL) {
ss->thread_name = thread_name;
+ ss->jack = jack;
ss->insert_command = insert_command;
ss->remove_command = remove_command;
ss->state = current_state;
@@ -119,6 +122,7 @@
}
void gpio_switch_monitor(const char *thread_name,
+ const char *jack,
const char *device_name,
unsigned switch_event,
const char *insert_command,
@@ -138,6 +142,7 @@
if (fd != -1 &&
sys_input_get_switch_state(fd, switch_event, ¤t_state)) {
gpio_switch_monitor_work(thread_name,
+ jack,
switch_event,
insert_command,
remove_command,
diff --git a/gavd/gpio_switch_monitor.h b/gavd/gpio_switch_monitor.h
index 892ce32..f5ce263 100644
--- a/gavd/gpio_switch_monitor.h
+++ b/gavd/gpio_switch_monitor.h
@@ -23,6 +23,7 @@
* switch is deactivated.
*/
void gpio_switch_monitor(const char *thread_name,
+ const char *jack,
const char *device_name,
unsigned switch_event,
const char *insert_command,
diff --git a/gavd/thread_gpio_switch_monitor.c b/gavd/thread_gpio_switch_monitor.c
index 799b7b7..42d4f56 100644
--- a/gavd/thread_gpio_switch_monitor.c
+++ b/gavd/thread_gpio_switch_monitor.c
@@ -28,6 +28,7 @@
/* Wait for all other threads to start. */
pthread_barrier_wait(&thread_management.tm_start_barrier);
gpio_switch_monitor(desc->td_name,
+ "headphone",
ADHD_INPUT_NAME_HEADPHONE_JACK,
SW_HEADPHONE_INSERT,
ADHD_GPIO_HEADPHONE_INSERT_COMMAND,
@@ -49,6 +50,7 @@
/* Wait for all other threads to start. */
pthread_barrier_wait(&thread_management.tm_start_barrier);
gpio_switch_monitor(desc->td_name,
+ "microphone",
ADHD_INPUT_NAME_MICROPHONE_JACK,
SW_MICROPHONE_INSERT,
ADHD_GPIO_MIRCOPHONE_INSERT_COMMAND,