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 <[email protected]>
---
 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

_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to