]> code.delx.au - pulseaudio/blobdiff - src/pulse/introspect.h
introspect: Add functions to handle the latency offset.
[pulseaudio] / src / pulse / introspect.h
index 68cfc8745482201df1f471475b5f0a5a0c318387..6ea4536127eaa7a817c644613f7b5ef6664d1a72 100644 (file)
@@ -32,6 +32,7 @@
 #include <pulse/channelmap.h>
 #include <pulse/volume.h>
 #include <pulse/proplist.h>
+#include <pulse/format.h>
 #include <pulse/version.h>
 
 /** \page introspect Server Query and Control
  *
  * \section query_sec Querying
  *
- * All querying is done through callbacks. This design is necessary to
+ * All querying is done through callbacks. This approach is necessary to
  * maintain an asynchronous design. The client will request the information
  * and some time later, the server will respond with the desired data.
  *
- * Some objects can have multiple entries at the server. When requesting all
+ * Some objects can have multiple instances on the server. When requesting all
  * of these at once, the callback will be called multiple times, once for
  * each object. When the list has been exhausted, the callback will be called
  * without an information structure and the eol parameter set to a positive
  * Note that even if a single object is requested, and not the entire list,
  * the terminating call will still be made.
  *
- * If an error occurs, the callback will be called without and information
+ * If an error occurs, the callback will be invoked without an information
  * structure and eol set to a negative value..
  *
  * Data members in the information structures are only valid during the
  * duration of the callback. If they are required after the callback is
- * finished, a deep copy must be performed.
+ * finished, a deep copy of the information structure must be performed.
  *
  * \subsection server_subsec Server Information
  *
  * The server can be queried about its name, the environment it's running on
  * and the currently active global defaults. Calling
- * pa_context_get_server_info() will get access to a pa_server_info structure
+ * pa_context_get_server_info() provides access to a pa_server_info structure
  * containing all of these.
  *
  * \subsection memstat_subsec Memory Usage
@@ -81,7 +82,7 @@
  * \subsection sinksrc_subsec Sinks and Sources
  *
  * The server can have an arbitrary number of sinks and sources. Each sink
- * and source have both an index and a name associated with it. As such
+ * and source have both an index and a name associated with it. As such,
  * there are three ways to get access to them:
  *
  * \li By index - pa_context_get_sink_info_by_index() /
  *
  * \subsection sinksrc_subsec Sinks and Sources
  *
- * The most common change one would want to do to sinks and sources is to
- * modify the volume of the audio. Identical to how sinks and sources can
+ * The most common change one would want to apply to sinks and sources is to
+ * modify the volume of the audio. Identically to how sinks and sources can
  * be queried, there are two ways of identifying them:
  *
  * \li By index - pa_context_set_sink_volume_by_index() /
  *
  * If an application desires to modify the volume of just a single stream
  * (commonly one of its own streams), this can be done by setting the volume
- * of its associated sink input, using pa_context_set_sink_input_volume().
- *
- * There is no support for modifying the volume of source outputs.
+ * of its associated sink input or source output, using
+ * pa_context_set_sink_input_volume() or pa_context_set_source_output_volume().
  *
  * It is also possible to remove sink inputs and source outputs, terminating
  * the streams associated with them:
  *
  * \subsection client_subsec Clients
  *
- * The only operation supported on clients, is the possibility of kicking
+ * The only operation supported on clients is the possibility of kicking
  * them off the server using pa_context_kill_client().
  */
 
 /** \file
  *
  * Routines for daemon introspection.
+ *
+ * See also \subpage introspect
  */
 
 PA_C_DECL_BEGIN
@@ -199,7 +201,8 @@ PA_C_DECL_BEGIN
 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 */
+    uint32_t priority;                  /**< The higher this value is, the more useful this port is as a default. */
+    int available;                      /**< A flags (see #pa_port_available), indicating availability status of this port. \since 2.0 */
 } pa_sink_port_info;
 
 /** Stores information about sinks. Please note that this structure
@@ -211,13 +214,13 @@ typedef struct pa_sink_info {
     const char *description;           /**< Description of this sink */
     pa_sample_spec sample_spec;        /**< Sample spec of this sink */
     pa_channel_map channel_map;        /**< Channel map */
-    uint32_t owner_module;             /**< Index of the owning module of this sink, or PA_INVALID_INDEX */
+    uint32_t owner_module;             /**< Index of the owning module of this sink, or PA_INVALID_INDEX. */
     pa_cvolume volume;                 /**< Volume of the sink */
     int mute;                          /**< Mute switch of the sink */
-    uint32_t monitor_source;           /**< Index of the monitor source connected to this sink */
-    const char *monitor_source_name;   /**< The name of the monitor source */
+    uint32_t monitor_source;           /**< Index of the monitor source connected to this sink. */
+    const char *monitor_source_name;   /**< The name of the monitor source. */
     pa_usec_t latency;                 /**< Length of queued audio in the output buffer. */
-    const char *driver;                /**< Driver name. */
+    const char *driver;                /**< Driver name */
     pa_sink_flags_t flags;             /**< Flags */
     pa_proplist *proplist;             /**< Property list \since 0.9.11 */
     pa_usec_t configured_latency;      /**< The latency this device has been configured to. \since 0.9.11 */
@@ -226,8 +229,10 @@ typedef struct pa_sink_info {
     uint32_t n_volume_steps;           /**< Number of volume steps for sinks which do not support arbitrary volumes. \since 0.9.15 */
     uint32_t card;                     /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */
     uint32_t n_ports;                  /**< Number of entries in port array \since 0.9.16 */
-    pa_sink_port_info** ports;         /**< Array of available ports, or NULL. Array is terminated by an entry set to NULL. The number of entries is stored in n_ports \since 0.9.16 */
-    pa_sink_port_info* active_port;    /**< Pointer to active port in the array, or NULL \since 0.9.16 */
+    pa_sink_port_info** ports;         /**< Array of available ports, or NULL. Array is terminated by an entry set to NULL. The number of entries is stored in n_ports. \since 0.9.16 */
+    pa_sink_port_info* active_port;    /**< Pointer to active port in the array, or NULL. \since 0.9.16 */
+    uint8_t n_formats;                 /**< Number of formats supported by the sink. \since 1.0 */
+    pa_format_info **formats;          /**< Array of formats supported by the sink. \since 1.0 */
 } pa_sink_info;
 
 /** Callback prototype for pa_context_get_sink_info_by_name() and friends */
@@ -276,7 +281,8 @@ pa_operation* pa_context_set_sink_port_by_name(pa_context *c, const char*name, c
 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 */
+    uint32_t priority;                  /**< The higher this value is, the more useful this port is as a default. */
+    int available;                      /**< A flags (see #pa_port_available), indicating availability status of this port. \since 2.0 */
 } pa_source_port_info;
 
 /** Stores information about sources. Please note that this structure
@@ -288,11 +294,11 @@ typedef struct pa_source_info {
     const char *description;            /**< Description of this source */
     pa_sample_spec sample_spec;         /**< Sample spec of this source */
     pa_channel_map channel_map;         /**< Channel map */
-    uint32_t owner_module;              /**< Owning module index, or PA_INVALID_INDEX */
+    uint32_t owner_module;              /**< Owning module index, or PA_INVALID_INDEX. */
     pa_cvolume volume;                  /**< Volume of the source */
     int mute;                           /**< Mute switch of the sink */
-    uint32_t monitor_of_sink;           /**< If this is a monitor source the index of the owning sink, otherwise PA_INVALID_INDEX */
-    const char *monitor_of_sink_name;   /**< Name of the owning sink, or PA_INVALID_INDEX */
+    uint32_t monitor_of_sink;           /**< If this is a monitor source, the index of the owning sink, otherwise PA_INVALID_INDEX. */
+    const char *monitor_of_sink_name;   /**< Name of the owning sink, or PA_INVALID_INDEX. */
     pa_usec_t latency;                  /**< Length of filled record buffer of this source. */
     const char *driver;                 /**< Driver name */
     pa_source_flags_t flags;            /**< Flags */
@@ -303,8 +309,10 @@ typedef struct pa_source_info {
     uint32_t n_volume_steps;            /**< Number of volume steps for sources which do not support arbitrary volumes. \since 0.9.15 */
     uint32_t card;                      /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */
     uint32_t n_ports;                   /**< Number of entries in port array \since 0.9.16 */
-    pa_source_port_info** ports;        /**< Array of available ports, or NULL. Array is terminated by an entry set to NULL. The number of entries is stored in n_ports \since 0.9.16  */
-    pa_source_port_info* active_port;   /**< Pointer to active port in the array, or NULL \since 0.9.16  */
+    pa_source_port_info** ports;        /**< Array of available ports, or NULL. Array is terminated by an entry set to NULL. The number of entries is stored in n_ports. \since 0.9.16  */
+    pa_source_port_info* active_port;   /**< Pointer to active port in the array, or NULL. \since 0.9.16  */
+    uint8_t n_formats;                  /**< Number of formats supported by the source. \since 1.0 */
+    pa_format_info **formats;           /**< Array of formats supported by the source. \since 1.0 */
 } pa_source_info;
 
 /** Callback prototype for pa_context_get_source_info_by_name() and friends */
@@ -334,7 +342,7 @@ pa_operation* pa_context_set_source_mute_by_name(pa_context *c, const char *name
 /** Suspend/Resume a source. \since 0.9.7 */
 pa_operation* pa_context_suspend_source_by_name(pa_context *c, const char *source_name, int suspend, pa_context_success_cb_t cb, void* userdata);
 
-/** Suspend/Resume a source. If idx is PA_INVALID_INDEX all sources will be suspended. \since 0.9.7 */
+/** Suspend/Resume a source. If idx is PA_INVALID_INDEX, all sources will be suspended. \since 0.9.7 */
 pa_operation* pa_context_suspend_source_by_index(pa_context *c, uint32_t idx, int suspend, pa_context_success_cb_t cb, void* userdata);
 
 /** Change the profile of a source. \since 0.9.16 */
@@ -357,7 +365,7 @@ typedef struct pa_server_info {
     const char *server_name;            /**< Server package name (usually "pulseaudio") */
     pa_sample_spec sample_spec;         /**< Default sample specification */
     const char *default_sink_name;      /**< Name of default sink. */
-    const char *default_source_name;    /**< Name of default sink. */
+    const char *default_source_name;    /**< Name of default source. */
     uint32_t cookie;                    /**< A random cookie for identifying this instance of PulseAudio. */
     pa_channel_map channel_map;         /**< Default channel map. \since 0.9.15 */
 } pa_server_info;
@@ -381,12 +389,12 @@ typedef struct pa_module_info {
         *argument;                      /**< Argument string of the module */
     uint32_t n_used;                    /**< Usage counter or PA_INVALID_INDEX */
 /** \cond fulldocs */
-    int auto_unload;                    /**< \deprecated Non-zero if this is an autoloaded module */
+    int auto_unload;                    /**< \deprecated Non-zero if this is an autoloaded module. */
 /** \endcond */
     pa_proplist *proplist;              /**< Property list \since 0.9.15 */
 } pa_module_info;
 
-/** Callback prototype for pa_context_get_module_info() and friends*/
+/** Callback prototype for pa_context_get_module_info() and friends */
 typedef void (*pa_module_info_cb_t) (pa_context *c, const pa_module_info*i, int eol, void *userdata);
 
 /** Get some information about a module by its index */
@@ -414,12 +422,12 @@ pa_operation* pa_context_unload_module(pa_context *c, uint32_t idx, pa_context_s
 typedef struct pa_client_info {
     uint32_t index;                      /**< Index of this client */
     const char *name;                    /**< Name of this client */
-    uint32_t owner_module;               /**< Index of the owning module, or PA_INVALID_INDEX */
+    uint32_t owner_module;               /**< Index of the owning module, or PA_INVALID_INDEX. */
     const char *driver;                  /**< Driver name */
     pa_proplist *proplist;               /**< Property list \since 0.9.11 */
 } pa_client_info;
 
-/** Callback prototype for pa_context_get_client_info() and friends*/
+/** Callback prototype for pa_context_get_client_info() and friends */
 typedef void (*pa_client_info_cb_t) (pa_context *c, const pa_client_info*i, int eol, void *userdata);
 
 /** Get information about a client by its index */
@@ -443,24 +451,41 @@ typedef struct pa_card_profile_info {
     const char *description;            /**< Description of this profile */
     uint32_t n_sinks;                   /**< Number of sinks this profile would create */
     uint32_t n_sources;                 /**< Number of sources this profile would create */
-    uint32_t priority;                  /**< The higher this value is the more useful this profile is as a default */
+    uint32_t priority;                  /**< The higher this value is, the more useful this profile is as a default. */
 } pa_card_profile_info;
 
+/** Stores information about a specific port of a card.  Please
+ * note that this structure can be extended as part of evolutionary
+ * API updates at any time in any new release. \since 2.0 */
+typedef struct pa_card_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. */
+    int available;                      /**< A #pa_port_available enum, indicating availability status of this port. */
+    int direction;                      /**< A #pa_direction enum, indicating the direction of this port. */
+    uint32_t n_profiles;                /**< Number of entries in profile array */
+    pa_card_profile_info** profiles;    /**< Array of pointers to available profiles, or NULL. Array is terminated by an entry set to NULL. */
+    pa_proplist *proplist;              /**< Property list */
+    int64_t latency_offset;             /**< Latency offset of the port that gets added to the sink/source latency when the port is active. \since 3.0 */
+} pa_card_port_info;
+
 /** Stores information about cards. Please note that this structure
  * can be extended as part of evolutionary API updates at any time in
  * any new release.  \since 0.9.15 */
 typedef struct pa_card_info {
     uint32_t index;                      /**< Index of this card */
     const char *name;                    /**< Name of this card */
-    uint32_t owner_module;               /**< Index of the owning module, or PA_INVALID_INDEX */
+    uint32_t owner_module;               /**< Index of the owning module, or PA_INVALID_INDEX. */
     const char *driver;                  /**< Driver name */
     uint32_t n_profiles;                 /**< Number of entries in profile array */
-    pa_card_profile_info* profiles;      /**< Array of available profile, or NULL. Array is terminated by an entry with name set to NULL. Number of entries is stored in n_profiles */
-    pa_card_profile_info* active_profile; /**< Pointer to active profile in the array, or NULL */
+    pa_card_profile_info* profiles;      /**< Array of available profile, or NULL. Array is terminated by an entry with name set to NULL. Number of entries is stored in n_profiles. */
+    pa_card_profile_info* active_profile; /**< Pointer to active profile in the array, or NULL. */
     pa_proplist *proplist;               /**< Property list */
+    uint32_t n_ports;                    /**< Number of entries in port array */
+    pa_card_port_info **ports;           /**< Array of pointers to ports, or NULL. Array is terminated by an entry set to NULL. */
 } pa_card_info;
 
-/** Callback prototype for pa_context_get_card_info() and friends \since 0.9.15 */
+/** Callback prototype for pa_context_get_card_info_...() \since 0.9.15 */
 typedef void (*pa_card_info_cb_t) (pa_context *c, const pa_card_info*i, int eol, void *userdata);
 
 /** Get information about a card by its index \since 0.9.15 */
@@ -478,6 +503,9 @@ pa_operation* pa_context_set_card_profile_by_index(pa_context *c, uint32_t idx,
 /** Change the profile of a card. \since 0.9.15 */
 pa_operation* pa_context_set_card_profile_by_name(pa_context *c, const char*name, const char*profile, pa_context_success_cb_t cb, void *userdata);
 
+/** Set the latency offset of a port. \since 3.0 */
+pa_operation* pa_context_set_port_latency_offset(pa_context *c, const char *card_name, const char *port_name, int64_t offset, pa_context_success_cb_t cb, void *userdata);
+
 /** @} */
 
 /** @{ \name Sink Inputs */
@@ -488,21 +516,25 @@ pa_operation* pa_context_set_card_profile_by_name(pa_context *c, const char*name
 typedef struct pa_sink_input_info {
     uint32_t index;                      /**< Index of the sink input */
     const char *name;                    /**< Name of the sink input */
-    uint32_t owner_module;               /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module */
-    uint32_t client;                     /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client */
+    uint32_t owner_module;               /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module. */
+    uint32_t client;                     /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client. */
     uint32_t sink;                       /**< Index of the connected sink */
-    pa_sample_spec sample_spec;          /**< The sample specification of the sink input */
+    pa_sample_spec sample_spec;          /**< The sample specification of the sink input. */
     pa_channel_map channel_map;          /**< Channel map */
-    pa_cvolume volume;                   /**< The volume of this sink input */
-    pa_usec_t buffer_usec;               /**< Latency due to buffering in sink input, see pa_latency_info for details */
-    pa_usec_t sink_usec;                 /**< Latency of the sink device, see pa_latency_info for details */
+    pa_cvolume volume;                   /**< The volume of this sink input. */
+    pa_usec_t buffer_usec;               /**< Latency due to buffering in sink input, see pa_latency_info for details. */
+    pa_usec_t sink_usec;                 /**< Latency of the sink device, see pa_latency_info for details. */
     const char *resample_method;         /**< The resampling method used by this sink input. */
     const char *driver;                  /**< Driver name */
     int mute;                            /**< Stream muted \since 0.9.7 */
     pa_proplist *proplist;               /**< Property list \since 0.9.11 */
+    int corked;                          /**< Stream corked \since 1.0 */
+    int has_volume;                      /**< Stream has volume. If not set, then the meaning of this struct's volume member is unspecified. \since 1.0 */
+    int volume_writable;                 /**< The volume can be set. If not set, the volume can still change even though clients can't control the volume. \since 1.0 */
+    pa_format_info *format;              /**< Stream format information. \since 1.0 */
 } pa_sink_input_info;
 
-/** Callback prototype for pa_context_get_sink_input_info() and friends*/
+/** Callback prototype for pa_context_get_sink_input_info() and friends */
 typedef void (*pa_sink_input_info_cb_t) (pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
 
 /** Get some information about a sink input by its index */
@@ -534,10 +566,10 @@ pa_operation* pa_context_kill_sink_input(pa_context *c, uint32_t idx, pa_context
  * can be extended as part of evolutionary API updates at any time in
  * any new release. */
 typedef struct pa_source_output_info {
-    uint32_t index;                      /**< Index of the sink input */
-    const char *name;                    /**< Name of the sink input */
-    uint32_t owner_module;               /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module */
-    uint32_t client;                     /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client */
+    uint32_t index;                      /**< Index of the source output */
+    const char *name;                    /**< Name of the source output */
+    uint32_t owner_module;               /**< Index of the module this source output belongs to, or PA_INVALID_INDEX when it does not belong to any module. */
+    uint32_t client;                     /**< Index of the client this source output belongs to, or PA_INVALID_INDEX when it does not belong to any client. */
     uint32_t source;                     /**< Index of the connected source */
     pa_sample_spec sample_spec;          /**< The sample specification of the source output */
     pa_channel_map channel_map;          /**< Channel map */
@@ -546,9 +578,15 @@ typedef struct pa_source_output_info {
     const char *resample_method;         /**< The resampling method used by this source output. */
     const char *driver;                  /**< Driver name */
     pa_proplist *proplist;               /**< Property list \since 0.9.11 */
+    int corked;                          /**< Stream corked \since 1.0 */
+    pa_cvolume volume;                   /**< The volume of this source output \since 1.0 */
+    int mute;                            /**< Stream muted \since 1.0 */
+    int has_volume;                      /**< Stream has volume. If not set, then the meaning of this struct's volume member is unspecified. \since 1.0 */
+    int volume_writable;                 /**< The volume can be set. If not set, the volume can still change even though clients can't control the volume. \since 1.0 */
+    pa_format_info *format;              /**< Stream format information. \since 1.0 */
 } pa_source_output_info;
 
-/** Callback prototype for pa_context_get_source_output_info() and friends*/
+/** Callback prototype for pa_context_get_source_output_info() and friends */
 typedef void (*pa_source_output_info_cb_t) (pa_context *c, const pa_source_output_info *i, int eol, void *userdata);
 
 /** Get information about a source output by its index */
@@ -563,6 +601,12 @@ pa_operation* pa_context_move_source_output_by_name(pa_context *c, uint32_t idx,
 /** Move the specified source output to a different source. \since 0.9.5 */
 pa_operation* pa_context_move_source_output_by_index(pa_context *c, uint32_t idx, uint32_t source_idx, pa_context_success_cb_t cb, void* userdata);
 
+/** Set the volume of a source output stream \since 1.0 */
+pa_operation* pa_context_set_source_output_volume(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
+
+/** Set the mute switch of a source output stream \since 1.0 */
+pa_operation* pa_context_set_source_output_mute(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata);
+
 /** Kill a source output. */
 pa_operation* pa_context_kill_source_output(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
 
@@ -576,8 +620,8 @@ pa_operation* pa_context_kill_source_output(pa_context *c, uint32_t idx, pa_cont
 typedef struct pa_stat_info {
     uint32_t memblock_total;           /**< Currently allocated memory blocks */
     uint32_t memblock_total_size;      /**< Current total size of allocated memory blocks */
-    uint32_t memblock_allocated;       /**< Allocated memory blocks during the whole lifetime of the daemon */
-    uint32_t memblock_allocated_size;  /**< Total size of all memory blocks allocated during the whole lifetime of the daemon */
+    uint32_t memblock_allocated;       /**< Allocated memory blocks during the whole lifetime of the daemon. */
+    uint32_t memblock_allocated_size;  /**< Total size of all memory blocks allocated during the whole lifetime of the daemon. */
     uint32_t scache_size;              /**< Total size of all sample cache entries. */
 } pa_stat_info;