Path: blob/master/thirdparty/linuxbsd_headers/pulse/def.h
9905 views
#ifndef foodefhfoo1#define foodefhfoo23/***4This file is part of PulseAudio.56Copyright 2004-2006 Lennart Poettering7Copyright 2006 Pierre Ossman <[email protected]> for Cendio AB89PulseAudio is free software; you can redistribute it and/or modify10it under the terms of the GNU Lesser General Public License as11published by the Free Software Foundation; either version 2.1 of the12License, or (at your option) any later version.1314PulseAudio is distributed in the hope that it will be useful, but15WITHOUT ANY WARRANTY; without even the implied warranty of16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU17Lesser General Public License for more details.1819You should have received a copy of the GNU Lesser General Public20License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.21***/2223#include <inttypes.h>24#include <sys/time.h>2526#include <pulse/cdecl.h>27#include <pulse/sample.h>28#include <pulse/version.h>2930/** \file31* Global definitions */3233PA_C_DECL_BEGIN3435/** The state of a connection context */36typedef enum pa_context_state {37PA_CONTEXT_UNCONNECTED, /**< The context hasn't been connected yet */38PA_CONTEXT_CONNECTING, /**< A connection is being established */39PA_CONTEXT_AUTHORIZING, /**< The client is authorizing itself to the daemon */40PA_CONTEXT_SETTING_NAME, /**< The client is passing its application name to the daemon */41PA_CONTEXT_READY, /**< The connection is established, the context is ready to execute operations */42PA_CONTEXT_FAILED, /**< The connection failed or was disconnected */43PA_CONTEXT_TERMINATED /**< The connection was terminated cleanly */44} pa_context_state_t;4546/** Return non-zero if the passed state is one of the connected states. \since 0.9.11 */47static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) {48return49x == PA_CONTEXT_CONNECTING ||50x == PA_CONTEXT_AUTHORIZING ||51x == PA_CONTEXT_SETTING_NAME ||52x == PA_CONTEXT_READY;53}5455/** \cond fulldocs */56#define PA_CONTEXT_UNCONNECTED PA_CONTEXT_UNCONNECTED57#define PA_CONTEXT_CONNECTING PA_CONTEXT_CONNECTING58#define PA_CONTEXT_AUTHORIZING PA_CONTEXT_AUTHORIZING59#define PA_CONTEXT_SETTING_NAME PA_CONTEXT_SETTING_NAME60#define PA_CONTEXT_READY PA_CONTEXT_READY61#define PA_CONTEXT_FAILED PA_CONTEXT_FAILED62#define PA_CONTEXT_TERMINATED PA_CONTEXT_TERMINATED63#define PA_CONTEXT_IS_GOOD PA_CONTEXT_IS_GOOD64/** \endcond */6566/** The state of a stream */67typedef enum pa_stream_state {68PA_STREAM_UNCONNECTED, /**< The stream is not yet connected to any sink or source */69PA_STREAM_CREATING, /**< The stream is being created */70PA_STREAM_READY, /**< The stream is established, you may pass audio data to it now */71PA_STREAM_FAILED, /**< An error occurred that made the stream invalid */72PA_STREAM_TERMINATED /**< The stream has been terminated cleanly */73} pa_stream_state_t;7475/** Return non-zero if the passed state is one of the connected states. \since 0.9.11 */76static inline int PA_STREAM_IS_GOOD(pa_stream_state_t x) {77return78x == PA_STREAM_CREATING ||79x == PA_STREAM_READY;80}8182/** \cond fulldocs */83#define PA_STREAM_UNCONNECTED PA_STREAM_UNCONNECTED84#define PA_STREAM_CREATING PA_STREAM_CREATING85#define PA_STREAM_READY PA_STREAM_READY86#define PA_STREAM_FAILED PA_STREAM_FAILED87#define PA_STREAM_TERMINATED PA_STREAM_TERMINATED88#define PA_STREAM_IS_GOOD PA_STREAM_IS_GOOD89/** \endcond */9091/** The state of an operation */92typedef enum pa_operation_state {93PA_OPERATION_RUNNING,94/**< The operation is still running */95PA_OPERATION_DONE,96/**< The operation has completed */97PA_OPERATION_CANCELLED98/**< The operation has been cancelled. Operations may get cancelled by the99* application, or as a result of the context getting disconneted while the100* operation is pending. */101} pa_operation_state_t;102103/** \cond fulldocs */104#define PA_OPERATION_RUNNING PA_OPERATION_RUNNING105#define PA_OPERATION_DONE PA_OPERATION_DONE106#define PA_OPERATION_CANCELED PA_OPERATION_CANCELLED107#define PA_OPERATION_CANCELLED PA_OPERATION_CANCELLED108/** \endcond */109110/** An invalid index */111#define PA_INVALID_INDEX ((uint32_t) -1)112113/** Some special flags for contexts. */114typedef enum pa_context_flags {115PA_CONTEXT_NOFLAGS = 0x0000U,116/**< Flag to pass when no specific options are needed (used to avoid casting) \since 0.9.19 */117PA_CONTEXT_NOAUTOSPAWN = 0x0001U,118/**< Disabled autospawning of the PulseAudio daemon if required */119PA_CONTEXT_NOFAIL = 0x0002U120/**< Don't fail if the daemon is not available when pa_context_connect() is called, instead enter PA_CONTEXT_CONNECTING state and wait for the daemon to appear. \since 0.9.15 */121} pa_context_flags_t;122123/** \cond fulldocs */124/* Allow clients to check with #ifdef for those flags */125#define PA_CONTEXT_NOAUTOSPAWN PA_CONTEXT_NOAUTOSPAWN126#define PA_CONTEXT_NOFAIL PA_CONTEXT_NOFAIL127/** \endcond */128129/** Direction bitfield - while we currently do not expose anything bidirectional,130one should test against the bit instead of the value (e.g.\ if (d & PA_DIRECTION_OUTPUT)),131because we might add bidirectional stuff in the future. \since 2.0132*/133typedef enum pa_direction {134PA_DIRECTION_OUTPUT = 0x0001U, /**< Output direction */135PA_DIRECTION_INPUT = 0x0002U /**< Input direction */136} pa_direction_t;137138/** \cond fulldocs */139#define PA_DIRECTION_OUTPUT PA_DIRECTION_OUTPUT140#define PA_DIRECTION_INPUT PA_DIRECTION_INPUT141/** \endcond */142143/** The type of device we are dealing with */144typedef enum pa_device_type {145PA_DEVICE_TYPE_SINK, /**< Playback device */146PA_DEVICE_TYPE_SOURCE /**< Recording device */147} pa_device_type_t;148149/** \cond fulldocs */150#define PA_DEVICE_TYPE_SINK PA_DEVICE_TYPE_SINK151#define PA_DEVICE_TYPE_SOURCE PA_DEVICE_TYPE_SOURCE152/** \endcond */153154/** The direction of a pa_stream object */155typedef enum pa_stream_direction {156PA_STREAM_NODIRECTION, /**< Invalid direction */157PA_STREAM_PLAYBACK, /**< Playback stream */158PA_STREAM_RECORD, /**< Record stream */159PA_STREAM_UPLOAD /**< Sample upload stream */160} pa_stream_direction_t;161162/** \cond fulldocs */163#define PA_STREAM_NODIRECTION PA_STREAM_NODIRECTION164#define PA_STREAM_PLAYBACK PA_STREAM_PLAYBACK165#define PA_STREAM_RECORD PA_STREAM_RECORD166#define PA_STREAM_UPLOAD PA_STREAM_UPLOAD167/** \endcond */168169/** Some special flags for stream connections. */170typedef enum pa_stream_flags {171172PA_STREAM_NOFLAGS = 0x0000U,173/**< Flag to pass when no specific options are needed (used to avoid casting) \since 0.9.19 */174175PA_STREAM_START_CORKED = 0x0001U,176/**< Create the stream corked, requiring an explicit177* pa_stream_cork() call to uncork it. */178179PA_STREAM_INTERPOLATE_TIMING = 0x0002U,180/**< Interpolate the latency for this stream. When enabled,181* pa_stream_get_latency() and pa_stream_get_time() will try to182* estimate the current record/playback time based on the local183* time that passed since the last timing info update. Using this184* option has the advantage of not requiring a whole roundtrip185* when the current playback/recording time is needed. Consider186* using this option when requesting latency information187* frequently. This is especially useful on long latency network188* connections. It makes a lot of sense to combine this option189* with PA_STREAM_AUTO_TIMING_UPDATE. */190191PA_STREAM_NOT_MONOTONIC = 0x0004U,192/**< Don't force the time to increase monotonically. If this193* option is enabled, pa_stream_get_time() will not necessarily194* return always monotonically increasing time values on each195* call. This may confuse applications which cannot deal with time196* going 'backwards', but has the advantage that bad transport197* latency estimations that caused the time to jump ahead can198* be corrected quickly, without the need to wait. (Please note199* that this flag was named PA_STREAM_NOT_MONOTONOUS in releases200* prior to 0.9.11. The old name is still defined too, for201* compatibility reasons. */202203PA_STREAM_AUTO_TIMING_UPDATE = 0x0008U,204/**< If set timing update requests are issued periodically205* automatically. Combined with PA_STREAM_INTERPOLATE_TIMING you206* will be able to query the current time and latency with207* pa_stream_get_time() and pa_stream_get_latency() at all times208* without a packet round trip.*/209210PA_STREAM_NO_REMAP_CHANNELS = 0x0010U,211/**< Don't remap channels by their name, instead map them simply212* by their index. Implies PA_STREAM_NO_REMIX_CHANNELS. Only213* supported when the server is at least PA 0.9.8. It is ignored214* on older servers.\since 0.9.8 */215216PA_STREAM_NO_REMIX_CHANNELS = 0x0020U,217/**< When remapping channels by name, don't upmix or downmix them218* to related channels. Copy them into matching channels of the219* device 1:1. Only supported when the server is at least PA220* 0.9.8. It is ignored on older servers. \since 0.9.8 */221222PA_STREAM_FIX_FORMAT = 0x0040U,223/**< Use the sample format of the sink/device this stream is being224* connected to, and possibly ignore the format the sample spec225* contains -- but you still have to pass a valid value in it as a226* hint to PulseAudio what would suit your stream best. If this is227* used you should query the used sample format after creating the228* stream by using pa_stream_get_sample_spec(). Also, if you229* specified manual buffer metrics it is recommended to update230* them with pa_stream_set_buffer_attr() to compensate for the231* changed frame sizes. Only supported when the server is at least232* PA 0.9.8. It is ignored on older servers.233*234* When creating streams with pa_stream_new_extended(), this flag has no235* effect. If you specify a format with PCM encoding, and you want the236* server to choose the sample format, then you should leave the sample237* format unspecified in the pa_format_info object. This also means that238* you can't use pa_format_info_from_sample_spec(), because that function239* always sets the sample format.240*241* \since 0.9.8 */242243PA_STREAM_FIX_RATE = 0x0080U,244/**< Use the sample rate of the sink, and possibly ignore the rate245* the sample spec contains. Usage similar to246* PA_STREAM_FIX_FORMAT. Only supported when the server is at least247* PA 0.9.8. It is ignored on older servers.248*249* When creating streams with pa_stream_new_extended(), this flag has no250* effect. If you specify a format with PCM encoding, and you want the251* server to choose the sample rate, then you should leave the rate252* unspecified in the pa_format_info object. This also means that you can't253* use pa_format_info_from_sample_spec(), because that function always sets254* the sample rate.255*256* \since 0.9.8 */257258PA_STREAM_FIX_CHANNELS = 0x0100,259/**< Use the number of channels and the channel map of the sink,260* and possibly ignore the number of channels and the map the261* sample spec and the passed channel map contains. Usage similar262* to PA_STREAM_FIX_FORMAT. Only supported when the server is at263* least PA 0.9.8. It is ignored on older servers.264*265* When creating streams with pa_stream_new_extended(), this flag has no266* effect. If you specify a format with PCM encoding, and you want the267* server to choose the channel count and/or channel map, then you should268* leave the channels and/or the channel map unspecified in the269* pa_format_info object. This also means that you can't use270* pa_format_info_from_sample_spec(), because that function always sets271* the channel count (but if you only want to leave the channel map272* unspecified, then pa_format_info_from_sample_spec() works, because it273* accepts a NULL channel map).274*275* \since 0.9.8 */276277PA_STREAM_DONT_MOVE = 0x0200U,278/**< Don't allow moving of this stream to another279* sink/device. Useful if you use any of the PA_STREAM_FIX_ flags280* and want to make sure that resampling never takes place --281* which might happen if the stream is moved to another282* sink/source with a different sample spec/channel map. Only283* supported when the server is at least PA 0.9.8. It is ignored284* on older servers. \since 0.9.8 */285286PA_STREAM_VARIABLE_RATE = 0x0400U,287/**< Allow dynamic changing of the sampling rate during playback288* with pa_stream_update_sample_rate(). Only supported when the289* server is at least PA 0.9.8. It is ignored on older290* servers. \since 0.9.8 */291292PA_STREAM_PEAK_DETECT = 0x0800U,293/**< Find peaks instead of resampling. \since 0.9.11 */294295PA_STREAM_START_MUTED = 0x1000U,296/**< Create in muted state. If neither PA_STREAM_START_UNMUTED nor297* PA_STREAM_START_MUTED it is left to the server to decide298* whether to create the stream in muted or in unmuted299* state. \since 0.9.11 */300301PA_STREAM_ADJUST_LATENCY = 0x2000U,302/**< Try to adjust the latency of the sink/source based on the303* requested buffer metrics and adjust buffer metrics304* accordingly. Also see pa_buffer_attr. This option may not be305* specified at the same time as PA_STREAM_EARLY_REQUESTS. \since306* 0.9.11 */307308PA_STREAM_EARLY_REQUESTS = 0x4000U,309/**< Enable compatibility mode for legacy clients that rely on a310* "classic" hardware device fragment-style playback model. If311* this option is set, the minreq value of the buffer metrics gets312* a new meaning: instead of just specifying that no requests313* asking for less new data than this value will be made to the314* client it will also guarantee that requests are generated as315* early as this limit is reached. This flag should only be set in316* very few situations where compatibility with a fragment-based317* playback model needs to be kept and the client applications318* cannot deal with data requests that are delayed to the latest319* moment possible. (Usually these are programs that use usleep()320* or a similar call in their playback loops instead of sleeping321* on the device itself.) Also see pa_buffer_attr. This option may322* not be specified at the same time as323* PA_STREAM_ADJUST_LATENCY. \since 0.9.12 */324325PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND = 0x8000U,326/**< If set this stream won't be taken into account when it is327* checked whether the device this stream is connected to should328* auto-suspend. \since 0.9.15 */329330PA_STREAM_START_UNMUTED = 0x10000U,331/**< Create in unmuted state. If neither PA_STREAM_START_UNMUTED332* nor PA_STREAM_START_MUTED it is left to the server to decide333* whether to create the stream in muted or in unmuted334* state. \since 0.9.15 */335336PA_STREAM_FAIL_ON_SUSPEND = 0x20000U,337/**< If the sink/source this stream is connected to is suspended338* during the creation of this stream, cause it to fail. If the339* sink/source is being suspended during creation of this stream,340* make sure this stream is terminated. \since 0.9.15 */341342PA_STREAM_RELATIVE_VOLUME = 0x40000U,343/**< If a volume is passed when this stream is created, consider344* it relative to the sink's current volume, never as absolute345* device volume. If this is not specified the volume will be346* consider absolute when the sink is in flat volume mode,347* relative otherwise. \since 0.9.20 */348349PA_STREAM_PASSTHROUGH = 0x80000U350/**< Used to tag content that will be rendered by passthrough sinks.351* The data will be left as is and not reformatted, resampled.352* \since 1.0 */353354} pa_stream_flags_t;355356/** \cond fulldocs */357358/* English is an evil language */359#define PA_STREAM_NOT_MONOTONOUS PA_STREAM_NOT_MONOTONIC360361/* Allow clients to check with #ifdef for those flags */362#define PA_STREAM_START_CORKED PA_STREAM_START_CORKED363#define PA_STREAM_INTERPOLATE_TIMING PA_STREAM_INTERPOLATE_TIMING364#define PA_STREAM_NOT_MONOTONIC PA_STREAM_NOT_MONOTONIC365#define PA_STREAM_AUTO_TIMING_UPDATE PA_STREAM_AUTO_TIMING_UPDATE366#define PA_STREAM_NO_REMAP_CHANNELS PA_STREAM_NO_REMAP_CHANNELS367#define PA_STREAM_NO_REMIX_CHANNELS PA_STREAM_NO_REMIX_CHANNELS368#define PA_STREAM_FIX_FORMAT PA_STREAM_FIX_FORMAT369#define PA_STREAM_FIX_RATE PA_STREAM_FIX_RATE370#define PA_STREAM_FIX_CHANNELS PA_STREAM_FIX_CHANNELS371#define PA_STREAM_DONT_MOVE PA_STREAM_DONT_MOVE372#define PA_STREAM_VARIABLE_RATE PA_STREAM_VARIABLE_RATE373#define PA_STREAM_PEAK_DETECT PA_STREAM_PEAK_DETECT374#define PA_STREAM_START_MUTED PA_STREAM_START_MUTED375#define PA_STREAM_ADJUST_LATENCY PA_STREAM_ADJUST_LATENCY376#define PA_STREAM_EARLY_REQUESTS PA_STREAM_EARLY_REQUESTS377#define PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND378#define PA_STREAM_START_UNMUTED PA_STREAM_START_UNMUTED379#define PA_STREAM_FAIL_ON_SUSPEND PA_STREAM_FAIL_ON_SUSPEND380#define PA_STREAM_RELATIVE_VOLUME PA_STREAM_RELATIVE_VOLUME381#define PA_STREAM_PASSTHROUGH PA_STREAM_PASSTHROUGH382383/** \endcond */384385/** Playback and record buffer metrics */386typedef struct pa_buffer_attr {387uint32_t maxlength;388/**< Maximum length of the buffer in bytes. Setting this to (uint32_t) -1389* will initialize this to the maximum value supported by server,390* which is recommended.391*392* In strict low-latency playback scenarios you might want to set this to393* a lower value, likely together with the PA_STREAM_ADJUST_LATENCY flag.394* If you do so, you ensure that the latency doesn't grow beyond what is395* acceptable for the use case, at the cost of getting more underruns if396* the latency is lower than what the server can reliably handle. */397398uint32_t tlength;399/**< Playback only: target length of the buffer. The server tries400* to assure that at least tlength bytes are always available in401* the per-stream server-side playback buffer. It is recommended402* to set this to (uint32_t) -1, which will initialize this to a403* value that is deemed sensible by the server. However, this404* value will default to something like 2s, i.e. for applications405* that have specific latency requirements this value should be406* set to the maximum latency that the application can deal407* with. When PA_STREAM_ADJUST_LATENCY is not set this value will408* influence only the per-stream playback buffer size. When409* PA_STREAM_ADJUST_LATENCY is set the overall latency of the sink410* plus the playback buffer size is configured to this value. Set411* PA_STREAM_ADJUST_LATENCY if you are interested in adjusting the412* overall latency. Don't set it if you are interested in413* configuring the server-side per-stream playback buffer414* size. */415416uint32_t prebuf;417/**< Playback only: pre-buffering. The server does not start with418* playback before at least prebuf bytes are available in the419* buffer. It is recommended to set this to (uint32_t) -1, which420* will initialize this to the same value as tlength, whatever421* that may be. Initialize to 0 to enable manual start/stop422* control of the stream. This means that playback will not stop423* on underrun and playback will not start automatically. Instead424* pa_stream_cork() needs to be called explicitly. If you set425* this value to 0 you should also set PA_STREAM_START_CORKED. */426427uint32_t minreq;428/**< Playback only: minimum request. The server does not request429* less than minreq bytes from the client, instead waits until the430* buffer is free enough to request more bytes at once. It is431* recommended to set this to (uint32_t) -1, which will initialize432* this to a value that is deemed sensible by the server. This433* should be set to a value that gives PulseAudio enough time to434* move the data from the per-stream playback buffer into the435* hardware playback buffer. */436437uint32_t fragsize;438/**< Recording only: fragment size. The server sends data in439* blocks of fragsize bytes size. Large values diminish440* interactivity with other operations on the connection context441* but decrease control overhead. It is recommended to set this to442* (uint32_t) -1, which will initialize this to a value that is443* deemed sensible by the server. However, this value will default444* to something like 2s, i.e. for applications that have specific445* latency requirements this value should be set to the maximum446* latency that the application can deal with. If447* PA_STREAM_ADJUST_LATENCY is set the overall source latency will448* be adjusted according to this value. If it is not set the449* source latency is left unmodified. */450451} pa_buffer_attr;452453/** Error values as used by pa_context_errno(). Use pa_strerror() to convert these values to human readable strings */454typedef enum pa_error_code {455PA_OK = 0, /**< No error */456PA_ERR_ACCESS, /**< Access failure */457PA_ERR_COMMAND, /**< Unknown command */458PA_ERR_INVALID, /**< Invalid argument */459PA_ERR_EXIST, /**< Entity exists */460PA_ERR_NOENTITY, /**< No such entity */461PA_ERR_CONNECTIONREFUSED, /**< Connection refused */462PA_ERR_PROTOCOL, /**< Protocol error */463PA_ERR_TIMEOUT, /**< Timeout */464PA_ERR_AUTHKEY, /**< No authentication key */465PA_ERR_INTERNAL, /**< Internal error */466PA_ERR_CONNECTIONTERMINATED, /**< Connection terminated */467PA_ERR_KILLED, /**< Entity killed */468PA_ERR_INVALIDSERVER, /**< Invalid server */469PA_ERR_MODINITFAILED, /**< Module initialization failed */470PA_ERR_BADSTATE, /**< Bad state */471PA_ERR_NODATA, /**< No data */472PA_ERR_VERSION, /**< Incompatible protocol version */473PA_ERR_TOOLARGE, /**< Data too large */474PA_ERR_NOTSUPPORTED, /**< Operation not supported \since 0.9.5 */475PA_ERR_UNKNOWN, /**< The error code was unknown to the client */476PA_ERR_NOEXTENSION, /**< Extension does not exist. \since 0.9.12 */477PA_ERR_OBSOLETE, /**< Obsolete functionality. \since 0.9.15 */478PA_ERR_NOTIMPLEMENTED, /**< Missing implementation. \since 0.9.15 */479PA_ERR_FORKED, /**< The caller forked without calling execve() and tried to reuse the context. \since 0.9.15 */480PA_ERR_IO, /**< An IO error happened. \since 0.9.16 */481PA_ERR_BUSY, /**< Device or resource busy. \since 0.9.17 */482PA_ERR_MAX /**< Not really an error but the first invalid error code */483} pa_error_code_t;484485/** \cond fulldocs */486#define PA_OK PA_OK487#define PA_ERR_ACCESS PA_ERR_ACCESS488#define PA_ERR_COMMAND PA_ERR_COMMAND489#define PA_ERR_INVALID PA_ERR_INVALID490#define PA_ERR_EXIST PA_ERR_EXIST491#define PA_ERR_NOENTITY PA_ERR_NOENTITY492#define PA_ERR_CONNECTIONREFUSED PA_ERR_CONNECTIONREFUSED493#define PA_ERR_PROTOCOL PA_ERR_PROTOCOL494#define PA_ERR_TIMEOUT PA_ERR_TIMEOUT495#define PA_ERR_AUTHKEY PA_ERR_AUTHKEY496#define PA_ERR_INTERNAL PA_ERR_INTERNAL497#define PA_ERR_CONNECTIONTERMINATED PA_ERR_CONNECTIONTERMINATED498#define PA_ERR_KILLED PA_ERR_KILLED499#define PA_ERR_INVALIDSERVER PA_ERR_INVALIDSERVER500#define PA_ERR_MODINITFAILED PA_ERR_MODINITFAILED501#define PA_ERR_BADSTATE PA_ERR_BADSTATE502#define PA_ERR_NODATA PA_ERR_NODATA503#define PA_ERR_VERSION PA_ERR_VERSION504#define PA_ERR_TOOLARGE PA_ERR_TOOLARGE505#define PA_ERR_NOTSUPPORTED PA_ERR_NOTSUPPORTED506#define PA_ERR_UNKNOWN PA_ERR_UNKNOWN507#define PA_ERR_NOEXTENSION PA_ERR_NOEXTENSION508#define PA_ERR_OBSOLETE PA_ERR_OBSOLETE509#define PA_ERR_NOTIMPLEMENTED PA_ERR_NOTIMPLEMENTED510#define PA_ERR_FORKED PA_ERR_FORKED511#define PA_ERR_MAX PA_ERR_MAX512/** \endcond */513514/** Subscription event mask, as used by pa_context_subscribe() */515typedef enum pa_subscription_mask {516PA_SUBSCRIPTION_MASK_NULL = 0x0000U,517/**< No events */518519PA_SUBSCRIPTION_MASK_SINK = 0x0001U,520/**< Sink events */521522PA_SUBSCRIPTION_MASK_SOURCE = 0x0002U,523/**< Source events */524525PA_SUBSCRIPTION_MASK_SINK_INPUT = 0x0004U,526/**< Sink input events */527528PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT = 0x0008U,529/**< Source output events */530531PA_SUBSCRIPTION_MASK_MODULE = 0x0010U,532/**< Module events */533534PA_SUBSCRIPTION_MASK_CLIENT = 0x0020U,535/**< Client events */536537PA_SUBSCRIPTION_MASK_SAMPLE_CACHE = 0x0040U,538/**< Sample cache events */539540PA_SUBSCRIPTION_MASK_SERVER = 0x0080U,541/**< Other global server changes. */542543/** \cond fulldocs */544PA_SUBSCRIPTION_MASK_AUTOLOAD = 0x0100U,545/**< \deprecated Autoload table events. */546/** \endcond */547548PA_SUBSCRIPTION_MASK_CARD = 0x0200U,549/**< Card events. \since 0.9.15 */550551PA_SUBSCRIPTION_MASK_ALL = 0x02ffU552/**< Catch all events */553} pa_subscription_mask_t;554555/** Subscription event types, as used by pa_context_subscribe() */556typedef enum pa_subscription_event_type {557PA_SUBSCRIPTION_EVENT_SINK = 0x0000U,558/**< Event type: Sink */559560PA_SUBSCRIPTION_EVENT_SOURCE = 0x0001U,561/**< Event type: Source */562563PA_SUBSCRIPTION_EVENT_SINK_INPUT = 0x0002U,564/**< Event type: Sink input */565566PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT = 0x0003U,567/**< Event type: Source output */568569PA_SUBSCRIPTION_EVENT_MODULE = 0x0004U,570/**< Event type: Module */571572PA_SUBSCRIPTION_EVENT_CLIENT = 0x0005U,573/**< Event type: Client */574575PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE = 0x0006U,576/**< Event type: Sample cache item */577578PA_SUBSCRIPTION_EVENT_SERVER = 0x0007U,579/**< Event type: Global server change, only occurring with PA_SUBSCRIPTION_EVENT_CHANGE. */580581/** \cond fulldocs */582PA_SUBSCRIPTION_EVENT_AUTOLOAD = 0x0008U,583/**< \deprecated Event type: Autoload table changes. */584/** \endcond */585586PA_SUBSCRIPTION_EVENT_CARD = 0x0009U,587/**< Event type: Card \since 0.9.15 */588589PA_SUBSCRIPTION_EVENT_FACILITY_MASK = 0x000FU,590/**< A mask to extract the event type from an event value */591592PA_SUBSCRIPTION_EVENT_NEW = 0x0000U,593/**< A new object was created */594595PA_SUBSCRIPTION_EVENT_CHANGE = 0x0010U,596/**< A property of the object was modified */597598PA_SUBSCRIPTION_EVENT_REMOVE = 0x0020U,599/**< An object was removed */600601PA_SUBSCRIPTION_EVENT_TYPE_MASK = 0x0030U602/**< A mask to extract the event operation from an event value */603604} pa_subscription_event_type_t;605606/** Return one if an event type t matches an event mask bitfield */607#define pa_subscription_match_flags(m, t) (!!((m) & (1 << ((t) & PA_SUBSCRIPTION_EVENT_FACILITY_MASK))))608609/** \cond fulldocs */610#define PA_SUBSCRIPTION_MASK_NULL PA_SUBSCRIPTION_MASK_NULL611#define PA_SUBSCRIPTION_MASK_SINK PA_SUBSCRIPTION_MASK_SINK612#define PA_SUBSCRIPTION_MASK_SOURCE PA_SUBSCRIPTION_MASK_SOURCE613#define PA_SUBSCRIPTION_MASK_SINK_INPUT PA_SUBSCRIPTION_MASK_SINK_INPUT614#define PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT615#define PA_SUBSCRIPTION_MASK_MODULE PA_SUBSCRIPTION_MASK_MODULE616#define PA_SUBSCRIPTION_MASK_CLIENT PA_SUBSCRIPTION_MASK_CLIENT617#define PA_SUBSCRIPTION_MASK_SAMPLE_CACHE PA_SUBSCRIPTION_MASK_SAMPLE_CACHE618#define PA_SUBSCRIPTION_MASK_SERVER PA_SUBSCRIPTION_MASK_SERVER619#define PA_SUBSCRIPTION_MASK_AUTOLOAD PA_SUBSCRIPTION_MASK_AUTOLOAD620#define PA_SUBSCRIPTION_MASK_CARD PA_SUBSCRIPTION_MASK_CARD621#define PA_SUBSCRIPTION_MASK_ALL PA_SUBSCRIPTION_MASK_ALL622#define PA_SUBSCRIPTION_EVENT_SINK PA_SUBSCRIPTION_EVENT_SINK623#define PA_SUBSCRIPTION_EVENT_SOURCE PA_SUBSCRIPTION_EVENT_SOURCE624#define PA_SUBSCRIPTION_EVENT_SINK_INPUT PA_SUBSCRIPTION_EVENT_SINK_INPUT625#define PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT626#define PA_SUBSCRIPTION_EVENT_MODULE PA_SUBSCRIPTION_EVENT_MODULE627#define PA_SUBSCRIPTION_EVENT_CLIENT PA_SUBSCRIPTION_EVENT_CLIENT628#define PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE629#define PA_SUBSCRIPTION_EVENT_SERVER PA_SUBSCRIPTION_EVENT_SERVER630#define PA_SUBSCRIPTION_EVENT_AUTOLOAD PA_SUBSCRIPTION_EVENT_AUTOLOAD631#define PA_SUBSCRIPTION_EVENT_CARD PA_SUBSCRIPTION_EVENT_CARD632#define PA_SUBSCRIPTION_EVENT_FACILITY_MASK PA_SUBSCRIPTION_EVENT_FACILITY_MASK633#define PA_SUBSCRIPTION_EVENT_NEW PA_SUBSCRIPTION_EVENT_NEW634#define PA_SUBSCRIPTION_EVENT_CHANGE PA_SUBSCRIPTION_EVENT_CHANGE635#define PA_SUBSCRIPTION_EVENT_REMOVE PA_SUBSCRIPTION_EVENT_REMOVE636#define PA_SUBSCRIPTION_EVENT_TYPE_MASK PA_SUBSCRIPTION_EVENT_TYPE_MASK637/** \endcond */638639/** A structure for all kinds of timing information of a stream. See640* pa_stream_update_timing_info() and pa_stream_get_timing_info(). The641* total output latency a sample that is written with642* pa_stream_write() takes to be played may be estimated by643* sink_usec+buffer_usec+transport_usec. (where buffer_usec is defined644* as pa_bytes_to_usec(write_index-read_index)) The output buffer645* which buffer_usec relates to may be manipulated freely (with646* pa_stream_write()'s seek argument, pa_stream_flush() and friends),647* the buffers sink_usec and source_usec relate to are first-in648* first-out (FIFO) buffers which cannot be flushed or manipulated in649* any way. The total input latency a sample that is recorded takes to650* be delivered to the application is:651* source_usec+buffer_usec+transport_usec-sink_usec. (Take care of652* sign issues!) When connected to a monitor source sink_usec contains653* the latency of the owning sink. The two latency estimations654* described here are implemented in pa_stream_get_latency(). Please655* note that this structure can be extended as part of evolutionary656* API updates at any time in any new release.*/657typedef struct pa_timing_info {658struct timeval timestamp;659/**< The time when this timing info structure was current */660661int synchronized_clocks;662/**< Non-zero if the local and the remote machine have663* synchronized clocks. If synchronized clocks are detected664* transport_usec becomes much more reliable. However, the code665* that detects synchronized clocks is very limited and unreliable666* itself. */667668pa_usec_t sink_usec;669/**< Time in usecs a sample takes to be played on the sink. For670* playback streams and record streams connected to a monitor671* source. */672673pa_usec_t source_usec;674/**< Time in usecs a sample takes from being recorded to being675* delivered to the application. Only for record streams. */676677pa_usec_t transport_usec;678/**< Estimated time in usecs a sample takes to be transferred679* to/from the daemon. For both playback and record streams. */680681int playing;682/**< Non-zero when the stream is currently not underrun and data683* is being passed on to the device. Only for playback684* streams. This field does not say whether the data is actually685* already being played. To determine this check whether686* since_underrun (converted to usec) is larger than sink_usec.*/687688int write_index_corrupt;689/**< Non-zero if write_index is not up-to-date because a local690* write command that corrupted it has been issued in the time691* since this latency info was current . Only write commands with692* SEEK_RELATIVE_ON_READ and SEEK_RELATIVE_END can corrupt693* write_index. */694695int64_t write_index;696/**< Current write index into the playback buffer in bytes. Think697* twice before using this for seeking purposes: it might be out698* of date a the time you want to use it. Consider using699* PA_SEEK_RELATIVE instead. */700701int read_index_corrupt;702/**< Non-zero if read_index is not up-to-date because a local703* pause or flush request that corrupted it has been issued in the704* time since this latency info was current. */705706int64_t read_index;707/**< Current read index into the playback buffer in bytes. Think708* twice before using this for seeking purposes: it might be out709* of date a the time you want to use it. Consider using710* PA_SEEK_RELATIVE_ON_READ instead. */711712pa_usec_t configured_sink_usec;713/**< The configured latency for the sink. \since 0.9.11 */714715pa_usec_t configured_source_usec;716/**< The configured latency for the source. \since 0.9.11 */717718int64_t since_underrun;719/**< Bytes that were handed to the sink since the last underrun720* happened, or since playback started again after the last721* underrun. playing will tell you which case it is. \since722* 0.9.11 */723724} pa_timing_info;725726/** A structure for the spawn api. This may be used to integrate auto727* spawned daemons into your application. For more information see728* pa_context_connect(). When spawning a new child process the729* waitpid() is used on the child's PID. The spawn routine will not730* block or ignore SIGCHLD signals, since this cannot be done in a731* thread compatible way. You might have to do this in732* prefork/postfork. */733typedef struct pa_spawn_api {734void (*prefork)(void);735/**< Is called just before the fork in the parent process. May be736* NULL. */737738void (*postfork)(void);739/**< Is called immediately after the fork in the parent740* process. May be NULL.*/741742void (*atfork)(void);743/**< Is called immediately after the fork in the child744* process. May be NULL. It is not safe to close all file745* descriptors in this function unconditionally, since a UNIX746* socket (created using socketpair()) is passed to the new747* process. */748} pa_spawn_api;749750/** Seek type for pa_stream_write(). */751typedef enum pa_seek_mode {752PA_SEEK_RELATIVE = 0,753/**< Seek relatively to the write index */754755PA_SEEK_ABSOLUTE = 1,756/**< Seek relatively to the start of the buffer queue */757758PA_SEEK_RELATIVE_ON_READ = 2,759/**< Seek relatively to the read index. */760761PA_SEEK_RELATIVE_END = 3762/**< Seek relatively to the current end of the buffer queue. */763} pa_seek_mode_t;764765/** \cond fulldocs */766#define PA_SEEK_RELATIVE PA_SEEK_RELATIVE767#define PA_SEEK_ABSOLUTE PA_SEEK_ABSOLUTE768#define PA_SEEK_RELATIVE_ON_READ PA_SEEK_RELATIVE_ON_READ769#define PA_SEEK_RELATIVE_END PA_SEEK_RELATIVE_END770/** \endcond */771772/** Special sink flags. */773typedef enum pa_sink_flags {774PA_SINK_NOFLAGS = 0x0000U,775/**< Flag to pass when no specific options are needed (used to avoid casting) \since 0.9.19 */776777PA_SINK_HW_VOLUME_CTRL = 0x0001U,778/**< Supports hardware volume control. This is a dynamic flag and may779* change at runtime after the sink has initialized */780781PA_SINK_LATENCY = 0x0002U,782/**< Supports latency querying */783784PA_SINK_HARDWARE = 0x0004U,785/**< Is a hardware sink of some kind, in contrast to786* "virtual"/software sinks \since 0.9.3 */787788PA_SINK_NETWORK = 0x0008U,789/**< Is a networked sink of some kind. \since 0.9.7 */790791PA_SINK_HW_MUTE_CTRL = 0x0010U,792/**< Supports hardware mute control. This is a dynamic flag and may793* change at runtime after the sink has initialized \since 0.9.11 */794795PA_SINK_DECIBEL_VOLUME = 0x0020U,796/**< Volume can be translated to dB with pa_sw_volume_to_dB(). This is a797* dynamic flag and may change at runtime after the sink has initialized798* \since 0.9.11 */799800PA_SINK_FLAT_VOLUME = 0x0040U,801/**< This sink is in flat volume mode, i.e.\ always the maximum of802* the volume of all connected inputs. \since 0.9.15 */803804PA_SINK_DYNAMIC_LATENCY = 0x0080U,805/**< The latency can be adjusted dynamically depending on the806* needs of the connected streams. \since 0.9.15 */807808PA_SINK_SET_FORMATS = 0x0100U,809/**< The sink allows setting what formats are supported by the connected810* hardware. The actual functionality to do this might be provided by an811* extension. \since 1.0 */812813#ifdef __INCLUDED_FROM_PULSE_AUDIO814/** \cond fulldocs */815/* PRIVATE: Server-side values -- do not try to use these at client-side.816* The server will filter out these flags anyway, so you should never see817* these flags in sinks. */818819PA_SINK_SHARE_VOLUME_WITH_MASTER = 0x1000000U,820/**< This sink shares the volume with the master sink (used by some filter821* sinks). */822823PA_SINK_DEFERRED_VOLUME = 0x2000000U,824/**< The HW volume changes are syncronized with SW volume. */825/** \endcond */826#endif827828} pa_sink_flags_t;829830/** \cond fulldocs */831#define PA_SINK_HW_VOLUME_CTRL PA_SINK_HW_VOLUME_CTRL832#define PA_SINK_LATENCY PA_SINK_LATENCY833#define PA_SINK_HARDWARE PA_SINK_HARDWARE834#define PA_SINK_NETWORK PA_SINK_NETWORK835#define PA_SINK_HW_MUTE_CTRL PA_SINK_HW_MUTE_CTRL836#define PA_SINK_DECIBEL_VOLUME PA_SINK_DECIBEL_VOLUME837#define PA_SINK_FLAT_VOLUME PA_SINK_FLAT_VOLUME838#define PA_SINK_DYNAMIC_LATENCY PA_SINK_DYNAMIC_LATENCY839#define PA_SINK_SET_FORMATS PA_SINK_SET_FORMATS840#ifdef __INCLUDED_FROM_PULSE_AUDIO841#define PA_SINK_CLIENT_FLAGS_MASK 0xFFFFFF842#endif843844/** \endcond */845846/** Sink state. \since 0.9.15 */847typedef enum pa_sink_state { /* enum serialized in u8 */848PA_SINK_INVALID_STATE = -1,849/**< This state is used when the server does not support sink state introspection \since 0.9.15 */850851PA_SINK_RUNNING = 0,852/**< Running, sink is playing and used by at least one non-corked sink-input \since 0.9.15 */853854PA_SINK_IDLE = 1,855/**< When idle, the sink is playing but there is no non-corked sink-input attached to it \since 0.9.15 */856857PA_SINK_SUSPENDED = 2,858/**< When suspended, actual sink access can be closed, for instance \since 0.9.15 */859860/** \cond fulldocs */861/* PRIVATE: Server-side values -- DO NOT USE THIS ON THE CLIENT862* SIDE! These values are *not* considered part of the official PA863* API/ABI. If you use them your application might break when PA864* is upgraded. Also, please note that these values are not useful865* on the client side anyway. */866867PA_SINK_INIT = -2,868/**< Initialization state */869870PA_SINK_UNLINKED = -3871/**< The state when the sink is getting unregistered and removed from client access */872/** \endcond */873874} pa_sink_state_t;875876/** Returns non-zero if sink is playing: running or idle. \since 0.9.15 */877static inline int PA_SINK_IS_OPENED(pa_sink_state_t x) {878return x == PA_SINK_RUNNING || x == PA_SINK_IDLE;879}880881/** Returns non-zero if sink is running. \since 1.0 */882static inline int PA_SINK_IS_RUNNING(pa_sink_state_t x) {883return x == PA_SINK_RUNNING;884}885886/** \cond fulldocs */887#define PA_SINK_INVALID_STATE PA_SINK_INVALID_STATE888#define PA_SINK_RUNNING PA_SINK_RUNNING889#define PA_SINK_IDLE PA_SINK_IDLE890#define PA_SINK_SUSPENDED PA_SINK_SUSPENDED891#define PA_SINK_INIT PA_SINK_INIT892#define PA_SINK_UNLINKED PA_SINK_UNLINKED893#define PA_SINK_IS_OPENED PA_SINK_IS_OPENED894/** \endcond */895896/** Special source flags. */897typedef enum pa_source_flags {898PA_SOURCE_NOFLAGS = 0x0000U,899/**< Flag to pass when no specific options are needed (used to avoid casting) \since 0.9.19 */900901PA_SOURCE_HW_VOLUME_CTRL = 0x0001U,902/**< Supports hardware volume control. This is a dynamic flag and may903* change at runtime after the source has initialized */904905PA_SOURCE_LATENCY = 0x0002U,906/**< Supports latency querying */907908PA_SOURCE_HARDWARE = 0x0004U,909/**< Is a hardware source of some kind, in contrast to910* "virtual"/software source \since 0.9.3 */911912PA_SOURCE_NETWORK = 0x0008U,913/**< Is a networked source of some kind. \since 0.9.7 */914915PA_SOURCE_HW_MUTE_CTRL = 0x0010U,916/**< Supports hardware mute control. This is a dynamic flag and may917* change at runtime after the source has initialized \since 0.9.11 */918919PA_SOURCE_DECIBEL_VOLUME = 0x0020U,920/**< Volume can be translated to dB with pa_sw_volume_to_dB(). This is a921* dynamic flag and may change at runtime after the source has initialized922* \since 0.9.11 */923924PA_SOURCE_DYNAMIC_LATENCY = 0x0040U,925/**< The latency can be adjusted dynamically depending on the926* needs of the connected streams. \since 0.9.15 */927928PA_SOURCE_FLAT_VOLUME = 0x0080U,929/**< This source is in flat volume mode, i.e.\ always the maximum of930* the volume of all connected outputs. \since 1.0 */931932#ifdef __INCLUDED_FROM_PULSE_AUDIO933/** \cond fulldocs */934/* PRIVATE: Server-side values -- do not try to use these at client-side.935* The server will filter out these flags anyway, so you should never see936* these flags in sources. */937938PA_SOURCE_SHARE_VOLUME_WITH_MASTER = 0x1000000U,939/**< This source shares the volume with the master source (used by some filter940* sources). */941942PA_SOURCE_DEFERRED_VOLUME = 0x2000000U,943/**< The HW volume changes are syncronized with SW volume. */944#endif945} pa_source_flags_t;946947/** \cond fulldocs */948#define PA_SOURCE_HW_VOLUME_CTRL PA_SOURCE_HW_VOLUME_CTRL949#define PA_SOURCE_LATENCY PA_SOURCE_LATENCY950#define PA_SOURCE_HARDWARE PA_SOURCE_HARDWARE951#define PA_SOURCE_NETWORK PA_SOURCE_NETWORK952#define PA_SOURCE_HW_MUTE_CTRL PA_SOURCE_HW_MUTE_CTRL953#define PA_SOURCE_DECIBEL_VOLUME PA_SOURCE_DECIBEL_VOLUME954#define PA_SOURCE_DYNAMIC_LATENCY PA_SOURCE_DYNAMIC_LATENCY955#define PA_SOURCE_FLAT_VOLUME PA_SOURCE_FLAT_VOLUME956#ifdef __INCLUDED_FROM_PULSE_AUDIO957#define PA_SOURCE_CLIENT_FLAGS_MASK 0xFFFFFF958#endif959960/** \endcond */961962/** Source state. \since 0.9.15 */963typedef enum pa_source_state {964PA_SOURCE_INVALID_STATE = -1,965/**< This state is used when the server does not support source state introspection \since 0.9.15 */966967PA_SOURCE_RUNNING = 0,968/**< Running, source is recording and used by at least one non-corked source-output \since 0.9.15 */969970PA_SOURCE_IDLE = 1,971/**< When idle, the source is still recording but there is no non-corked source-output \since 0.9.15 */972973PA_SOURCE_SUSPENDED = 2,974/**< When suspended, actual source access can be closed, for instance \since 0.9.15 */975976/** \cond fulldocs */977/* PRIVATE: Server-side values -- DO NOT USE THIS ON THE CLIENT978* SIDE! These values are *not* considered part of the official PA979* API/ABI. If you use them your application might break when PA980* is upgraded. Also, please note that these values are not useful981* on the client side anyway. */982983PA_SOURCE_INIT = -2,984/**< Initialization state */985986PA_SOURCE_UNLINKED = -3987/**< The state when the source is getting unregistered and removed from client access */988/** \endcond */989990} pa_source_state_t;991992/** Returns non-zero if source is recording: running or idle. \since 0.9.15 */993static inline int PA_SOURCE_IS_OPENED(pa_source_state_t x) {994return x == PA_SOURCE_RUNNING || x == PA_SOURCE_IDLE;995}996997/** Returns non-zero if source is running \since 1.0 */998static inline int PA_SOURCE_IS_RUNNING(pa_source_state_t x) {999return x == PA_SOURCE_RUNNING;1000}10011002/** \cond fulldocs */1003#define PA_SOURCE_INVALID_STATE PA_SOURCE_INVALID_STATE1004#define PA_SOURCE_RUNNING PA_SOURCE_RUNNING1005#define PA_SOURCE_IDLE PA_SOURCE_IDLE1006#define PA_SOURCE_SUSPENDED PA_SOURCE_SUSPENDED1007#define PA_SOURCE_INIT PA_SOURCE_INIT1008#define PA_SOURCE_UNLINKED PA_SOURCE_UNLINKED1009#define PA_SOURCE_IS_OPENED PA_SOURCE_IS_OPENED1010/** \endcond */10111012/** A generic free() like callback prototype */1013typedef void (*pa_free_cb_t)(void *p);10141015/** A stream policy/meta event requesting that an application should1016* cork a specific stream. See pa_stream_event_cb_t for more1017* information. \since 0.9.15 */1018#define PA_STREAM_EVENT_REQUEST_CORK "request-cork"10191020/** A stream policy/meta event requesting that an application should1021* cork a specific stream. See pa_stream_event_cb_t for more1022* information, \since 0.9.15 */1023#define PA_STREAM_EVENT_REQUEST_UNCORK "request-uncork"10241025/** A stream event notifying that the stream is going to be1026* disconnected because the underlying sink changed and no longer1027* supports the format that was originally negotiated. Clients need1028* to connect a new stream to renegotiate a format and continue1029* playback. \since 1.0 */1030#define PA_STREAM_EVENT_FORMAT_LOST "format-lost"10311032#ifndef __INCLUDED_FROM_PULSE_AUDIO1033/** Port availability / jack detection status1034* \since 2.0 */1035typedef enum pa_port_available {1036PA_PORT_AVAILABLE_UNKNOWN = 0, /**< This port does not support jack detection \since 2.0 */1037PA_PORT_AVAILABLE_NO = 1, /**< This port is not available, likely because the jack is not plugged in. \since 2.0 */1038PA_PORT_AVAILABLE_YES = 2, /**< This port is available, likely because the jack is plugged in. \since 2.0 */1039} pa_port_available_t;10401041/** \cond fulldocs */1042#define PA_PORT_AVAILABLE_UNKNOWN PA_PORT_AVAILABLE_UNKNOWN1043#define PA_PORT_AVAILABLE_NO PA_PORT_AVAILABLE_NO1044#define PA_PORT_AVAILABLE_YES PA_PORT_AVAILABLE_YES10451046/** \endcond */1047#endif10481049PA_C_DECL_END10501051#endif105210531054