1 #ifndef foointernalhfoo
2 #define foointernalhfoo
5 This file is part of PulseAudio.
7 Copyright 2004-2006 Lennart Poettering
8 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
10 PulseAudio is free software; you can redistribute it and/or modify
11 it under the terms of the GNU Lesser General Public License as published
12 by the Free Software Foundation; either version 2.1 of the License,
13 or (at your option) any later version.
15 PulseAudio is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public License
21 along with PulseAudio; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26 #include <pulse/mainloop-api.h>
27 #include <pulse/context.h>
28 #include <pulse/stream.h>
29 #include <pulse/operation.h>
30 #include <pulse/subscribe.h>
31 #include <pulse/ext-device-manager.h>
32 #include <pulse/ext-device-restore.h>
33 #include <pulse/ext-stream-restore.h>
34 #include <pulse/ext-node-manager.h>
36 #include <pulsecore/socket-client.h>
37 #include <pulsecore/pstream.h>
38 #include <pulsecore/pdispatch.h>
39 #include <pulsecore/llist.h>
40 #include <pulsecore/native-common.h>
41 #include <pulsecore/strlist.h>
42 #include <pulsecore/mcalign.h>
43 #include <pulsecore/memblockq.h>
44 #include <pulsecore/hashmap.h>
45 #include <pulsecore/refcnt.h>
46 #include <pulsecore/time-smoother.h>
48 #include <pulsecore/dbus-util.h>
51 #include "client-conf.h"
53 #define DEFAULT_TIMEOUT (30)
59 pa_dbus_wrap_connection *system_bus;
60 pa_dbus_wrap_connection *session_bus;
63 pa_proplist *proplist;
64 pa_mainloop_api* mainloop;
66 pa_socket_client *client;
68 pa_pdispatch *pdispatch;
70 pa_hashmap *record_streams, *playback_streams;
71 PA_LLIST_HEAD(pa_stream, streams);
72 PA_LLIST_HEAD(pa_operation, operations);
78 pa_context_state_t state;
80 pa_context_notify_cb_t state_callback;
82 pa_context_subscribe_cb_t subscribe_callback;
83 void *subscribe_userdata;
84 pa_context_event_cb_t event_callback;
91 pa_bool_t server_specified:1;
93 pa_bool_t do_autospawn:1;
94 pa_bool_t use_rtclock:1;
95 pa_bool_t filter_added:1;
96 pa_spawn_api spawn_api;
98 pa_strlist *server_list;
102 pa_client_conf *conf;
104 uint32_t client_index;
106 /* Extension specific data */
108 pa_ext_device_manager_subscribe_cb_t callback;
110 } ext_device_manager;
112 pa_ext_device_restore_subscribe_cb_t callback;
114 } ext_device_restore;
116 pa_ext_stream_restore_subscribe_cb_t callback;
118 } ext_stream_restore;
120 pa_ext_node_manager_subscribe_cb_t callback;
125 #define PA_MAX_WRITE_INDEX_CORRECTIONS 32
127 typedef struct pa_index_correction {
131 pa_bool_t absolute:1;
133 } pa_index_correction;
135 #define PA_MAX_FORMATS (PA_ENCODING_MAX)
139 PA_LLIST_FIELDS(pa_stream);
142 pa_mainloop_api *mainloop;
144 uint32_t direct_on_input;
146 pa_stream_direction_t direction;
147 pa_stream_state_t state;
148 pa_stream_flags_t flags;
150 pa_sample_spec sample_spec;
151 pa_channel_map channel_map;
153 pa_format_info *req_formats[PA_MAX_FORMATS];
154 pa_format_info *format;
156 pa_proplist *proplist;
158 pa_bool_t channel_valid:1;
159 pa_bool_t suspended:1;
161 pa_bool_t timing_info_valid:1;
162 pa_bool_t auto_timing_update_requested:1;
166 uint32_t stream_index;
168 int64_t requested_bytes;
169 pa_buffer_attr buffer_attr;
171 uint32_t device_index;
175 pa_memblock *write_memblock;
177 int64_t latest_underrun_at_index;
180 pa_memchunk peek_memchunk;
182 pa_memblockq *record_memblockq;
184 /* Store latest latency info */
185 pa_timing_info timing_info;
187 /* Use to make sure that time advances monotonically */
188 pa_usec_t previous_time;
190 /* time updates with tags older than these are invalid */
191 uint32_t write_index_not_before;
192 uint32_t read_index_not_before;
194 /* Data about individual timing update corrections */
195 pa_index_correction write_index_corrections[PA_MAX_WRITE_INDEX_CORRECTIONS];
196 int current_write_index_correction;
198 /* Latency interpolation stuff */
199 pa_time_event *auto_timing_update_event;
200 pa_usec_t auto_timing_interval_usec;
202 pa_smoother *smoother;
205 pa_stream_notify_cb_t state_callback;
206 void *state_userdata;
207 pa_stream_request_cb_t read_callback;
209 pa_stream_request_cb_t write_callback;
210 void *write_userdata;
211 pa_stream_notify_cb_t overflow_callback;
212 void *overflow_userdata;
213 pa_stream_notify_cb_t underflow_callback;
214 void *underflow_userdata;
215 pa_stream_notify_cb_t latency_update_callback;
216 void *latency_update_userdata;
217 pa_stream_notify_cb_t moved_callback;
218 void *moved_userdata;
219 pa_stream_notify_cb_t suspended_callback;
220 void *suspended_userdata;
221 pa_stream_notify_cb_t started_callback;
222 void *started_userdata;
223 pa_stream_event_cb_t event_callback;
224 void *event_userdata;
225 pa_stream_notify_cb_t buffer_attr_callback;
226 void *buffer_attr_userdata;
229 typedef void (*pa_operation_cb_t)(void);
231 struct pa_operation {
237 PA_LLIST_FIELDS(pa_operation);
239 pa_operation_state_t state;
241 pa_operation_cb_t callback;
243 void *private; /* some operations might need this */
246 void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
247 void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
248 void pa_command_subscribe_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
249 void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
250 void pa_command_stream_suspended(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
251 void pa_command_stream_moved(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
252 void pa_command_stream_started(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
253 void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
254 void pa_command_client_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
255 void pa_command_stream_buffer_attr(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
257 pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t callback, void *userdata);
258 void pa_operation_done(pa_operation *o);
260 void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
261 void pa_stream_disconnect_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
262 void pa_context_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
263 void pa_stream_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
265 void pa_context_fail(pa_context *c, int error);
266 int pa_context_set_error(pa_context *c, int error);
267 void pa_context_set_state(pa_context *c, pa_context_state_t st);
268 int pa_context_handle_error(pa_context *c, uint32_t command, pa_tagstruct *t, pa_bool_t fail);
269 pa_operation* pa_context_send_simple_command(pa_context *c, uint32_t command, void (*internal_callback)(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata), void (*cb)(void), void *userdata);
271 void pa_stream_set_state(pa_stream *s, pa_stream_state_t st);
273 pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *tag);
275 #define PA_CHECK_VALIDITY(context, expression, error) \
278 return -pa_context_set_error((context), (error)); \
282 #define PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, value) \
284 if (!(expression)) { \
285 pa_context_set_error((context), (error)); \
290 #define PA_CHECK_VALIDITY_RETURN_NULL(context, expression, error) \
291 PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, NULL)
293 #define PA_FAIL(context, error) \
295 return -pa_context_set_error((context), (error)); \
298 #define PA_FAIL_RETURN_ANY(context, error, value) \
300 pa_context_set_error((context), (error)); \
304 #define PA_FAIL_RETURN_NULL(context, error) \
305 PA_FAIL_RETURN_ANY(context, error, NULL)
307 void pa_ext_device_manager_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
308 void pa_ext_device_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
309 void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
310 void pa_ext_node_manager_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
312 void pa_format_info_free2(pa_format_info *f, void *userdata);
314 pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m);