[pulseaudio-discuss] [PATCH v2] call-state-tracker: New component.

Tanu Kaskinen tanu.kaskinen at digia.com
Wed Apr 6 04:33:32 PDT 2011


From: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>

See call-state-tracker.h for details.

Changed in patch v2:
Don't take a reference of pa_core. The previous version would have
reintroduced the bug that was fixed in 1e381fbf.
---
 src/Makefile.am                    |    1 +
 src/pulsecore/call-state-tracker.c |  125 ++++++++++++++++++++++++++++++++++++
 src/pulsecore/call-state-tracker.h |   54 +++++++++++++++
 3 files changed, 180 insertions(+), 0 deletions(-)
 create mode 100644 src/pulsecore/call-state-tracker.c
 create mode 100644 src/pulsecore/call-state-tracker.h

diff --git a/src/Makefile.am b/src/Makefile.am
index bdedded..85c5602 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -835,6 +835,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
 		pulsecore/asyncmsgq.c pulsecore/asyncmsgq.h \
 		pulsecore/asyncq.c pulsecore/asyncq.h \
 		pulsecore/auth-cookie.c pulsecore/auth-cookie.h \
+		pulsecore/call-state-tracker.c pulsecore/call-state-tracker.h \
 		pulsecore/cli-command.c pulsecore/cli-command.h \
 		pulsecore/cli-text.c pulsecore/cli-text.h \
 		pulsecore/client.c pulsecore/client.h \
diff --git a/src/pulsecore/call-state-tracker.c b/src/pulsecore/call-state-tracker.c
new file mode 100644
index 0000000..0ac9be5
--- /dev/null
+++ b/src/pulsecore/call-state-tracker.c
@@ -0,0 +1,125 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulsecore/core.h>
+#include <pulsecore/hook-list.h>
+#include <pulsecore/log.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/refcnt.h>
+#include <pulsecore/shared.h>
+
+#include "call-state-tracker.h"
+
+struct pa_call_state_tracker {
+    PA_REFCNT_DECLARE;
+
+    pa_core *core;
+    pa_bool_t active;
+    pa_hook hooks[PA_CALL_STATE_HOOK_MAX];
+};
+
+static pa_call_state_tracker* call_state_tracker_new(pa_core *c) {
+    pa_call_state_tracker *t;
+    pa_call_state_hook_t h;
+
+    pa_assert(c);
+
+    t = pa_xnew0(pa_call_state_tracker, 1);
+    PA_REFCNT_INIT(t);
+    t->core = c;
+    t->active = FALSE;
+
+    for (h = 0; h < PA_CALL_STATE_HOOK_MAX; h++)
+        pa_hook_init(&t->hooks[h], t);
+
+    pa_assert_se(pa_shared_set(c, "call-state-tracker", t) >= 0);
+
+    return t;
+}
+
+pa_call_state_tracker *pa_call_state_tracker_get(pa_core *core) {
+    pa_call_state_tracker *t;
+
+    if ((t = pa_shared_get(core, "call-state-tracker")))
+        return pa_call_state_tracker_ref(t);
+
+    return call_state_tracker_new(core);
+}
+
+pa_call_state_tracker *pa_call_state_tracker_ref(pa_call_state_tracker *t) {
+    pa_assert(t);
+    pa_assert(PA_REFCNT_VALUE(t) >= 1);
+
+    PA_REFCNT_INC(t);
+
+    return t;
+}
+
+void pa_call_state_tracker_unref(pa_call_state_tracker *t) {
+    pa_call_state_hook_t h;
+
+    pa_assert(t);
+    pa_assert(PA_REFCNT_VALUE(t) >= 1);
+
+    if (PA_REFCNT_DEC(t) > 0)
+        return;
+
+    for (h = 0; h < PA_CALL_STATE_HOOK_MAX; h++)
+        pa_hook_done(&t->hooks[h]);
+
+    pa_assert_se(pa_shared_remove(t->core, "call-state-tracker") >= 0);
+
+    pa_xfree(t);
+}
+
+pa_bool_t pa_call_state_tracker_get_active(pa_call_state_tracker *t) {
+    pa_assert(t);
+    pa_assert(PA_REFCNT_VALUE(t) >= 1);
+
+    return t->active;
+}
+
+void pa_call_state_tracker_set_active(pa_call_state_tracker *t, pa_bool_t active) {
+    pa_bool_t changed;
+
+    pa_assert(t);
+    pa_assert(PA_REFCNT_VALUE(t) >= 1);
+
+    changed = active != t->active;
+
+    t->active = active;
+
+    if (changed)
+        pa_hook_fire(&t->hooks[PA_CALL_STATE_HOOK_CHANGED], (void *) active);
+
+    pa_log_debug("Call state set %s (%s)", active ? "active" : "inactive", changed ? "changed" : "not changed");
+}
+
+pa_hook *pa_call_state_tracker_hooks(pa_call_state_tracker *t) {
+    pa_assert(t);
+    pa_assert(PA_REFCNT_VALUE(t) >= 1);
+
+    return t->hooks;
+}
diff --git a/src/pulsecore/call-state-tracker.h b/src/pulsecore/call-state-tracker.h
new file mode 100644
index 0000000..9a6c60b
--- /dev/null
+++ b/src/pulsecore/call-state-tracker.h
@@ -0,0 +1,54 @@
+#ifndef foocallstatetrackerhfoo
+#define foocallstatetrackerhfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This is a shared singleton object, currently used by Meego's voice and
+ * policy enforcement modules. The purpose of the object is just to maintain
+ * a boolean state of "call is active" or "call is not active", and to provide
+ * notification hooks for tracking state changes. So one module will be setting
+ * the state (the voice module) and one or more modules will follow the state
+ * through the hooks (the policy enforcement module). */
+
+#include <pulsecore/core.h>
+#include <pulsecore/hook-list.h>
+
+typedef struct pa_call_state_tracker pa_call_state_tracker;
+
+/* Hook data: pa_call_state_tracker pointer. */
+typedef enum pa_call_state_hook {
+    PA_CALL_STATE_HOOK_CHANGED, /* Call data: NULL. */
+    PA_CALL_STATE_HOOK_MAX
+} pa_call_state_hook_t;
+
+pa_call_state_tracker *pa_call_state_tracker_get(pa_core *core);
+pa_call_state_tracker *pa_call_state_tracker_ref(pa_call_state_tracker *t);
+void pa_call_state_tracker_unref(pa_call_state_tracker *t);
+
+/* If the value has not been explicitly set, returns FALSE. */
+pa_bool_t pa_call_state_tracker_get_active(pa_call_state_tracker *t);
+
+void pa_call_state_tracker_set_active(pa_call_state_tracker *t, pa_bool_t active);
+
+pa_hook *pa_call_state_tracker_hooks(pa_call_state_tracker *t);
+
+#endif
-- 
1.7.4.2




More information about the pulseaudio-discuss mailing list