10
10
PulseAudio is free software; you can redistribute it and/or modify
11
11
it under the terms of the GNU Lesser General Public License as published
12
by the Free Software Foundation; either version 2 of the License,
12
by the Free Software Foundation; either version 2.1 of the License,
13
13
or (at your option) any later version.
15
15
PulseAudio is distributed in the hope that it will be useful, but
38
39
#include <pulsecore/refcnt.h>
39
40
#include <pulsecore/msgobject.h>
40
41
#include <pulsecore/rtpoll.h>
42
#include <pulsecore/card.h>
43
#include <pulsecore/queue.h>
42
45
#define PA_MAX_INPUTS_PER_SINK 32
44
typedef enum pa_sink_state {
52
static inline pa_bool_t PA_SINK_IS_OPENED(pa_sink_state_t x) {
53
return x == PA_SINK_RUNNING || x == PA_SINK_IDLE;
47
/* Returns true if sink is linked: registered and accessible from client side. */
56
48
static inline pa_bool_t PA_SINK_IS_LINKED(pa_sink_state_t x) {
57
49
return x == PA_SINK_RUNNING || x == PA_SINK_IDLE || x == PA_SINK_SUSPENDED;
79
72
pa_source *monitor_source;
74
pa_volume_t base_volume; /* shall be constant */
75
unsigned n_volume_steps; /* shall be constant */
77
/* Also see http://pulseaudio.org/wiki/InternalVolumes */
78
pa_cvolume virtual_volume; /* The volume clients are informed about */
79
pa_cvolume reference_volume; /* The volume taken as refernce base for relative sink input volumes */
80
pa_cvolume soft_volume; /* The internal software volume we apply to all PCM data while it passes through */
84
83
pa_bool_t refresh_volume:1;
85
84
pa_bool_t refresh_muted:1;
98
99
* context. If this is NULL a PA_SINK_MESSAGE_GET_VOLUME message
99
100
* will be sent to the IO thread instead. If refresh_volume is
100
101
* FALSE neither this function is called nor a message is sent. */
101
int (*get_volume)(pa_sink *s); /* may be NULL */
102
void (*get_volume)(pa_sink *s); /* may be NULL */
103
104
/* Called when the volume shall be changed. Called from main loop
104
105
* context. If this is NULL a PA_SINK_MESSAGE_SET_VOLUME message
105
106
* will be sent to the IO thread instead. */
106
int (*set_volume)(pa_sink *s); /* dito */
107
void (*set_volume)(pa_sink *s); /* dito */
108
109
/* Called when the mute setting is queried. Called from main loop
109
110
* context. If this is NULL a PA_SINK_MESSAGE_GET_MUTE message
110
111
* will be sent to the IO thread instead. If refresh_mute is
111
112
* FALSE neither this function is called nor a message is sent.*/
112
int (*get_mute)(pa_sink *s); /* dito */
113
void (*get_mute)(pa_sink *s); /* dito */
114
115
/* Called when the mute setting shall be changed. Called from main
115
116
* loop context. If this is NULL a PA_SINK_MESSAGE_SET_MUTE
116
117
* message will be sent to the IO thread instead. */
117
int (*set_mute)(pa_sink *s); /* dito */
118
void (*set_mute)(pa_sink *s); /* dito */
119
120
/* Called when a rewind request is issued. Called from IO thread
162
164
PA_SINK_MESSAGE_REMOVE_INPUT,
163
165
PA_SINK_MESSAGE_GET_VOLUME,
164
166
PA_SINK_MESSAGE_SET_VOLUME,
167
PA_SINK_MESSAGE_SYNC_VOLUMES,
165
168
PA_SINK_MESSAGE_GET_MUTE,
166
169
PA_SINK_MESSAGE_SET_MUTE,
167
170
PA_SINK_MESSAGE_GET_LATENCY,
175
178
PA_SINK_MESSAGE_GET_LATENCY_RANGE,
176
179
PA_SINK_MESSAGE_GET_MAX_REWIND,
177
180
PA_SINK_MESSAGE_GET_MAX_REQUEST,
181
PA_SINK_MESSAGE_SET_MAX_REWIND,
182
PA_SINK_MESSAGE_SET_MAX_REQUEST,
178
183
PA_SINK_MESSAGE_MAX
179
184
} pa_sink_message_t;
206
212
void pa_sink_new_data_set_muted(pa_sink_new_data *data, pa_bool_t mute);
207
213
void pa_sink_new_data_done(pa_sink_new_data *data);
209
/* To be called exclusively by the sink driver, from main context */
215
/*** To be called exclusively by the sink driver, from main context */
211
217
pa_sink* pa_sink_new(
220
226
void pa_sink_set_asyncmsgq(pa_sink *s, pa_asyncmsgq *q);
221
227
void pa_sink_set_rtpoll(pa_sink *s, pa_rtpoll *p);
229
void pa_sink_set_max_rewind(pa_sink *s, size_t max_rewind);
230
void pa_sink_set_max_request(pa_sink *s, size_t max_request);
223
231
void pa_sink_set_latency_range(pa_sink *s, pa_usec_t min_latency, pa_usec_t max_latency);
225
233
void pa_sink_detach(pa_sink *s);
226
234
void pa_sink_attach(pa_sink *s);
228
/* May be called by everyone, from main context */
236
void pa_sink_set_soft_volume(pa_sink *s, const pa_cvolume *volume);
237
void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_volume);
238
void pa_sink_mute_changed(pa_sink *s, pa_bool_t new_muted);
240
pa_bool_t pa_device_init_description(pa_proplist *p);
241
pa_bool_t pa_device_init_icon(pa_proplist *p, pa_bool_t is_sink);
243
/**** May be called by everyone, from main context */
230
245
/* The returned value is supposed to be in the time domain of the sound card! */
231
246
pa_usec_t pa_sink_get_latency(pa_sink *s);
239
254
int pa_sink_suspend(pa_sink *s, pa_bool_t suspend);
240
255
int pa_sink_suspend_all(pa_core *c, pa_bool_t suspend);
242
void pa_sink_set_volume(pa_sink *sink, const pa_cvolume *volume);
243
void pa_sink_set_soft_volume(pa_sink *s, const pa_cvolume *volume);
244
const pa_cvolume *pa_sink_get_volume(pa_sink *sink, pa_bool_t force_refresh);
257
void pa_sink_update_flat_volume(pa_sink *s, pa_cvolume *new_volume);
258
void pa_sink_propagate_flat_volume(pa_sink *s);
260
void pa_sink_set_volume(pa_sink *sink, const pa_cvolume *volume, pa_bool_t propagate, pa_bool_t sendmsg, pa_bool_t become_reference);
261
const pa_cvolume *pa_sink_get_volume(pa_sink *sink, pa_bool_t force_refresh, pa_bool_t reference);
245
263
void pa_sink_set_mute(pa_sink *sink, pa_bool_t mute);
246
pa_bool_t pa_sink_get_mute(pa_sink *sink, pa_bool_t force_refres);
264
pa_bool_t pa_sink_get_mute(pa_sink *sink, pa_bool_t force_refresh);
266
pa_bool_t pa_sink_update_proplist(pa_sink *s, pa_update_mode_t mode, pa_proplist *p);
248
268
unsigned pa_sink_linked_by(pa_sink *s); /* Number of connected streams */
249
269
unsigned pa_sink_used_by(pa_sink *s); /* Number of connected streams which are not corked */
270
unsigned pa_sink_check_suspend(pa_sink *s); /* Returns how many streams are active that don't allow suspensions */
250
271
#define pa_sink_get_state(s) ((s)->state)
252
/* To be called exclusively by the sink driver, from IO context */
273
/* Moves all inputs away, and stores them in pa_queue */
274
pa_queue *pa_sink_move_all_start(pa_sink *s);
275
void pa_sink_move_all_finish(pa_sink *s, pa_queue *q, pa_bool_t save);
276
void pa_sink_move_all_fail(pa_queue *q);
278
/*** To be called exclusively by the sink driver, from IO context */
254
280
void pa_sink_render(pa_sink*s, size_t length, pa_memchunk *result);
255
281
void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result);
266
292
pa_usec_t pa_sink_get_requested_latency_within_thread(pa_sink *s);
268
void pa_sink_set_max_rewind(pa_sink *s, size_t max_rewind);
269
void pa_sink_set_max_request(pa_sink *s, size_t max_request);
271
void pa_sink_update_latency_range(pa_sink *s, pa_usec_t min_latency, pa_usec_t max_latency);
273
/* To be called exclusively by sink input drivers, from IO context */
294
void pa_sink_set_max_rewind_within_thread(pa_sink *s, size_t max_rewind);
295
void pa_sink_set_max_request_within_thread(pa_sink *s, size_t max_request);
297
void pa_sink_set_latency_range_within_thread(pa_sink *s, pa_usec_t min_latency, pa_usec_t max_latency);
299
/*** To be called exclusively by sink input drivers, from IO context */
275
301
void pa_sink_request_rewind(pa_sink*s, size_t nbytes);
277
303
void pa_sink_invalidate_requested_latency(pa_sink *s);
305
pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s);