[pulseaudio-discuss] [RFC] Introduce "available" concept for ports, and communicate that to clients.

David Henningsson david.henningsson at canonical.com
Wed Jul 6 03:56:21 PDT 2011


This initial part of the patch set is not meant for merging yet, but should be fairly 
non-controversial, but please see if there is anything you don't agree with. Next steps 
to add would be
1) Make sure there are always ports, even if there is only one
2) Make sure (non-active as well as active) profiles have ports and
make that accessible to clients.

Signed-off-by: David Henningsson <david.henningsson at canonical.com>
---
 src/pulse/def.h                 |   17 +++++++++++++++++
 src/pulse/introspect.c          |   16 ++++++++++++++++
 src/pulse/introspect.h          |    2 ++
 src/pulsecore/protocol-native.c |    4 ++++
 src/pulsecore/sink.h            |    1 +
 5 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/src/pulse/def.h b/src/pulse/def.h
index 16b2e59..91cb9d0 100644
--- a/src/pulse/def.h
+++ b/src/pulse/def.h
@@ -946,6 +946,23 @@ typedef void (*pa_free_cb_t)(void *p);
  * playback, \since 1.0 */
 #define PA_STREAM_EVENT_FORMAT_LOST "format-lost"
 
+/** Port availability / jack detection status
+ * \since MERGE_OF_JACK_DETECTION */
+typedef enum pa_port_available {
+    PA_PORT_AVAILABLE_UNKNOWN = 0, /**< This port does not support jack detection \since MERGE_OF_JACK_DETECTION */
+    PA_PORT_AVAILABLE_NO = 1,      /**< This port is not available, likely because the jack is not plugged in. \since MERGE_OF_JACK_DETECTION */
+    PA_PORT_AVAILABLE_YES = 2,     /**< This port is available, likely because the jack is plugged in. \since MERGE_OF_JACK_DETECTION */
+} pa_port_available_t;
+
+/** \cond fulldocs */
+#define PA_PORT_AVAILABLE_UNKNOWN PA_PORT_AVAILABLE_UNKNOWN
+#define PA_PORT_AVAILABLE_NO PA_PORT_AVAILABLE_NO
+#define PA_PORT_AVAILABLE_YES PA_PORT_AVAILABLE_YES
+
+/* FIXME: Remove the line below when this actually gets merged. Protocol version number */
+#define JACK_DETECTION_PROTOCOL_VERSION 23
+/** \endcond */
+
 PA_C_DECL_END
 
 #endif
diff --git a/src/pulse/introspect.c b/src/pulse/introspect.c
index 27a298c..d1a0ed1 100644
--- a/src/pulse/introspect.c
+++ b/src/pulse/introspect.c
@@ -211,6 +211,14 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                             goto fail;
                         }
 
+                        i.ports[0][j].available = PA_PORT_AVAILABLE_UNKNOWN;
+                        if (o->context->version >= JACK_DETECTION_PROTOCOL_VERSION) {
+                            uint32_t av;
+                            if (pa_tagstruct_getu32(t, &av) < 0 || av > PA_PORT_AVAILABLE_YES)
+                                goto fail;
+                            i.ports[0][j].available = av;
+                        }
+
                         i.ports[j] = &i.ports[0][j];
                     }
 
@@ -476,6 +484,14 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
                             goto fail;
                         }
 
+                        i.ports[0][j].available = PA_PORT_AVAILABLE_UNKNOWN;
+                        if (o->context->version >= JACK_DETECTION_PROTOCOL_VERSION) {
+                            uint32_t av;
+                            if (pa_tagstruct_getu32(t, &av) < 0 || av > PA_PORT_AVAILABLE_YES)
+                                goto fail;
+                            i.ports[0][j].available = av;
+                        }
+
                         i.ports[j] = &i.ports[0][j];
                     }
 
diff --git a/src/pulse/introspect.h b/src/pulse/introspect.h
index 196d44d..8e4cc97 100644
--- a/src/pulse/introspect.h
+++ b/src/pulse/introspect.h
@@ -202,6 +202,7 @@ typedef struct pa_sink_port_info {
     const char *name;                   /**< Name of this port */
     const char *description;            /**< Description of this port */
     uint32_t priority;                  /**< The higher this value is the more useful this port is as a default */
+    pa_port_available_t available;      /**< PA_PORT_AVAILABLE_UNKNOWN, PA_PORT_AVAILABLE_NO or PA_PORT_AVAILABLE_YES \since MERGE_OF_JACK_DETECTION */
 } pa_sink_port_info;
 
 /** Stores information about sinks. Please note that this structure
@@ -281,6 +282,7 @@ typedef struct pa_source_port_info {
     const char *name;                   /**< Name of this port */
     const char *description;            /**< Description of this port */
     uint32_t priority;                  /**< The higher this value is the more useful this port is as a default */
+    pa_port_available_t available;      /**< PA_PORT_AVAILABLE_UNKNOWN, PA_PORT_AVAILABLE_NO or PA_PORT_AVAILABLE_YES \since MERGE_OF_JACK_DETECTION */
 } pa_source_port_info;
 
 /** Stores information about sources. Please note that this structure
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 6b98175..4dcc07c 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -3087,6 +3087,8 @@ static void sink_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_sin
                 pa_tagstruct_puts(t, p->name);
                 pa_tagstruct_puts(t, p->description);
                 pa_tagstruct_putu32(t, p->priority);
+                if (c->version >= JACK_DETECTION_PROTOCOL_VERSION)
+                    pa_tagstruct_putu32(t, p->available);
             }
         }
 
@@ -3158,6 +3160,8 @@ static void source_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_s
                 pa_tagstruct_puts(t, p->name);
                 pa_tagstruct_puts(t, p->description);
                 pa_tagstruct_putu32(t, p->priority);
+                if (c->version >= JACK_DETECTION_PROTOCOL_VERSION)
+                    pa_tagstruct_putu32(t, p->available);
             }
         }
 
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
index 85c22ec..a01f4b0 100644
--- a/src/pulsecore/sink.h
+++ b/src/pulsecore/sink.h
@@ -59,6 +59,7 @@ struct pa_device_port {
     char *description;
 
     unsigned priority;
+    pa_port_available_t available;         /**< PA_PORT_AVAILABLE_UNKNOWN, PA_PORT_AVAILABLE_NO or PA_PORT_AVAILABLE_YES \since MERGE_OF_JACK_DETECTION */
 
     /* .. followed by some implementation specific data */
 };
-- 
1.7.4.1



More information about the pulseaudio-discuss mailing list