core: introduce pa_{sink_input|source_output}_fail_move()
[profile/ivi/pulseaudio-panda.git] / src / pulsecore / source-output.h
1 #ifndef foopulsesourceoutputhfoo
2 #define foopulsesourceoutputhfoo
3
4 /***
5   This file is part of PulseAudio.
6
7   Copyright 2004-2006 Lennart Poettering
8
9   PulseAudio is free software; you can redistribute it and/or modify
10   it under the terms of the GNU Lesser General Public License as published
11   by the Free Software Foundation; either version 2.1 of the License,
12   or (at your option) any later version.
13
14   PulseAudio is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with PulseAudio; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22   USA.
23 ***/
24
25 #include <inttypes.h>
26
27 typedef struct pa_source_output pa_source_output;
28
29 #include <pulse/sample.h>
30 #include <pulsecore/source.h>
31 #include <pulsecore/memblockq.h>
32 #include <pulsecore/resampler.h>
33 #include <pulsecore/module.h>
34 #include <pulsecore/client.h>
35 #include <pulsecore/sink-input.h>
36
37 typedef enum pa_source_output_state {
38     PA_SOURCE_OUTPUT_INIT,
39     PA_SOURCE_OUTPUT_RUNNING,
40     PA_SOURCE_OUTPUT_CORKED,
41     PA_SOURCE_OUTPUT_UNLINKED
42 } pa_source_output_state_t;
43
44 static inline pa_bool_t PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_state_t x) {
45     return x == PA_SOURCE_OUTPUT_RUNNING || x == PA_SOURCE_OUTPUT_CORKED;
46 }
47
48 typedef enum pa_source_output_flags {
49     PA_SOURCE_OUTPUT_VARIABLE_RATE = 1,
50     PA_SOURCE_OUTPUT_DONT_MOVE = 2,
51     PA_SOURCE_OUTPUT_START_CORKED = 4,
52     PA_SOURCE_OUTPUT_NO_REMAP = 8,
53     PA_SOURCE_OUTPUT_NO_REMIX = 16,
54     PA_SOURCE_OUTPUT_FIX_FORMAT = 32,
55     PA_SOURCE_OUTPUT_FIX_RATE = 64,
56     PA_SOURCE_OUTPUT_FIX_CHANNELS = 128,
57     PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND = 256,
58     PA_SOURCE_OUTPUT_FAIL_ON_SUSPEND = 512
59 } pa_source_output_flags_t;
60
61 struct pa_source_output {
62     pa_msgobject parent;
63
64     uint32_t index;
65     pa_core *core;
66
67     pa_source_output_state_t state;
68     pa_source_output_flags_t flags;
69
70     char *driver;                         /* may be NULL */
71     pa_proplist *proplist;
72
73     pa_module *module;                    /* may be NULL */
74     pa_client *client;                    /* may be NULL */
75
76     pa_source *source; /* NULL while being moved */
77
78     /* A source output can monitor just a single input of a sink, in which case we find it here */
79     pa_sink_input *direct_on_input;       /* may be NULL */
80
81     pa_sample_spec sample_spec;
82     pa_channel_map channel_map;
83
84     /* if TRUE then the source we are connected to is worth
85      * remembering, i.e. was explicitly chosen by the user and not
86      * automatically. module-stream-restore looks for this.*/
87     pa_bool_t save_source:1;
88
89     pa_resample_method_t requested_resample_method, actual_resample_method;
90
91     /* Pushes a new memchunk into the output. Called from IO thread
92      * context. */
93     void (*push)(pa_source_output *o, const pa_memchunk *chunk); /* may NOT be NULL */
94
95     /* Only relevant for monitor sources right now: called when the
96      * recorded stream is rewound. Called from IO context */
97     void (*process_rewind)(pa_source_output *o, size_t nbytes); /* may be NULL */
98
99     /* Called whenever the maximum rewindable size of the source
100      * changes. Called from IO thread context. */
101     void (*update_max_rewind) (pa_source_output *o, size_t nbytes); /* may be NULL */
102
103     /* Called whenever the configured latency of the source
104      * changes. Called from IO context. */
105     void (*update_source_requested_latency) (pa_source_output *o); /* may be NULL */
106
107     /* Called whenver the latency range of the source changes. Called
108      * from IO context. */
109     void (*update_source_latency_range) (pa_source_output *o); /* may be NULL */
110
111     /* If non-NULL this function is called when the output is first
112      * connected to a source. Called from IO thread context */
113     void (*attach) (pa_source_output *o);           /* may be NULL */
114
115     /* If non-NULL this function is called when the output is
116      * disconnected from its source. Called from IO thread context */
117     void (*detach) (pa_source_output *o);           /* may be NULL */
118
119     /* If non-NULL called whenever the source this output is attached
120      * to suspends or resumes. Called from main context */
121     void (*suspend) (pa_source_output *o, pa_bool_t b);   /* may be NULL */
122
123     /* If non-NULL called whenever the source this output is attached
124      * to suspends or resumes. Called from IO context */
125     void (*suspend_within_thread) (pa_source_output *o, pa_bool_t b);   /* may be NULL */
126
127     /* If non-NULL called whenever the source output is moved to a new
128      * source. Called from main context after the stream was detached
129      * from the old source and before it is attached to the new
130      * source. If dest is NULL the move was executed in two
131      * phases and the second one failed; the stream will be destroyed
132      * after this call. */
133     void (*moving) (pa_source_output *o, pa_source *dest);   /* may be NULL */
134
135     /* Supposed to unlink and destroy this stream. Called from main
136      * context. */
137     void (*kill)(pa_source_output* o);              /* may NOT be NULL */
138
139     /* Return the current latency (i.e. length of bufferd audio) of
140     this stream. Called from main context. This is added to what the
141     PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message sent to the IO thread
142     returns */
143     pa_usec_t (*get_latency) (pa_source_output *o); /* may be NULL */
144
145     /* If non-NULL this function is called from thread context if the
146      * state changes. The old state is found in thread_info.state.  */
147     void (*state_change) (pa_source_output *o, pa_source_output_state_t state); /* may be NULL */
148
149     /* If non-NULL this function is called before this source output
150      * is moved to a source and if it returns FALSE the move
151      * will not be allowed */
152     pa_bool_t (*may_move_to) (pa_source_output *o, pa_source *s); /* may be NULL */
153
154     /* If non-NULL this function is used to dispatch asynchronous
155      * control events. */
156     void (*send_event)(pa_source_output *o, const char *event, pa_proplist* data);
157
158     struct {
159         pa_source_output_state_t state;
160
161         pa_bool_t attached:1; /* True only between ->attach() and ->detach() calls */
162
163         pa_sample_spec sample_spec;
164
165         pa_resampler* resampler;              /* may be NULL */
166
167         /* We maintain a delay memblockq here for source outputs that
168          * don't implement rewind() */
169         pa_memblockq *delay_memblockq;
170
171         /* The requested latency for the source */
172         pa_usec_t requested_source_latency;
173
174         pa_sink_input *direct_on_input;       /* may be NULL */
175     } thread_info;
176
177     void *userdata;
178 };
179
180 PA_DECLARE_CLASS(pa_source_output);
181 #define PA_SOURCE_OUTPUT(o) pa_source_output_cast(o)
182
183 enum {
184     PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY,
185     PA_SOURCE_OUTPUT_MESSAGE_SET_RATE,
186     PA_SOURCE_OUTPUT_MESSAGE_SET_STATE,
187     PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY,
188     PA_SOURCE_OUTPUT_MESSAGE_GET_REQUESTED_LATENCY,
189     PA_SOURCE_OUTPUT_MESSAGE_MAX
190 };
191
192 typedef struct pa_source_output_send_event_hook_data {
193     pa_source_output *source_output;
194     const char *event;
195     pa_proplist *data;
196 } pa_source_output_send_event_hook_data;
197
198 typedef struct pa_source_output_new_data {
199     pa_proplist *proplist;
200     pa_sink_input *direct_on_input;
201
202     const char *driver;
203     pa_module *module;
204     pa_client *client;
205
206     pa_source *source;
207
208     pa_resample_method_t resample_method;
209
210     pa_sample_spec sample_spec;
211     pa_channel_map channel_map;
212
213     pa_bool_t sample_spec_is_set:1;
214     pa_bool_t channel_map_is_set:1;
215
216     pa_bool_t save_source:1;
217 } pa_source_output_new_data;
218
219 pa_source_output_new_data* pa_source_output_new_data_init(pa_source_output_new_data *data);
220 void pa_source_output_new_data_set_sample_spec(pa_source_output_new_data *data, const pa_sample_spec *spec);
221 void pa_source_output_new_data_set_channel_map(pa_source_output_new_data *data, const pa_channel_map *map);
222 void pa_source_output_new_data_done(pa_source_output_new_data *data);
223
224 /* To be called by the implementing module only */
225
226 int pa_source_output_new(
227         pa_source_output**o,
228         pa_core *core,
229         pa_source_output_new_data *data,
230         pa_source_output_flags_t flags);
231
232 void pa_source_output_put(pa_source_output *o);
233 void pa_source_output_unlink(pa_source_output*o);
234
235 void pa_source_output_set_name(pa_source_output *o, const char *name);
236
237 pa_usec_t pa_source_output_set_requested_latency(pa_source_output *o, pa_usec_t usec);
238
239 void pa_source_output_cork(pa_source_output *o, pa_bool_t b);
240
241 int pa_source_output_set_rate(pa_source_output *o, uint32_t rate);
242
243 size_t pa_source_output_get_max_rewind(pa_source_output *o);
244
245 /* Callable by everyone */
246
247 /* External code may request disconnection with this funcion */
248 void pa_source_output_kill(pa_source_output*o);
249
250 pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency);
251
252 void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p);
253
254 pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o);
255
256 void pa_source_output_send_event(pa_source_output *o, const char *name, pa_proplist *data);
257
258 pa_bool_t pa_source_output_may_move(pa_source_output *o);
259 pa_bool_t pa_source_output_may_move_to(pa_source_output *o, pa_source *dest);
260 int pa_source_output_move_to(pa_source_output *o, pa_source *dest, pa_bool_t save);
261
262 /* The same as pa_source_output_move_to() but in two seperate steps,
263  * first the detaching from the old source, then the attaching to the
264  * new source */
265 int pa_source_output_start_move(pa_source_output *o);
266 int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, pa_bool_t save);
267 void pa_source_output_fail_move(pa_source_output *o);
268
269 #define pa_source_output_get_state(o) ((o)->state)
270
271 pa_usec_t pa_source_output_get_requested_latency(pa_source_output *o);
272
273 /* To be used exclusively by the source driver thread */
274
275 void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk);
276 void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes);
277 void pa_source_output_update_max_rewind(pa_source_output *o, size_t nbytes);
278
279 void pa_source_output_set_state_within_thread(pa_source_output *o, pa_source_output_state_t state);
280
281 int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, int64_t offset, pa_memchunk *chunk);
282
283 pa_usec_t pa_source_output_set_requested_latency_within_thread(pa_source_output *o, pa_usec_t usec);
284
285 #define pa_source_output_assert_io_context(s) \
286     pa_assert(pa_thread_mq_get() || !PA_SOURCE_OUTPUT_IS_LINKED((s)->state))
287
288 #endif