#ifndef foointrospecthfoo
#define foointrospecthfoo
This file is part of PulseAudio.
Copyright 2004-2006 Lennart Poettering
Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
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, see <http://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
#include <pulse/operation.h>
#include <pulse/context.h>
#include <pulse/cdecl.h>
#include <pulse/gccmacro.h>
#include <pulse/channelmap.h>
#include <pulse/volume.h>
#include <pulse/proplist.h>
#include <pulse/format.h>
#include <pulse/version.h>
*
* \section overv_sec Overview
*
* Sometimes it is necessary to query and modify global settings in the
* server. For this, PulseAudio has the introspection API. It can list sinks,
* sources, samples and other aspects of the server. It can also modify the
* attributes of the server that will affect operations on a global level,
* and not just the application's context.
*
* \section query_sec Querying
*
* 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 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
* value.
*
* 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 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 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() provides access to a pa_server_info structure
* containing all of these.
*
* \subsection memstat_subsec Memory Usage
*
* Statistics about memory usage can be fetched using pa_context_stat(),
* giving a pa_stat_info structure.
*
* \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,
* there are three ways to get access to them:
*
* \li By index - pa_context_get_sink_info_by_index() /
* pa_context_get_source_info_by_index()
* \li By name - pa_context_get_sink_info_by_name() /
* pa_context_get_source_info_by_name()
* \li All - pa_context_get_sink_info_list() /
* pa_context_get_source_info_list()
*
* All three method use the same callback and will provide a pa_sink_info or
* pa_source_info structure.
*
* \subsection siso_subsec Sink Inputs and Source Outputs
*
* Sink inputs and source outputs are the representations of the client ends
* of streams inside the server. I.e. they connect a client stream to one of
* the global sinks or sources.
*
* Sink inputs and source outputs only have an index to identify them. As
* such, there are only two ways to get information about them:
*
* \li By index - pa_context_get_sink_input_info() /
* pa_context_get_source_output_info()
* \li All - pa_context_get_sink_input_info_list() /
* pa_context_get_source_output_info_list()
*
* The structure returned is the pa_sink_input_info or pa_source_output_info
* structure.
*
* \subsection samples_subsec Samples
*
* The list of cached samples can be retrieved from the server. Three methods
* exist for querying the sample cache list:
*
* \li By index - pa_context_get_sample_info_by_index()
* \li By name - pa_context_get_sample_info_by_name()
* \li All - pa_context_get_sample_info_list()
*
* Note that this only retrieves information about the sample, not the sample
* data itself.
*
* \subsection module_subsec Driver Modules
*
* PulseAudio driver modules are identified by index and are retrieved using either
* pa_context_get_module_info() or pa_context_get_module_info_list(). The
* information structure is called pa_module_info.
*
* \subsection client_subsec Clients
*
* PulseAudio clients are also identified by index and are retrieved using
* either pa_context_get_client_info() or pa_context_get_client_info_list().
* The information structure is called pa_client_info.
*
* \section ctrl_sec Control
*
* Some parts of the server are only possible to read, but most can also be
* modified in different ways. Note that these changes will affect all
* connected clients and not just the one issuing the request.
*
* \subsection sinksrc_subsec Sinks and Sources
*
* 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() /
* pa_context_set_source_volume_by_index()
* \li By name - pa_context_set_sink_volume_by_name() /
* pa_context_set_source_volume_by_name()
*
* It is also possible to mute a sink or source:
*
* \li By index - pa_context_set_sink_mute_by_index() /
* pa_context_set_source_mute_by_index()
* \li By name - pa_context_set_sink_mute_by_name() /
* pa_context_set_source_mute_by_name()
*
* \subsection siso_subsec Sink Inputs and Source Outputs
*
* 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 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:
*
* \li Sink input - pa_context_kill_sink_input()
* \li Source output - pa_context_kill_source_output()
*
* It is strongly recommended that all volume changes are done as a direct
* result of user input. With automated requests, such as those resulting
* from misguided attempts of crossfading, PulseAudio can store the stream
* volume at an inappropriate moment and restore it later. Besides, such
* attempts lead to OSD popups in some desktop environments.
*
* As a special case of the general rule above, it is recommended that your
* application leaves the task of saving and restoring the volume of its
* streams to PulseAudio and does not attempt to do it by itself. PulseAudio
* really knows better about events such as stream moving or headphone
* plugging that would make the volume stored by the application inapplicable
* to the new configuration.
*
* Another important case where setting a sink input volume may be a bad idea
* is related to interpreters that interpret potentially untrusted scripts.
* PulseAudio relies on your application not making malicious requests (such
* as repeatedly setting the volume to 100%). Thus, script interpreters that
* represent a security boundary must sandbox volume-changing requests coming
* from their scripts. In the worst case, it may be necessary to apply the
* script-requested volume to the script-produced sounds by altering the
* samples in the script interpreter and not touching the sink or sink input
* volume as seen by PulseAudio.
*
* If an application changes any volume, it should also listen to changes of
* the same volume originating from outside the application (e.g., from the
* system mixer application) and update its user interface accordingly. Use
* \ref subscribe to get such notifications.
*
* \subsection module_subsec Modules
*
* Server modules can be remotely loaded and unloaded using
* pa_context_load_module() and pa_context_unload_module().
*
* \subsection message_subsec Messages
*
* Server objects like sinks, sink inputs or modules can register a message
* handler to communicate with clients. A message can be sent to a named
* message handler using pa_context_send_message_to_object().
*
* \subsection client_subsec Clients
*
* The only operation supported on clients is the possibility of kicking
* them off the server using pa_context_kill_client().
*/
*
* Routines for daemon introspection.
*
* See also \subpage introspect
*/
PA_C_DECL_BEGIN
* note that this structure can be extended as part of evolutionary
* API updates at any time in any new release. \since 0.9.16 */
typedef struct pa_sink_port_info {
const char *name;
const char *description;
uint32_t priority;
int available;
const char *availability_group;
* each other. This is meant especially for handling cases where one 3.5 mm connector
* is used for headphones, headsets and microphones, and the hardware can only tell
* that something was plugged in but not what exactly. In this situation the ports for
* all those devices share their availability status, and PulseAudio can't tell which
* one is actually plugged in, and some application may ask the user what was plugged
* in. Such applications should get a list of all card ports and compare their
* `availability_group` fields. Ports that have the same group are those that need
* input from the user to determine which device was plugged in. The application should
* then activate the user-chosen port.
*
* May be NULL, in which case the port is not part of any availability group.
*
* The group identifier must be treated as an opaque identifier. The string may look
* like an ALSA control name, but applications must not assume any such relationship.
* The group naming scheme can change without a warning.
*
* Since one group can include both input and output ports, the grouping should be done
* using pa_card_port_info instead of pa_sink_port_info, but this field is duplicated
* also in pa_sink_port_info (and pa_source_port_info) in case someone finds that
* convenient.
*
* \since 14.0 */
uint32_t type;
} pa_sink_port_info;
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_sink_info {
const char *name;
uint32_t index;
const char *description;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
uint32_t owner_module;
pa_cvolume volume;
int mute;
uint32_t monitor_source;
const char *monitor_source_name;
pa_usec_t latency;
const char *driver;
pa_sink_flags_t flags;
pa_proplist *proplist;
pa_usec_t configured_latency;
pa_volume_t base_volume;
pa_sink_state_t state;
uint32_t n_volume_steps;
uint32_t card;
uint32_t n_ports;
pa_sink_port_info** ports;
pa_sink_port_info* active_port;
uint8_t n_formats;
pa_format_info **formats;
} pa_sink_info;
typedef void (*pa_sink_info_cb_t)(pa_context *c, const pa_sink_info *i, int eol, void *userdata);
pa_operation* pa_context_get_sink_info_by_name(pa_context *c, const char *name, pa_sink_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_sink_info_by_index(pa_context *c, uint32_t idx, pa_sink_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_sink_info_list(pa_context *c, pa_sink_info_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_volume_by_index(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_volume_by_name(pa_context *c, const char *name, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_mute_by_index(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_mute_by_name(pa_context *c, const char *name, int mute, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_suspend_sink_by_name(pa_context *c, const char *sink_name, int suspend, pa_context_success_cb_t cb, void* userdata);
pa_operation* pa_context_suspend_sink_by_index(pa_context *c, uint32_t idx, int suspend, pa_context_success_cb_t cb, void* userdata);
pa_operation* pa_context_set_sink_port_by_index(pa_context *c, uint32_t idx, const char*port, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_port_by_name(pa_context *c, const char*name, const char*port, pa_context_success_cb_t cb, void *userdata);
* note that this structure can be extended as part of evolutionary
* API updates at any time in any new release. \since 0.9.16 */
typedef struct pa_source_port_info {
const char *name;
const char *description;
uint32_t priority;
int available;
const char *availability_group;
* each other. This is meant especially for handling cases where one 3.5 mm connector
* is used for headphones, headsets and microphones, and the hardware can only tell
* that something was plugged in but not what exactly. In this situation the ports for
* all those devices share their availability status, and PulseAudio can't tell which
* one is actually plugged in, and some application may ask the user what was plugged
* in. Such applications should get a list of all card ports and compare their
* `availability_group` fields. Ports that have the same group are those that need
* input from the user to determine which device was plugged in. The application should
* then activate the user-chosen port.
*
* May be NULL, in which case the port is not part of any availability group (which is
* the same as having a group with only one member).
*
* The group identifier must be treated as an opaque identifier. The string may look
* like an ALSA control name, but applications must not assume any such relationship.
* The group naming scheme can change without a warning.
*
* Since one group can include both input and output ports, the grouping should be done
* using pa_card_port_info instead of pa_source_port_info, but this field is duplicated
* also in pa_source_port_info (and pa_sink_port_info) in case someone finds that
* convenient.
*
* \since 14.0 */
uint32_t type;
} pa_source_port_info;
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_source_info {
const char *name;
uint32_t index;
const char *description;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
uint32_t owner_module;
pa_cvolume volume;
int mute;
uint32_t monitor_of_sink;
const char *monitor_of_sink_name;
pa_usec_t latency;
const char *driver;
pa_source_flags_t flags;
pa_proplist *proplist;
pa_usec_t configured_latency;
pa_volume_t base_volume;
pa_source_state_t state;
uint32_t n_volume_steps;
uint32_t card;
uint32_t n_ports;
pa_source_port_info** ports;
pa_source_port_info* active_port;
uint8_t n_formats;
pa_format_info **formats;
} pa_source_info;
typedef void (*pa_source_info_cb_t)(pa_context *c, const pa_source_info *i, int eol, void *userdata);
pa_operation* pa_context_get_source_info_by_name(pa_context *c, const char *name, pa_source_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_source_info_by_index(pa_context *c, uint32_t idx, pa_source_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_source_info_list(pa_context *c, pa_source_info_cb_t cb, void *userdata);
pa_operation* pa_context_set_source_volume_by_index(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_source_volume_by_name(pa_context *c, const char *name, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_source_mute_by_index(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_source_mute_by_name(pa_context *c, const char *name, int mute, pa_context_success_cb_t cb, void *userdata);
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);
pa_operation* pa_context_suspend_source_by_index(pa_context *c, uint32_t idx, int suspend, pa_context_success_cb_t cb, void* userdata);
pa_operation* pa_context_set_source_port_by_index(pa_context *c, uint32_t idx, const char*port, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_source_port_by_name(pa_context *c, const char*name, const char*port, pa_context_success_cb_t cb, void *userdata);
* extended as part of evolutionary API updates at any time in any new
* release. */
typedef struct pa_server_info {
const char *user_name;
const char *host_name;
const char *server_version;
const char *server_name;
pa_sample_spec sample_spec;
const char *default_sink_name;
const char *default_source_name;
uint32_t cookie;
pa_channel_map channel_map;
} pa_server_info;
typedef void (*pa_server_info_cb_t) (pa_context *c, const pa_server_info*i, void *userdata);
pa_operation* pa_context_get_server_info(pa_context *c, pa_server_info_cb_t cb, void *userdata);
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_module_info {
uint32_t index;
const char*name,
*argument;
uint32_t n_used;
int auto_unload;
pa_proplist *proplist;
} pa_module_info;
typedef void (*pa_module_info_cb_t) (pa_context *c, const pa_module_info*i, int eol, void *userdata);
pa_operation* pa_context_get_module_info(pa_context *c, uint32_t idx, pa_module_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_module_info_list(pa_context *c, pa_module_info_cb_t cb, void *userdata);
typedef void (*pa_context_index_cb_t)(pa_context *c, uint32_t idx, void *userdata);
pa_operation* pa_context_load_module(pa_context *c, const char*name, const char *argument, pa_context_index_cb_t cb, void *userdata);
pa_operation* pa_context_unload_module(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
typedef void (*pa_context_string_cb_t)(pa_context *c, int success, char *response, void *userdata);
* see https://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/doc/messaging_api.txt. \since 15.0 */
pa_operation* pa_context_send_message_to_object(pa_context *c, const char *recipient_name, const char *message, const char *message_parameters, pa_context_string_cb_t cb, void *userdata);
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_client_info {
uint32_t index;
const char *name;
uint32_t owner_module;
const char *driver;
pa_proplist *proplist;
} pa_client_info;
typedef void (*pa_client_info_cb_t) (pa_context *c, const pa_client_info*i, int eol, void *userdata);
pa_operation* pa_context_get_client_info(pa_context *c, uint32_t idx, pa_client_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_client_info_list(pa_context *c, pa_client_info_cb_t cb, void *userdata);
pa_operation* pa_context_kill_client(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
typedef struct pa_card_profile_info {
const char *name;
const char *description;
uint32_t n_sinks;
uint32_t n_sources;
uint32_t priority;
} pa_card_profile_info;
* note that this structure can be extended as part of evolutionary
* API updates at any time in any new release. \since 5.0 */
typedef struct pa_card_profile_info2 {
const char *name;
const char *description;
uint32_t n_sinks;
uint32_t n_sources;
uint32_t priority;
int available;
* then it makes no sense to try to activate this profile. If this is
* non-zero, it's still not a guarantee that activating the profile will
* result in anything useful, it just means that the server isn't aware of
* any reason why the profile would definitely be useless. \since 5.0 */
} pa_card_profile_info2;
* 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;
const char *description;
uint32_t priority;
int available;
int direction;
uint32_t n_profiles;
pa_card_profile_info** profiles;
pa_proplist *proplist;
int64_t latency_offset;
pa_card_profile_info2** profiles2;
const char *availability_group;
* each other. This is meant especially for handling cases where one 3.5 mm connector
* is used for headphones, headsets and microphones, and the hardware can only tell
* that something was plugged in but not what exactly. In this situation the ports for
* all those devices share their availability status, and PulseAudio can't tell which
* one is actually plugged in, and some application may ask the user what was plugged
* in. Such applications should get a list of all card ports and compare their
* `availability_group` fields. Ports that have the same group are those that need
* input from the user to determine which device was plugged in. The application should
* then activate the user-chosen port.
*
* May be NULL, in which case the port is not part of any availability group (which is
* the same as having a group with only one member).
*
* The group identifier must be treated as an opaque identifier. The string may look
* like an ALSA control name, but applications must not assume any such relationship.
* The group naming scheme can change without a warning.
*
* \since 14.0 */
uint32_t type;
} pa_card_port_info;
* 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;
const char *name;
uint32_t owner_module;
const char *driver;
uint32_t n_profiles;
pa_card_profile_info* profiles;
pa_card_profile_info* active_profile;
pa_proplist *proplist;
uint32_t n_ports;
pa_card_port_info **ports;
pa_card_profile_info2** profiles2;
pa_card_profile_info2* active_profile2;
} pa_card_info;
typedef void (*pa_card_info_cb_t) (pa_context *c, const pa_card_info*i, int eol, void *userdata);
pa_operation* pa_context_get_card_info_by_index(pa_context *c, uint32_t idx, pa_card_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_card_info_by_name(pa_context *c, const char *name, pa_card_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_card_info_list(pa_context *c, pa_card_info_cb_t cb, void *userdata);
pa_operation* pa_context_set_card_profile_by_index(pa_context *c, uint32_t idx, const char*profile, pa_context_success_cb_t cb, void *userdata);
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);
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);
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_sink_input_info {
uint32_t index;
const char *name;
uint32_t owner_module;
uint32_t client;
uint32_t sink;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
pa_cvolume volume;
pa_usec_t buffer_usec;
pa_usec_t sink_usec;
const char *resample_method;
const char *driver;
int mute;
pa_proplist *proplist;
int corked;
int has_volume;
int volume_writable;
pa_format_info *format;
} pa_sink_input_info;
typedef void (*pa_sink_input_info_cb_t) (pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
pa_operation* pa_context_get_sink_input_info(pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_sink_input_info_list(pa_context *c, pa_sink_input_info_cb_t cb, void *userdata);
pa_operation* pa_context_move_sink_input_by_name(pa_context *c, uint32_t idx, const char *sink_name, pa_context_success_cb_t cb, void* userdata);
pa_operation* pa_context_move_sink_input_by_index(pa_context *c, uint32_t idx, uint32_t sink_idx, pa_context_success_cb_t cb, void* userdata);
pa_operation* pa_context_set_sink_input_volume(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_set_sink_input_mute(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_kill_sink_input(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
* 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;
const char *name;
uint32_t owner_module;
uint32_t client;
uint32_t source;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
pa_usec_t buffer_usec;
pa_usec_t source_usec;
const char *resample_method;
const char *driver;
pa_proplist *proplist;
int corked;
pa_cvolume volume;
int mute;
int has_volume;
int volume_writable;
pa_format_info *format;
} pa_source_output_info;
typedef void (*pa_source_output_info_cb_t) (pa_context *c, const pa_source_output_info *i, int eol, void *userdata);
pa_operation* pa_context_get_source_output_info(pa_context *c, uint32_t idx, pa_source_output_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_source_output_info_list(pa_context *c, pa_source_output_info_cb_t cb, void *userdata);
pa_operation* pa_context_move_source_output_by_name(pa_context *c, uint32_t idx, const char *source_name, pa_context_success_cb_t cb, void* userdata);
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);
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);
pa_operation* pa_context_set_source_output_mute(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata);
pa_operation* pa_context_kill_source_output(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_stat_info {
uint32_t memblock_total;
uint32_t memblock_total_size;
uint32_t memblock_allocated;
uint32_t memblock_allocated_size;
uint32_t scache_size;
} pa_stat_info;
typedef void (*pa_stat_info_cb_t) (pa_context *c, const pa_stat_info *i, void *userdata);
pa_operation* pa_context_stat(pa_context *c, pa_stat_info_cb_t cb, void *userdata);
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_sample_info {
uint32_t index;
const char *name;
pa_cvolume volume;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
pa_usec_t duration;
uint32_t bytes;
int lazy;
const char *filename;
pa_proplist *proplist;
} pa_sample_info;
typedef void (*pa_sample_info_cb_t)(pa_context *c, const pa_sample_info *i, int eol, void *userdata);
pa_operation* pa_context_get_sample_info_by_name(pa_context *c, const char *name, pa_sample_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_sample_info_by_index(pa_context *c, uint32_t idx, pa_sample_info_cb_t cb, void *userdata);
pa_operation* pa_context_get_sample_info_list(pa_context *c, pa_sample_info_cb_t cb, void *userdata);
typedef enum pa_autoload_type {
PA_AUTOLOAD_SINK = 0,
PA_AUTOLOAD_SOURCE = 1
} pa_autoload_type_t;
* can be extended as part of evolutionary API updates at any time in
* any new release. */
typedef struct pa_autoload_info {
uint32_t index;
const char *name;
pa_autoload_type_t type;
const char *module;
const char *argument;
} pa_autoload_info;
typedef void (*pa_autoload_info_cb_t)(pa_context *c, const pa_autoload_info *i, int eol, void *userdata);
pa_operation* pa_context_get_autoload_info_by_name(pa_context *c, const char *name, pa_autoload_type_t type, pa_autoload_info_cb_t cb, void *userdata) PA_GCC_DEPRECATED;
pa_operation* pa_context_get_autoload_info_by_index(pa_context *c, uint32_t idx, pa_autoload_info_cb_t cb, void *userdata) PA_GCC_DEPRECATED;
pa_operation* pa_context_get_autoload_info_list(pa_context *c, pa_autoload_info_cb_t cb, void *userdata) PA_GCC_DEPRECATED;
pa_operation* pa_context_add_autoload(pa_context *c, const char *name, pa_autoload_type_t type, const char *module, const char*argument, pa_context_index_cb_t, void* userdata) PA_GCC_DEPRECATED;
pa_operation* pa_context_remove_autoload_by_name(pa_context *c, const char *name, pa_autoload_type_t type, pa_context_success_cb_t cb, void* userdata) PA_GCC_DEPRECATED;
pa_operation* pa_context_remove_autoload_by_index(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void* userdata) PA_GCC_DEPRECATED;
PA_C_DECL_END
#endif