]> code.delx.au - pulseaudio/blob - src/pulse/internal.h
Merge commit 'coling/lgpl21'
[pulseaudio] / src / pulse / internal.h
1 #ifndef foointernalhfoo
2 #define foointernalhfoo
3
4 /***
5 This file is part of PulseAudio.
6
7 Copyright 2004-2006 Lennart Poettering
8 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
9
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.
14
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.
19
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
23 USA.
24 ***/
25
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-stream-restore.h>
32
33 #include <pulsecore/socket-client.h>
34 #include <pulsecore/pstream.h>
35 #include <pulsecore/pdispatch.h>
36 #include <pulsecore/dynarray.h>
37 #include <pulsecore/llist.h>
38 #include <pulsecore/native-common.h>
39 #include <pulsecore/strlist.h>
40 #include <pulsecore/mcalign.h>
41 #include <pulsecore/memblockq.h>
42 #include <pulsecore/hashmap.h>
43 #include <pulsecore/refcnt.h>
44 #include <pulsecore/time-smoother.h>
45
46 #include "client-conf.h"
47
48 #define DEFAULT_TIMEOUT (30)
49
50 struct pa_context {
51 PA_REFCNT_DECLARE;
52
53 pa_proplist *proplist;
54 pa_mainloop_api* mainloop;
55
56 pa_socket_client *client;
57 pa_pstream *pstream;
58 pa_pdispatch *pdispatch;
59
60 pa_dynarray *record_streams, *playback_streams;
61 PA_LLIST_HEAD(pa_stream, streams);
62 PA_LLIST_HEAD(pa_operation, operations);
63
64 uint32_t version;
65 uint32_t ctag;
66 uint32_t csyncid;
67 int error;
68 pa_context_state_t state;
69
70 pa_context_notify_cb_t state_callback;
71 void *state_userdata;
72 pa_context_subscribe_cb_t subscribe_callback;
73 void *subscribe_userdata;
74 pa_context_event_cb_t event_callback;
75 void *event_userdata;
76
77 pa_mempool *mempool;
78
79 pa_bool_t is_local:1;
80 pa_bool_t do_shm:1;
81
82 pa_bool_t do_autospawn:1;
83 pa_spawn_api spawn_api;
84
85 pa_strlist *server_list;
86
87 char *server;
88
89 pa_client_conf *conf;
90
91 uint32_t client_index;
92
93 /* Extension specific data */
94 struct {
95 pa_ext_stream_restore_subscribe_cb_t callback;
96 void *userdata;
97 } ext_stream_restore;
98 };
99
100 #define PA_MAX_WRITE_INDEX_CORRECTIONS 32
101
102 typedef struct pa_index_correction {
103 uint32_t tag;
104 int64_t value;
105 pa_bool_t valid:1;
106 pa_bool_t absolute:1;
107 pa_bool_t corrupt:1;
108 } pa_index_correction;
109
110 struct pa_stream {
111 PA_REFCNT_DECLARE;
112 PA_LLIST_FIELDS(pa_stream);
113
114 pa_context *context;
115 pa_mainloop_api *mainloop;
116
117 uint32_t direct_on_input;
118
119 pa_stream_direction_t direction;
120 pa_stream_state_t state;
121 pa_stream_flags_t flags;
122
123 pa_sample_spec sample_spec;
124 pa_channel_map channel_map;
125
126 pa_proplist *proplist;
127
128 pa_bool_t channel_valid:1;
129 pa_bool_t suspended:1;
130 pa_bool_t corked:1;
131 pa_bool_t timing_info_valid:1;
132 pa_bool_t auto_timing_update_requested:1;
133
134 uint32_t channel;
135 uint32_t syncid;
136 uint32_t stream_index;
137
138 uint32_t requested_bytes;
139 pa_buffer_attr buffer_attr;
140
141 uint32_t device_index;
142 char *device_name;
143
144 pa_memchunk peek_memchunk;
145 void *peek_data;
146 pa_memblockq *record_memblockq;
147
148 /* Store latest latency info */
149 pa_timing_info timing_info;
150
151 /* Use to make sure that time advances monotonically */
152 pa_usec_t previous_time;
153
154 /* time updates with tags older than these are invalid */
155 uint32_t write_index_not_before;
156 uint32_t read_index_not_before;
157
158 /* Data about individual timing update correctoins */
159 pa_index_correction write_index_corrections[PA_MAX_WRITE_INDEX_CORRECTIONS];
160 int current_write_index_correction;
161
162 /* Latency interpolation stuff */
163 pa_time_event *auto_timing_update_event;
164
165 pa_smoother *smoother;
166
167 /* Callbacks */
168 pa_stream_notify_cb_t state_callback;
169 void *state_userdata;
170 pa_stream_request_cb_t read_callback;
171 void *read_userdata;
172 pa_stream_request_cb_t write_callback;
173 void *write_userdata;
174 pa_stream_notify_cb_t overflow_callback;
175 void *overflow_userdata;
176 pa_stream_notify_cb_t underflow_callback;
177 void *underflow_userdata;
178 pa_stream_notify_cb_t latency_update_callback;
179 void *latency_update_userdata;
180 pa_stream_notify_cb_t moved_callback;
181 void *moved_userdata;
182 pa_stream_notify_cb_t suspended_callback;
183 void *suspended_userdata;
184 pa_stream_notify_cb_t started_callback;
185 void *started_userdata;
186 pa_stream_event_cb_t event_callback;
187 void *event_userdata;
188 };
189
190 typedef void (*pa_operation_cb_t)(void);
191
192 struct pa_operation {
193 PA_REFCNT_DECLARE;
194
195 pa_context *context;
196 pa_stream *stream;
197
198 PA_LLIST_FIELDS(pa_operation);
199
200 pa_operation_state_t state;
201 void *userdata;
202 pa_operation_cb_t callback;
203
204 void *private; /* some operations might need this */
205 };
206
207 void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
208 void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
209 void pa_command_subscribe_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
210 void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
211 void pa_command_stream_suspended(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
212 void pa_command_stream_moved(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
213 void pa_command_stream_started(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
214 void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
215 void pa_command_client_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
216
217 pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t callback, void *userdata);
218 void pa_operation_done(pa_operation *o);
219
220 void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
221 void pa_stream_disconnect_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
222 void pa_context_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
223 void pa_stream_simple_ack_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
224
225 void pa_context_fail(pa_context *c, int error);
226 int pa_context_set_error(pa_context *c, int error);
227 void pa_context_set_state(pa_context *c, pa_context_state_t st);
228 int pa_context_handle_error(pa_context *c, uint32_t command, pa_tagstruct *t, pa_bool_t fail);
229 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);
230
231 void pa_stream_set_state(pa_stream *s, pa_stream_state_t st);
232
233 pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *tag);
234
235 #define PA_CHECK_VALIDITY(context, expression, error) \
236 do { \
237 if (!(expression)) \
238 return -pa_context_set_error((context), (error)); \
239 } while(FALSE)
240
241
242 #define PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, value) \
243 do { \
244 if (!(expression)) { \
245 pa_context_set_error((context), (error)); \
246 return value; \
247 } \
248 } while(FALSE)
249
250 #define PA_CHECK_VALIDITY_RETURN_NULL(context, expression, error) \
251 PA_CHECK_VALIDITY_RETURN_ANY(context, expression, error, NULL)
252
253 #define PA_FAIL(context, error) \
254 do { \
255 return -pa_context_set_error((context), (error)); \
256 } while(FALSE)
257
258 #define PA_FAIL_RETURN_ANY(context, error, value) \
259 do { \
260 pa_context_set_error((context), (error)); \
261 return value; \
262 } while(FALSE)
263
264 #define PA_FAIL_RETURN_NULL(context, error) \
265 PA_FAIL_RETURN_ANY(context, error, NULL)
266
267 void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
268
269 #endif