]> code.delx.au - pulseaudio/blob - src/pulsecore/source.c
Use simple free function in pa_queue_free
[pulseaudio] / src / pulsecore / source.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
11
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 USA.
21 ***/
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdio.h>
28 #include <stdlib.h>
29
30 #include <pulse/format.h>
31 #include <pulse/utf8.h>
32 #include <pulse/xmalloc.h>
33 #include <pulse/timeval.h>
34 #include <pulse/util.h>
35 #include <pulse/rtclock.h>
36 #include <pulse/internal.h>
37
38 #include <pulsecore/core-util.h>
39 #include <pulsecore/source-output.h>
40 #include <pulsecore/namereg.h>
41 #include <pulsecore/core-subscribe.h>
42 #include <pulsecore/log.h>
43 #include <pulsecore/sample-util.h>
44 #include <pulsecore/flist.h>
45
46 #include "source.h"
47
48 #define ABSOLUTE_MIN_LATENCY (500)
49 #define ABSOLUTE_MAX_LATENCY (10*PA_USEC_PER_SEC)
50 #define DEFAULT_FIXED_LATENCY (250*PA_USEC_PER_MSEC)
51
52 PA_DEFINE_PUBLIC_CLASS(pa_source, pa_msgobject);
53
54 struct pa_source_volume_change {
55 pa_usec_t at;
56 pa_cvolume hw_volume;
57
58 PA_LLIST_FIELDS(pa_source_volume_change);
59 };
60
61 struct source_message_set_port {
62 pa_device_port *port;
63 int ret;
64 };
65
66 static void source_free(pa_object *o);
67
68 static void pa_source_volume_change_push(pa_source *s);
69 static void pa_source_volume_change_flush(pa_source *s);
70
71 pa_source_new_data* pa_source_new_data_init(pa_source_new_data *data) {
72 pa_assert(data);
73
74 pa_zero(*data);
75 data->proplist = pa_proplist_new();
76
77 return data;
78 }
79
80 void pa_source_new_data_set_name(pa_source_new_data *data, const char *name) {
81 pa_assert(data);
82
83 pa_xfree(data->name);
84 data->name = pa_xstrdup(name);
85 }
86
87 void pa_source_new_data_set_sample_spec(pa_source_new_data *data, const pa_sample_spec *spec) {
88 pa_assert(data);
89
90 if ((data->sample_spec_is_set = !!spec))
91 data->sample_spec = *spec;
92 }
93
94 void pa_source_new_data_set_channel_map(pa_source_new_data *data, const pa_channel_map *map) {
95 pa_assert(data);
96
97 if ((data->channel_map_is_set = !!map))
98 data->channel_map = *map;
99 }
100
101 void pa_source_new_data_set_alternate_sample_rate(pa_source_new_data *data, const uint32_t alternate_sample_rate) {
102 pa_assert(data);
103
104 data->alternate_sample_rate_is_set = TRUE;
105 data->alternate_sample_rate = alternate_sample_rate;
106 }
107
108 void pa_source_new_data_set_volume(pa_source_new_data *data, const pa_cvolume *volume) {
109 pa_assert(data);
110
111 if ((data->volume_is_set = !!volume))
112 data->volume = *volume;
113 }
114
115 void pa_source_new_data_set_muted(pa_source_new_data *data, pa_bool_t mute) {
116 pa_assert(data);
117
118 data->muted_is_set = TRUE;
119 data->muted = !!mute;
120 }
121
122 void pa_source_new_data_set_port(pa_source_new_data *data, const char *port) {
123 pa_assert(data);
124
125 pa_xfree(data->active_port);
126 data->active_port = pa_xstrdup(port);
127 }
128
129 void pa_source_new_data_done(pa_source_new_data *data) {
130 pa_assert(data);
131
132 pa_proplist_free(data->proplist);
133
134 if (data->ports)
135 pa_device_port_hashmap_free(data->ports);
136
137 pa_xfree(data->name);
138 pa_xfree(data->active_port);
139 }
140
141 /* Called from main context */
142 static void reset_callbacks(pa_source *s) {
143 pa_assert(s);
144
145 s->set_state = NULL;
146 s->get_volume = NULL;
147 s->set_volume = NULL;
148 s->write_volume = NULL;
149 s->get_mute = NULL;
150 s->set_mute = NULL;
151 s->update_requested_latency = NULL;
152 s->set_port = NULL;
153 s->get_formats = NULL;
154 s->update_rate = NULL;
155 }
156
157 /* Called from main context */
158 pa_source* pa_source_new(
159 pa_core *core,
160 pa_source_new_data *data,
161 pa_source_flags_t flags) {
162
163 pa_source *s;
164 const char *name;
165 char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
166 char *pt;
167
168 pa_assert(core);
169 pa_assert(data);
170 pa_assert(data->name);
171 pa_assert_ctl_context();
172
173 s = pa_msgobject_new(pa_source);
174
175 if (!(name = pa_namereg_register(core, data->name, PA_NAMEREG_SOURCE, s, data->namereg_fail))) {
176 pa_log_debug("Failed to register name %s.", data->name);
177 pa_xfree(s);
178 return NULL;
179 }
180
181 pa_source_new_data_set_name(data, name);
182
183 if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_NEW], data) < 0) {
184 pa_xfree(s);
185 pa_namereg_unregister(core, name);
186 return NULL;
187 }
188
189 /* FIXME, need to free s here on failure */
190
191 pa_return_null_if_fail(!data->driver || pa_utf8_valid(data->driver));
192 pa_return_null_if_fail(data->name && pa_utf8_valid(data->name) && data->name[0]);
193
194 pa_return_null_if_fail(data->sample_spec_is_set && pa_sample_spec_valid(&data->sample_spec));
195
196 if (!data->channel_map_is_set)
197 pa_return_null_if_fail(pa_channel_map_init_auto(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT));
198
199 pa_return_null_if_fail(pa_channel_map_valid(&data->channel_map));
200 pa_return_null_if_fail(data->channel_map.channels == data->sample_spec.channels);
201
202 /* FIXME: There should probably be a general function for checking whether
203 * the source volume is allowed to be set, like there is for source outputs. */
204 pa_assert(!data->volume_is_set || !(flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
205
206 if (!data->volume_is_set) {
207 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
208 data->save_volume = FALSE;
209 }
210
211 pa_return_null_if_fail(pa_cvolume_valid(&data->volume));
212 pa_return_null_if_fail(pa_cvolume_compatible(&data->volume, &data->sample_spec));
213
214 if (!data->muted_is_set)
215 data->muted = FALSE;
216
217 if (data->card)
218 pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist);
219
220 pa_device_init_description(data->proplist);
221 pa_device_init_icon(data->proplist, FALSE);
222 pa_device_init_intended_roles(data->proplist);
223
224 if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], data) < 0) {
225 pa_xfree(s);
226 pa_namereg_unregister(core, name);
227 return NULL;
228 }
229
230 s->parent.parent.free = source_free;
231 s->parent.process_msg = pa_source_process_msg;
232
233 s->core = core;
234 s->state = PA_SOURCE_INIT;
235 s->flags = flags;
236 s->priority = 0;
237 s->suspend_cause = 0;
238 s->name = pa_xstrdup(name);
239 s->proplist = pa_proplist_copy(data->proplist);
240 s->driver = pa_xstrdup(pa_path_get_filename(data->driver));
241 s->module = data->module;
242 s->card = data->card;
243
244 s->priority = pa_device_init_priority(s->proplist);
245
246 s->sample_spec = data->sample_spec;
247 s->channel_map = data->channel_map;
248 s->default_sample_rate = s->sample_spec.rate;
249
250 if (data->alternate_sample_rate_is_set)
251 s->alternate_sample_rate = data->alternate_sample_rate;
252 else
253 s->alternate_sample_rate = s->core->alternate_sample_rate;
254
255 if (s->sample_spec.rate == s->alternate_sample_rate) {
256 pa_log_warn("Default and alternate sample rates are the same.");
257 s->alternate_sample_rate = 0;
258 }
259
260 s->outputs = pa_idxset_new(NULL, NULL);
261 s->n_corked = 0;
262 s->monitor_of = NULL;
263 s->output_from_master = NULL;
264
265 s->reference_volume = s->real_volume = data->volume;
266 pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
267 s->base_volume = PA_VOLUME_NORM;
268 s->n_volume_steps = PA_VOLUME_NORM+1;
269 s->muted = data->muted;
270 s->refresh_volume = s->refresh_muted = FALSE;
271
272 reset_callbacks(s);
273 s->userdata = NULL;
274
275 s->asyncmsgq = NULL;
276
277 /* As a minor optimization we just steal the list instead of
278 * copying it here */
279 s->ports = data->ports;
280 data->ports = NULL;
281
282 s->active_port = NULL;
283 s->save_port = FALSE;
284
285 if (data->active_port && s->ports)
286 if ((s->active_port = pa_hashmap_get(s->ports, data->active_port)))
287 s->save_port = data->save_port;
288
289 if (!s->active_port && s->ports) {
290 void *state;
291 pa_device_port *p;
292
293 PA_HASHMAP_FOREACH(p, s->ports, state)
294 if (!s->active_port || p->priority > s->active_port->priority)
295 s->active_port = p;
296 }
297
298 s->save_volume = data->save_volume;
299 s->save_muted = data->save_muted;
300
301 pa_silence_memchunk_get(
302 &core->silence_cache,
303 core->mempool,
304 &s->silence,
305 &s->sample_spec,
306 0);
307
308 s->thread_info.rtpoll = NULL;
309 s->thread_info.outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
310 s->thread_info.soft_volume = s->soft_volume;
311 s->thread_info.soft_muted = s->muted;
312 s->thread_info.state = s->state;
313 s->thread_info.max_rewind = 0;
314 s->thread_info.requested_latency_valid = FALSE;
315 s->thread_info.requested_latency = 0;
316 s->thread_info.min_latency = ABSOLUTE_MIN_LATENCY;
317 s->thread_info.max_latency = ABSOLUTE_MAX_LATENCY;
318 s->thread_info.fixed_latency = flags & PA_SOURCE_DYNAMIC_LATENCY ? 0 : DEFAULT_FIXED_LATENCY;
319
320 PA_LLIST_HEAD_INIT(pa_source_volume_change, s->thread_info.volume_changes);
321 s->thread_info.volume_changes_tail = NULL;
322 pa_sw_cvolume_multiply(&s->thread_info.current_hw_volume, &s->soft_volume, &s->real_volume);
323 s->thread_info.volume_change_safety_margin = core->deferred_volume_safety_margin_usec;
324 s->thread_info.volume_change_extra_delay = core->deferred_volume_extra_delay_usec;
325
326 /* FIXME: This should probably be moved to pa_source_put() */
327 pa_assert_se(pa_idxset_put(core->sources, s, &s->index) >= 0);
328
329 if (s->card)
330 pa_assert_se(pa_idxset_put(s->card->sources, s, NULL) >= 0);
331
332 pt = pa_proplist_to_string_sep(s->proplist, "\n ");
333 pa_log_info("Created source %u \"%s\" with sample spec %s and channel map %s\n %s",
334 s->index,
335 s->name,
336 pa_sample_spec_snprint(st, sizeof(st), &s->sample_spec),
337 pa_channel_map_snprint(cm, sizeof(cm), &s->channel_map),
338 pt);
339 pa_xfree(pt);
340
341 return s;
342 }
343
344 /* Called from main context */
345 static int source_set_state(pa_source *s, pa_source_state_t state) {
346 int ret;
347 pa_bool_t suspend_change;
348 pa_source_state_t original_state;
349
350 pa_assert(s);
351 pa_assert_ctl_context();
352
353 if (s->state == state)
354 return 0;
355
356 original_state = s->state;
357
358 suspend_change =
359 (original_state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(state)) ||
360 (PA_SOURCE_IS_OPENED(original_state) && state == PA_SOURCE_SUSPENDED);
361
362 if (s->set_state)
363 if ((ret = s->set_state(s, state)) < 0)
364 return ret;
365
366 if (s->asyncmsgq)
367 if ((ret = pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_STATE, PA_UINT_TO_PTR(state), 0, NULL)) < 0) {
368
369 if (s->set_state)
370 s->set_state(s, original_state);
371
372 return ret;
373 }
374
375 s->state = state;
376
377 if (state != PA_SOURCE_UNLINKED) { /* if we enter UNLINKED state pa_source_unlink() will fire the appropriate events */
378 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], s);
379 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
380 }
381
382 if (suspend_change) {
383 pa_source_output *o;
384 uint32_t idx;
385
386 /* We're suspending or resuming, tell everyone about it */
387
388 PA_IDXSET_FOREACH(o, s->outputs, idx)
389 if (s->state == PA_SOURCE_SUSPENDED &&
390 (o->flags & PA_SOURCE_OUTPUT_KILL_ON_SUSPEND))
391 pa_source_output_kill(o);
392 else if (o->suspend)
393 o->suspend(o, state == PA_SOURCE_SUSPENDED);
394 }
395
396 return 0;
397 }
398
399 void pa_source_set_get_volume_callback(pa_source *s, pa_source_cb_t cb) {
400 pa_assert(s);
401
402 s->get_volume = cb;
403 }
404
405 void pa_source_set_set_volume_callback(pa_source *s, pa_source_cb_t cb) {
406 pa_source_flags_t flags;
407
408 pa_assert(s);
409 pa_assert(!s->write_volume || cb);
410
411 s->set_volume = cb;
412
413 /* Save the current flags so we can tell if they've changed */
414 flags = s->flags;
415
416 if (cb) {
417 /* The source implementor is responsible for setting decibel volume support */
418 s->flags |= PA_SOURCE_HW_VOLUME_CTRL;
419 } else {
420 s->flags &= ~PA_SOURCE_HW_VOLUME_CTRL;
421 /* See note below in pa_source_put() about volume sharing and decibel volumes */
422 pa_source_enable_decibel_volume(s, !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
423 }
424
425 /* If the flags have changed after init, let any clients know via a change event */
426 if (s->state != PA_SOURCE_INIT && flags != s->flags)
427 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
428 }
429
430 void pa_source_set_write_volume_callback(pa_source *s, pa_source_cb_t cb) {
431 pa_source_flags_t flags;
432
433 pa_assert(s);
434 pa_assert(!cb || s->set_volume);
435
436 s->write_volume = cb;
437
438 /* Save the current flags so we can tell if they've changed */
439 flags = s->flags;
440
441 if (cb)
442 s->flags |= PA_SOURCE_DEFERRED_VOLUME;
443 else
444 s->flags &= ~PA_SOURCE_DEFERRED_VOLUME;
445
446 /* If the flags have changed after init, let any clients know via a change event */
447 if (s->state != PA_SOURCE_INIT && flags != s->flags)
448 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
449 }
450
451 void pa_source_set_get_mute_callback(pa_source *s, pa_source_cb_t cb) {
452 pa_assert(s);
453
454 s->get_mute = cb;
455 }
456
457 void pa_source_set_set_mute_callback(pa_source *s, pa_source_cb_t cb) {
458 pa_source_flags_t flags;
459
460 pa_assert(s);
461
462 s->set_mute = cb;
463
464 /* Save the current flags so we can tell if they've changed */
465 flags = s->flags;
466
467 if (cb)
468 s->flags |= PA_SOURCE_HW_MUTE_CTRL;
469 else
470 s->flags &= ~PA_SOURCE_HW_MUTE_CTRL;
471
472 /* If the flags have changed after init, let any clients know via a change event */
473 if (s->state != PA_SOURCE_INIT && flags != s->flags)
474 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
475 }
476
477 static void enable_flat_volume(pa_source *s, pa_bool_t enable) {
478 pa_source_flags_t flags;
479
480 pa_assert(s);
481
482 /* Always follow the overall user preference here */
483 enable = enable && s->core->flat_volumes;
484
485 /* Save the current flags so we can tell if they've changed */
486 flags = s->flags;
487
488 if (enable)
489 s->flags |= PA_SOURCE_FLAT_VOLUME;
490 else
491 s->flags &= ~PA_SOURCE_FLAT_VOLUME;
492
493 /* If the flags have changed after init, let any clients know via a change event */
494 if (s->state != PA_SOURCE_INIT && flags != s->flags)
495 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
496 }
497
498 void pa_source_enable_decibel_volume(pa_source *s, pa_bool_t enable) {
499 pa_source_flags_t flags;
500
501 pa_assert(s);
502
503 /* Save the current flags so we can tell if they've changed */
504 flags = s->flags;
505
506 if (enable) {
507 s->flags |= PA_SOURCE_DECIBEL_VOLUME;
508 enable_flat_volume(s, TRUE);
509 } else {
510 s->flags &= ~PA_SOURCE_DECIBEL_VOLUME;
511 enable_flat_volume(s, FALSE);
512 }
513
514 /* If the flags have changed after init, let any clients know via a change event */
515 if (s->state != PA_SOURCE_INIT && flags != s->flags)
516 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
517 }
518
519 /* Called from main context */
520 void pa_source_put(pa_source *s) {
521 pa_source_assert_ref(s);
522 pa_assert_ctl_context();
523
524 pa_assert(s->state == PA_SOURCE_INIT);
525 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || s->output_from_master);
526
527 /* The following fields must be initialized properly when calling _put() */
528 pa_assert(s->asyncmsgq);
529 pa_assert(s->thread_info.min_latency <= s->thread_info.max_latency);
530
531 /* Generally, flags should be initialized via pa_source_new(). As a
532 * special exception we allow some volume related flags to be set
533 * between _new() and _put() by the callback setter functions above.
534 *
535 * Thus we implement a couple safeguards here which ensure the above
536 * setters were used (or at least the implementor made manual changes
537 * in a compatible way).
538 *
539 * Note: All of these flags set here can change over the life time
540 * of the source. */
541 pa_assert(!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) || s->set_volume);
542 pa_assert(!(s->flags & PA_SOURCE_DEFERRED_VOLUME) || s->write_volume);
543 pa_assert(!(s->flags & PA_SOURCE_HW_MUTE_CTRL) || s->set_mute);
544
545 /* XXX: Currently decibel volume is disabled for all sources that use volume
546 * sharing. When the master source supports decibel volume, it would be good
547 * to have the flag also in the filter source, but currently we don't do that
548 * so that the flags of the filter source never change when it's moved from
549 * a master source to another. One solution for this problem would be to
550 * remove user-visible volume altogether from filter sources when volume
551 * sharing is used, but the current approach was easier to implement... */
552 /* We always support decibel volumes in software, otherwise we leave it to
553 * the source implementor to set this flag as needed.
554 *
555 * Note: This flag can also change over the life time of the source. */
556 if (!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) && !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
557 pa_source_enable_decibel_volume(s, TRUE);
558
559 /* If the source implementor support DB volumes by itself, we should always
560 * try and enable flat volumes too */
561 if ((s->flags & PA_SOURCE_DECIBEL_VOLUME))
562 enable_flat_volume(s, TRUE);
563
564 if (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) {
565 pa_source *root_source = pa_source_get_master(s);
566
567 pa_assert(PA_LIKELY(root_source));
568
569 s->reference_volume = root_source->reference_volume;
570 pa_cvolume_remap(&s->reference_volume, &root_source->channel_map, &s->channel_map);
571
572 s->real_volume = root_source->real_volume;
573 pa_cvolume_remap(&s->real_volume, &root_source->channel_map, &s->channel_map);
574 } else
575 /* We assume that if the sink implementor changed the default
576 * volume he did so in real_volume, because that is the usual
577 * place where he is supposed to place his changes. */
578 s->reference_volume = s->real_volume;
579
580 s->thread_info.soft_volume = s->soft_volume;
581 s->thread_info.soft_muted = s->muted;
582 pa_sw_cvolume_multiply(&s->thread_info.current_hw_volume, &s->soft_volume, &s->real_volume);
583
584 pa_assert((s->flags & PA_SOURCE_HW_VOLUME_CTRL)
585 || (s->base_volume == PA_VOLUME_NORM
586 && ((s->flags & PA_SOURCE_DECIBEL_VOLUME || (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)))));
587 pa_assert(!(s->flags & PA_SOURCE_DECIBEL_VOLUME) || s->n_volume_steps == PA_VOLUME_NORM+1);
588 pa_assert(!(s->flags & PA_SOURCE_DYNAMIC_LATENCY) == (s->thread_info.fixed_latency != 0));
589
590 pa_assert_se(source_set_state(s, PA_SOURCE_IDLE) == 0);
591
592 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_NEW, s->index);
593 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PUT], s);
594 }
595
596 /* Called from main context */
597 void pa_source_unlink(pa_source *s) {
598 pa_bool_t linked;
599 pa_source_output *o, *j = NULL;
600
601 pa_assert(s);
602 pa_assert_ctl_context();
603
604 /* See pa_sink_unlink() for a couple of comments how this function
605 * works. */
606
607 linked = PA_SOURCE_IS_LINKED(s->state);
608
609 if (linked)
610 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], s);
611
612 if (s->state != PA_SOURCE_UNLINKED)
613 pa_namereg_unregister(s->core, s->name);
614 pa_idxset_remove_by_data(s->core->sources, s, NULL);
615
616 if (s->card)
617 pa_idxset_remove_by_data(s->card->sources, s, NULL);
618
619 while ((o = pa_idxset_first(s->outputs, NULL))) {
620 pa_assert(o != j);
621 pa_source_output_kill(o);
622 j = o;
623 }
624
625 if (linked)
626 source_set_state(s, PA_SOURCE_UNLINKED);
627 else
628 s->state = PA_SOURCE_UNLINKED;
629
630 reset_callbacks(s);
631
632 if (linked) {
633 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_REMOVE, s->index);
634 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK_POST], s);
635 }
636 }
637
638 /* Called from main context */
639 static void source_free(pa_object *o) {
640 pa_source_output *so;
641 pa_source *s = PA_SOURCE(o);
642
643 pa_assert(s);
644 pa_assert_ctl_context();
645 pa_assert(pa_source_refcnt(s) == 0);
646
647 if (PA_SOURCE_IS_LINKED(s->state))
648 pa_source_unlink(s);
649
650 pa_log_info("Freeing source %u \"%s\"", s->index, s->name);
651
652 pa_idxset_free(s->outputs, NULL, NULL);
653
654 while ((so = pa_hashmap_steal_first(s->thread_info.outputs)))
655 pa_source_output_unref(so);
656
657 pa_hashmap_free(s->thread_info.outputs, NULL, NULL);
658
659 if (s->silence.memblock)
660 pa_memblock_unref(s->silence.memblock);
661
662 pa_xfree(s->name);
663 pa_xfree(s->driver);
664
665 if (s->proplist)
666 pa_proplist_free(s->proplist);
667
668 if (s->ports)
669 pa_device_port_hashmap_free(s->ports);
670
671 pa_xfree(s);
672 }
673
674 /* Called from main context, and not while the IO thread is active, please */
675 void pa_source_set_asyncmsgq(pa_source *s, pa_asyncmsgq *q) {
676 pa_source_assert_ref(s);
677 pa_assert_ctl_context();
678
679 s->asyncmsgq = q;
680 }
681
682 /* Called from main context, and not while the IO thread is active, please */
683 void pa_source_update_flags(pa_source *s, pa_source_flags_t mask, pa_source_flags_t value) {
684 pa_source_assert_ref(s);
685 pa_assert_ctl_context();
686
687 if (mask == 0)
688 return;
689
690 /* For now, allow only a minimal set of flags to be changed. */
691 pa_assert((mask & ~(PA_SOURCE_DYNAMIC_LATENCY|PA_SOURCE_LATENCY)) == 0);
692
693 s->flags = (s->flags & ~mask) | (value & mask);
694 }
695
696 /* Called from IO context, or before _put() from main context */
697 void pa_source_set_rtpoll(pa_source *s, pa_rtpoll *p) {
698 pa_source_assert_ref(s);
699 pa_source_assert_io_context(s);
700
701 s->thread_info.rtpoll = p;
702 }
703
704 /* Called from main context */
705 int pa_source_update_status(pa_source*s) {
706 pa_source_assert_ref(s);
707 pa_assert_ctl_context();
708 pa_assert(PA_SOURCE_IS_LINKED(s->state));
709
710 if (s->state == PA_SOURCE_SUSPENDED)
711 return 0;
712
713 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE);
714 }
715
716 /* Called from main context */
717 int pa_source_suspend(pa_source *s, pa_bool_t suspend, pa_suspend_cause_t cause) {
718 pa_source_assert_ref(s);
719 pa_assert_ctl_context();
720 pa_assert(PA_SOURCE_IS_LINKED(s->state));
721 pa_assert(cause != 0);
722
723 if (s->monitor_of && cause != PA_SUSPEND_PASSTHROUGH)
724 return -PA_ERR_NOTSUPPORTED;
725
726 if (suspend)
727 s->suspend_cause |= cause;
728 else
729 s->suspend_cause &= ~cause;
730
731 if ((pa_source_get_state(s) == PA_SOURCE_SUSPENDED) == !!s->suspend_cause)
732 return 0;
733
734 pa_log_debug("Suspend cause of source %s is 0x%04x, %s", s->name, s->suspend_cause, s->suspend_cause ? "suspending" : "resuming");
735
736 if (s->suspend_cause)
737 return source_set_state(s, PA_SOURCE_SUSPENDED);
738 else
739 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE);
740 }
741
742 /* Called from main context */
743 int pa_source_sync_suspend(pa_source *s) {
744 pa_sink_state_t state;
745
746 pa_source_assert_ref(s);
747 pa_assert_ctl_context();
748 pa_assert(PA_SOURCE_IS_LINKED(s->state));
749 pa_assert(s->monitor_of);
750
751 state = pa_sink_get_state(s->monitor_of);
752
753 if (state == PA_SINK_SUSPENDED)
754 return source_set_state(s, PA_SOURCE_SUSPENDED);
755
756 pa_assert(PA_SINK_IS_OPENED(state));
757
758 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE);
759 }
760
761 /* Called from main context */
762 pa_queue *pa_source_move_all_start(pa_source *s, pa_queue *q) {
763 pa_source_output *o, *n;
764 uint32_t idx;
765
766 pa_source_assert_ref(s);
767 pa_assert_ctl_context();
768 pa_assert(PA_SOURCE_IS_LINKED(s->state));
769
770 if (!q)
771 q = pa_queue_new();
772
773 for (o = PA_SOURCE_OUTPUT(pa_idxset_first(s->outputs, &idx)); o; o = n) {
774 n = PA_SOURCE_OUTPUT(pa_idxset_next(s->outputs, &idx));
775
776 pa_source_output_ref(o);
777
778 if (pa_source_output_start_move(o) >= 0)
779 pa_queue_push(q, o);
780 else
781 pa_source_output_unref(o);
782 }
783
784 return q;
785 }
786
787 /* Called from main context */
788 void pa_source_move_all_finish(pa_source *s, pa_queue *q, pa_bool_t save) {
789 pa_source_output *o;
790
791 pa_source_assert_ref(s);
792 pa_assert_ctl_context();
793 pa_assert(PA_SOURCE_IS_LINKED(s->state));
794 pa_assert(q);
795
796 while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
797 if (pa_source_output_finish_move(o, s, save) < 0)
798 pa_source_output_fail_move(o);
799
800 pa_source_output_unref(o);
801 }
802
803 pa_queue_free(q, NULL);
804 }
805
806 /* Called from main context */
807 void pa_source_move_all_fail(pa_queue *q) {
808 pa_source_output *o;
809
810 pa_assert_ctl_context();
811 pa_assert(q);
812
813 while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
814 pa_source_output_fail_move(o);
815 pa_source_output_unref(o);
816 }
817
818 pa_queue_free(q, NULL);
819 }
820
821 /* Called from IO thread context */
822 void pa_source_process_rewind(pa_source *s, size_t nbytes) {
823 pa_source_output *o;
824 void *state = NULL;
825
826 pa_source_assert_ref(s);
827 pa_source_assert_io_context(s);
828 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
829
830 if (nbytes <= 0)
831 return;
832
833 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
834 return;
835
836 pa_log_debug("Processing rewind...");
837
838 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
839 pa_source_output_assert_ref(o);
840 pa_source_output_process_rewind(o, nbytes);
841 }
842 }
843
844 /* Called from IO thread context */
845 void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
846 pa_source_output *o;
847 void *state = NULL;
848
849 pa_source_assert_ref(s);
850 pa_source_assert_io_context(s);
851 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
852 pa_assert(chunk);
853
854 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
855 return;
856
857 if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
858 pa_memchunk vchunk = *chunk;
859
860 pa_memblock_ref(vchunk.memblock);
861 pa_memchunk_make_writable(&vchunk, 0);
862
863 if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
864 pa_silence_memchunk(&vchunk, &s->sample_spec);
865 else
866 pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
867
868 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
869 pa_source_output_assert_ref(o);
870
871 if (!o->thread_info.direct_on_input)
872 pa_source_output_push(o, &vchunk);
873 }
874
875 pa_memblock_unref(vchunk.memblock);
876 } else {
877
878 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
879 pa_source_output_assert_ref(o);
880
881 if (!o->thread_info.direct_on_input)
882 pa_source_output_push(o, chunk);
883 }
884 }
885 }
886
887 /* Called from IO thread context */
888 void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *chunk) {
889 pa_source_assert_ref(s);
890 pa_source_assert_io_context(s);
891 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
892 pa_source_output_assert_ref(o);
893 pa_assert(o->thread_info.direct_on_input);
894 pa_assert(chunk);
895
896 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
897 return;
898
899 if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
900 pa_memchunk vchunk = *chunk;
901
902 pa_memblock_ref(vchunk.memblock);
903 pa_memchunk_make_writable(&vchunk, 0);
904
905 if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
906 pa_silence_memchunk(&vchunk, &s->sample_spec);
907 else
908 pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
909
910 pa_source_output_push(o, &vchunk);
911
912 pa_memblock_unref(vchunk.memblock);
913 } else
914 pa_source_output_push(o, chunk);
915 }
916
917 /* Called from main thread */
918 pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrough)
919 {
920 if (s->update_rate) {
921 uint32_t desired_rate = rate;
922 uint32_t default_rate = s->default_sample_rate;
923 uint32_t alternate_rate = s->alternate_sample_rate;
924 uint32_t idx;
925 pa_source_output *o;
926 pa_bool_t use_alternate = FALSE;
927
928 if (PA_UNLIKELY(default_rate == alternate_rate)) {
929 pa_log_warn("Default and alternate sample rates are the same.");
930 return FALSE;
931 }
932
933 if (PA_SOURCE_IS_RUNNING(s->state)) {
934 pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u kHz",
935 s->sample_spec.rate);
936 return FALSE;
937 }
938
939 if (PA_UNLIKELY (desired_rate < 8000 ||
940 desired_rate > PA_RATE_MAX))
941 return FALSE;
942
943 if (!passthrough) {
944 pa_assert(default_rate % 4000 || default_rate % 11025);
945 pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
946
947 if (default_rate % 4000) {
948 /* default is a 11025 multiple */
949 if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
950 use_alternate=TRUE;
951 } else {
952 /* default is 4000 multiple */
953 if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
954 use_alternate=TRUE;
955 }
956
957 if (use_alternate)
958 desired_rate = alternate_rate;
959 else
960 desired_rate = default_rate;
961 } else {
962 desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
963 }
964
965 if (!passthrough && pa_source_used_by(s) > 0)
966 return FALSE;
967
968 pa_source_suspend(s, TRUE, PA_SUSPEND_IDLE); /* needed before rate update, will be resumed automatically */
969
970 if (s->update_rate(s, desired_rate) == TRUE) {
971 pa_log_info("Changed sampling rate successfully ");
972
973 PA_IDXSET_FOREACH(o, s->outputs, idx) {
974 if (o->state == PA_SOURCE_OUTPUT_CORKED)
975 pa_source_output_update_rate(o);
976 }
977 return TRUE;
978 }
979 }
980 return FALSE;
981 }
982
983 /* Called from main thread */
984 pa_usec_t pa_source_get_latency(pa_source *s) {
985 pa_usec_t usec;
986
987 pa_source_assert_ref(s);
988 pa_assert_ctl_context();
989 pa_assert(PA_SOURCE_IS_LINKED(s->state));
990
991 if (s->state == PA_SOURCE_SUSPENDED)
992 return 0;
993
994 if (!(s->flags & PA_SOURCE_LATENCY))
995 return 0;
996
997 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0);
998
999 return usec;
1000 }
1001
1002 /* Called from IO thread */
1003 pa_usec_t pa_source_get_latency_within_thread(pa_source *s) {
1004 pa_usec_t usec = 0;
1005 pa_msgobject *o;
1006
1007 pa_source_assert_ref(s);
1008 pa_source_assert_io_context(s);
1009 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
1010
1011 /* The returned value is supposed to be in the time domain of the sound card! */
1012
1013 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
1014 return 0;
1015
1016 if (!(s->flags & PA_SOURCE_LATENCY))
1017 return 0;
1018
1019 o = PA_MSGOBJECT(s);
1020
1021 /* FIXME: We probably should make this a proper vtable callback instead of going through process_msg() */
1022
1023 if (o->process_msg(o, PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
1024 return -1;
1025
1026 return usec;
1027 }
1028
1029 /* Called from the main thread (and also from the IO thread while the main
1030 * thread is waiting).
1031 *
1032 * When a source uses volume sharing, it never has the PA_SOURCE_FLAT_VOLUME flag
1033 * set. Instead, flat volume mode is detected by checking whether the root source
1034 * has the flag set. */
1035 pa_bool_t pa_source_flat_volume_enabled(pa_source *s) {
1036 pa_source_assert_ref(s);
1037
1038 s = pa_source_get_master(s);
1039
1040 if (PA_LIKELY(s))
1041 return (s->flags & PA_SOURCE_FLAT_VOLUME);
1042 else
1043 return FALSE;
1044 }
1045
1046 /* Called from the main thread (and also from the IO thread while the main
1047 * thread is waiting). */
1048 pa_source *pa_source_get_master(pa_source *s) {
1049 pa_source_assert_ref(s);
1050
1051 while (s && (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1052 if (PA_UNLIKELY(!s->output_from_master))
1053 return NULL;
1054
1055 s = s->output_from_master->source;
1056 }
1057
1058 return s;
1059 }
1060
1061 /* Called from main context */
1062 pa_bool_t pa_source_is_passthrough(pa_source *s) {
1063
1064 pa_source_assert_ref(s);
1065
1066 /* NB Currently only monitor sources support passthrough mode */
1067 return (s->monitor_of && pa_sink_is_passthrough(s->monitor_of));
1068 }
1069
1070 /* Called from main context */
1071 void pa_source_enter_passthrough(pa_source *s) {
1072 pa_cvolume volume;
1073
1074 /* set the volume to NORM */
1075 s->saved_volume = *pa_source_get_volume(s, TRUE);
1076 s->saved_save_volume = s->save_volume;
1077
1078 pa_cvolume_set(&volume, s->sample_spec.channels, PA_MIN(s->base_volume, PA_VOLUME_NORM));
1079 pa_source_set_volume(s, &volume, TRUE, FALSE);
1080 }
1081
1082 /* Called from main context */
1083 void pa_source_leave_passthrough(pa_source *s) {
1084 /* Restore source volume to what it was before we entered passthrough mode */
1085 pa_source_set_volume(s, &s->saved_volume, TRUE, s->saved_save_volume);
1086
1087 pa_cvolume_init(&s->saved_volume);
1088 s->saved_save_volume = FALSE;
1089 }
1090
1091 /* Called from main context. */
1092 static void compute_reference_ratio(pa_source_output *o) {
1093 unsigned c = 0;
1094 pa_cvolume remapped;
1095
1096 pa_assert(o);
1097 pa_assert(pa_source_flat_volume_enabled(o->source));
1098
1099 /*
1100 * Calculates the reference ratio from the source's reference
1101 * volume. This basically calculates:
1102 *
1103 * o->reference_ratio = o->volume / o->source->reference_volume
1104 */
1105
1106 remapped = o->source->reference_volume;
1107 pa_cvolume_remap(&remapped, &o->source->channel_map, &o->channel_map);
1108
1109 o->reference_ratio.channels = o->sample_spec.channels;
1110
1111 for (c = 0; c < o->sample_spec.channels; c++) {
1112
1113 /* We don't update when the source volume is 0 anyway */
1114 if (remapped.values[c] <= PA_VOLUME_MUTED)
1115 continue;
1116
1117 /* Don't update the reference ratio unless necessary */
1118 if (pa_sw_volume_multiply(
1119 o->reference_ratio.values[c],
1120 remapped.values[c]) == o->volume.values[c])
1121 continue;
1122
1123 o->reference_ratio.values[c] = pa_sw_volume_divide(
1124 o->volume.values[c],
1125 remapped.values[c]);
1126 }
1127 }
1128
1129 /* Called from main context. Only called for the root source in volume sharing
1130 * cases, except for internal recursive calls. */
1131 static void compute_reference_ratios(pa_source *s) {
1132 uint32_t idx;
1133 pa_source_output *o;
1134
1135 pa_source_assert_ref(s);
1136 pa_assert_ctl_context();
1137 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1138 pa_assert(pa_source_flat_volume_enabled(s));
1139
1140 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1141 compute_reference_ratio(o);
1142
1143 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1144 compute_reference_ratios(o->destination_source);
1145 }
1146 }
1147
1148 /* Called from main context. Only called for the root source in volume sharing
1149 * cases, except for internal recursive calls. */
1150 static void compute_real_ratios(pa_source *s) {
1151 pa_source_output *o;
1152 uint32_t idx;
1153
1154 pa_source_assert_ref(s);
1155 pa_assert_ctl_context();
1156 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1157 pa_assert(pa_source_flat_volume_enabled(s));
1158
1159 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1160 unsigned c;
1161 pa_cvolume remapped;
1162
1163 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1164 /* The origin source uses volume sharing, so this input's real ratio
1165 * is handled as a special case - the real ratio must be 0 dB, and
1166 * as a result i->soft_volume must equal i->volume_factor. */
1167 pa_cvolume_reset(&o->real_ratio, o->real_ratio.channels);
1168 o->soft_volume = o->volume_factor;
1169
1170 compute_real_ratios(o->destination_source);
1171
1172 continue;
1173 }
1174
1175 /*
1176 * This basically calculates:
1177 *
1178 * i->real_ratio := i->volume / s->real_volume
1179 * i->soft_volume := i->real_ratio * i->volume_factor
1180 */
1181
1182 remapped = s->real_volume;
1183 pa_cvolume_remap(&remapped, &s->channel_map, &o->channel_map);
1184
1185 o->real_ratio.channels = o->sample_spec.channels;
1186 o->soft_volume.channels = o->sample_spec.channels;
1187
1188 for (c = 0; c < o->sample_spec.channels; c++) {
1189
1190 if (remapped.values[c] <= PA_VOLUME_MUTED) {
1191 /* We leave o->real_ratio untouched */
1192 o->soft_volume.values[c] = PA_VOLUME_MUTED;
1193 continue;
1194 }
1195
1196 /* Don't lose accuracy unless necessary */
1197 if (pa_sw_volume_multiply(
1198 o->real_ratio.values[c],
1199 remapped.values[c]) != o->volume.values[c])
1200
1201 o->real_ratio.values[c] = pa_sw_volume_divide(
1202 o->volume.values[c],
1203 remapped.values[c]);
1204
1205 o->soft_volume.values[c] = pa_sw_volume_multiply(
1206 o->real_ratio.values[c],
1207 o->volume_factor.values[c]);
1208 }
1209
1210 /* We don't copy the soft_volume to the thread_info data
1211 * here. That must be done by the caller */
1212 }
1213 }
1214
1215 static pa_cvolume *cvolume_remap_minimal_impact(
1216 pa_cvolume *v,
1217 const pa_cvolume *template,
1218 const pa_channel_map *from,
1219 const pa_channel_map *to) {
1220
1221 pa_cvolume t;
1222
1223 pa_assert(v);
1224 pa_assert(template);
1225 pa_assert(from);
1226 pa_assert(to);
1227 pa_assert(pa_cvolume_compatible_with_channel_map(v, from));
1228 pa_assert(pa_cvolume_compatible_with_channel_map(template, to));
1229
1230 /* Much like pa_cvolume_remap(), but tries to minimize impact when
1231 * mapping from source output to source volumes:
1232 *
1233 * If template is a possible remapping from v it is used instead
1234 * of remapping anew.
1235 *
1236 * If the channel maps don't match we set an all-channel volume on
1237 * the source to ensure that changing a volume on one stream has no
1238 * effect that cannot be compensated for in another stream that
1239 * does not have the same channel map as the source. */
1240
1241 if (pa_channel_map_equal(from, to))
1242 return v;
1243
1244 t = *template;
1245 if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) {
1246 *v = *template;
1247 return v;
1248 }
1249
1250 pa_cvolume_set(v, to->channels, pa_cvolume_max(v));
1251 return v;
1252 }
1253
1254 /* Called from main thread. Only called for the root source in volume sharing
1255 * cases, except for internal recursive calls. */
1256 static void get_maximum_output_volume(pa_source *s, pa_cvolume *max_volume, const pa_channel_map *channel_map) {
1257 pa_source_output *o;
1258 uint32_t idx;
1259
1260 pa_source_assert_ref(s);
1261 pa_assert(max_volume);
1262 pa_assert(channel_map);
1263 pa_assert(pa_source_flat_volume_enabled(s));
1264
1265 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1266 pa_cvolume remapped;
1267
1268 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1269 get_maximum_output_volume(o->destination_source, max_volume, channel_map);
1270
1271 /* Ignore this output. The origin source uses volume sharing, so this
1272 * output's volume will be set to be equal to the root source's real
1273 * volume. Obviously this output's current volume must not then
1274 * affect what the root source's real volume will be. */
1275 continue;
1276 }
1277
1278 remapped = o->volume;
1279 cvolume_remap_minimal_impact(&remapped, max_volume, &o->channel_map, channel_map);
1280 pa_cvolume_merge(max_volume, max_volume, &remapped);
1281 }
1282 }
1283
1284 /* Called from main thread. Only called for the root source in volume sharing
1285 * cases, except for internal recursive calls. */
1286 static pa_bool_t has_outputs(pa_source *s) {
1287 pa_source_output *o;
1288 uint32_t idx;
1289
1290 pa_source_assert_ref(s);
1291
1292 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1293 if (!o->destination_source || !(o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || has_outputs(o->destination_source))
1294 return TRUE;
1295 }
1296
1297 return FALSE;
1298 }
1299
1300 /* Called from main thread. Only called for the root source in volume sharing
1301 * cases, except for internal recursive calls. */
1302 static void update_real_volume(pa_source *s, const pa_cvolume *new_volume, pa_channel_map *channel_map) {
1303 pa_source_output *o;
1304 uint32_t idx;
1305
1306 pa_source_assert_ref(s);
1307 pa_assert(new_volume);
1308 pa_assert(channel_map);
1309
1310 s->real_volume = *new_volume;
1311 pa_cvolume_remap(&s->real_volume, channel_map, &s->channel_map);
1312
1313 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1314 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1315 if (pa_source_flat_volume_enabled(s)) {
1316 pa_cvolume old_volume = o->volume;
1317
1318 /* Follow the root source's real volume. */
1319 o->volume = *new_volume;
1320 pa_cvolume_remap(&o->volume, channel_map, &o->channel_map);
1321 compute_reference_ratio(o);
1322
1323 /* The volume changed, let's tell people so */
1324 if (!pa_cvolume_equal(&old_volume, &o->volume)) {
1325 if (o->volume_changed)
1326 o->volume_changed(o);
1327
1328 pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
1329 }
1330 }
1331
1332 update_real_volume(o->destination_source, new_volume, channel_map);
1333 }
1334 }
1335 }
1336
1337 /* Called from main thread. Only called for the root source in shared volume
1338 * cases. */
1339 static void compute_real_volume(pa_source *s) {
1340 pa_source_assert_ref(s);
1341 pa_assert_ctl_context();
1342 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1343 pa_assert(pa_source_flat_volume_enabled(s));
1344 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1345
1346 /* This determines the maximum volume of all streams and sets
1347 * s->real_volume accordingly. */
1348
1349 if (!has_outputs(s)) {
1350 /* In the special case that we have no source outputs we leave the
1351 * volume unmodified. */
1352 update_real_volume(s, &s->reference_volume, &s->channel_map);
1353 return;
1354 }
1355
1356 pa_cvolume_mute(&s->real_volume, s->channel_map.channels);
1357
1358 /* First let's determine the new maximum volume of all outputs
1359 * connected to this source */
1360 get_maximum_output_volume(s, &s->real_volume, &s->channel_map);
1361 update_real_volume(s, &s->real_volume, &s->channel_map);
1362
1363 /* Then, let's update the real ratios/soft volumes of all outputs
1364 * connected to this source */
1365 compute_real_ratios(s);
1366 }
1367
1368 /* Called from main thread. Only called for the root source in shared volume
1369 * cases, except for internal recursive calls. */
1370 static void propagate_reference_volume(pa_source *s) {
1371 pa_source_output *o;
1372 uint32_t idx;
1373
1374 pa_source_assert_ref(s);
1375 pa_assert_ctl_context();
1376 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1377 pa_assert(pa_source_flat_volume_enabled(s));
1378
1379 /* This is called whenever the source volume changes that is not
1380 * caused by a source output volume change. We need to fix up the
1381 * source output volumes accordingly */
1382
1383 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1384 pa_cvolume old_volume;
1385
1386 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1387 propagate_reference_volume(o->destination_source);
1388
1389 /* Since the origin source uses volume sharing, this output's volume
1390 * needs to be updated to match the root source's real volume, but
1391 * that will be done later in update_shared_real_volume(). */
1392 continue;
1393 }
1394
1395 old_volume = o->volume;
1396
1397 /* This basically calculates:
1398 *
1399 * o->volume := o->reference_volume * o->reference_ratio */
1400
1401 o->volume = s->reference_volume;
1402 pa_cvolume_remap(&o->volume, &s->channel_map, &o->channel_map);
1403 pa_sw_cvolume_multiply(&o->volume, &o->volume, &o->reference_ratio);
1404
1405 /* The volume changed, let's tell people so */
1406 if (!pa_cvolume_equal(&old_volume, &o->volume)) {
1407
1408 if (o->volume_changed)
1409 o->volume_changed(o);
1410
1411 pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
1412 }
1413 }
1414 }
1415
1416 /* Called from main thread. Only called for the root source in volume sharing
1417 * cases, except for internal recursive calls. The return value indicates
1418 * whether any reference volume actually changed. */
1419 static pa_bool_t update_reference_volume(pa_source *s, const pa_cvolume *v, const pa_channel_map *channel_map, pa_bool_t save) {
1420 pa_cvolume volume;
1421 pa_bool_t reference_volume_changed;
1422 pa_source_output *o;
1423 uint32_t idx;
1424
1425 pa_source_assert_ref(s);
1426 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1427 pa_assert(v);
1428 pa_assert(channel_map);
1429 pa_assert(pa_cvolume_valid(v));
1430
1431 volume = *v;
1432 pa_cvolume_remap(&volume, channel_map, &s->channel_map);
1433
1434 reference_volume_changed = !pa_cvolume_equal(&volume, &s->reference_volume);
1435 s->reference_volume = volume;
1436
1437 s->save_volume = (!reference_volume_changed && s->save_volume) || save;
1438
1439 if (reference_volume_changed)
1440 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1441 else if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1442 /* If the root source's volume doesn't change, then there can't be any
1443 * changes in the other source in the source tree either.
1444 *
1445 * It's probably theoretically possible that even if the root source's
1446 * volume changes slightly, some filter source doesn't change its volume
1447 * due to rounding errors. If that happens, we still want to propagate
1448 * the changed root source volume to the sources connected to the
1449 * intermediate source that didn't change its volume. This theoretical
1450 * possibility is the reason why we have that !(s->flags &
1451 * PA_SOURCE_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
1452 * notice even if we returned here FALSE always if
1453 * reference_volume_changed is FALSE. */
1454 return FALSE;
1455
1456 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1457 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1458 update_reference_volume(o->destination_source, v, channel_map, FALSE);
1459 }
1460
1461 return TRUE;
1462 }
1463
1464 /* Called from main thread */
1465 void pa_source_set_volume(
1466 pa_source *s,
1467 const pa_cvolume *volume,
1468 pa_bool_t send_msg,
1469 pa_bool_t save) {
1470
1471 pa_cvolume new_reference_volume;
1472 pa_source *root_source;
1473
1474 pa_source_assert_ref(s);
1475 pa_assert_ctl_context();
1476 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1477 pa_assert(!volume || pa_cvolume_valid(volume));
1478 pa_assert(volume || pa_source_flat_volume_enabled(s));
1479 pa_assert(!volume || volume->channels == 1 || pa_cvolume_compatible(volume, &s->sample_spec));
1480
1481 /* make sure we don't change the volume in PASSTHROUGH mode ...
1482 * ... *except* if we're being invoked to reset the volume to ensure 0 dB gain */
1483 if (pa_source_is_passthrough(s) && (!volume || !pa_cvolume_is_norm(volume))) {
1484 pa_log_warn("Cannot change volume, Source is monitor of a PASSTHROUGH sink");
1485 return;
1486 }
1487
1488 /* In case of volume sharing, the volume is set for the root source first,
1489 * from which it's then propagated to the sharing sources. */
1490 root_source = pa_source_get_master(s);
1491
1492 if (PA_UNLIKELY(!root_source))
1493 return;
1494
1495 /* As a special exception we accept mono volumes on all sources --
1496 * even on those with more complex channel maps */
1497
1498 if (volume) {
1499 if (pa_cvolume_compatible(volume, &s->sample_spec))
1500 new_reference_volume = *volume;
1501 else {
1502 new_reference_volume = s->reference_volume;
1503 pa_cvolume_scale(&new_reference_volume, pa_cvolume_max(volume));
1504 }
1505
1506 pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1507
1508 if (update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save)) {
1509 if (pa_source_flat_volume_enabled(root_source)) {
1510 /* OK, propagate this volume change back to the outputs */
1511 propagate_reference_volume(root_source);
1512
1513 /* And now recalculate the real volume */
1514 compute_real_volume(root_source);
1515 } else
1516 update_real_volume(root_source, &root_source->reference_volume, &root_source->channel_map);
1517 }
1518
1519 } else {
1520 /* If volume is NULL we synchronize the source's real and
1521 * reference volumes with the stream volumes. */
1522
1523 pa_assert(pa_source_flat_volume_enabled(root_source));
1524
1525 /* Ok, let's determine the new real volume */
1526 compute_real_volume(root_source);
1527
1528 /* Let's 'push' the reference volume if necessary */
1529 pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_source->real_volume);
1530 /* If the source and it's root don't have the same number of channels, we need to remap */
1531 if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
1532 pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1533 update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save);
1534
1535 /* Now that the reference volume is updated, we can update the streams'
1536 * reference ratios. */
1537 compute_reference_ratios(root_source);
1538 }
1539
1540 if (root_source->set_volume) {
1541 /* If we have a function set_volume(), then we do not apply a
1542 * soft volume by default. However, set_volume() is free to
1543 * apply one to root_source->soft_volume */
1544
1545 pa_cvolume_reset(&root_source->soft_volume, root_source->sample_spec.channels);
1546 if (!(root_source->flags & PA_SOURCE_DEFERRED_VOLUME))
1547 root_source->set_volume(root_source);
1548
1549 } else
1550 /* If we have no function set_volume(), then the soft volume
1551 * becomes the real volume */
1552 root_source->soft_volume = root_source->real_volume;
1553
1554 /* This tells the source that soft volume and/or real volume changed */
1555 if (send_msg)
1556 pa_assert_se(pa_asyncmsgq_send(root_source->asyncmsgq, PA_MSGOBJECT(root_source), PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL) == 0);
1557 }
1558
1559 /* Called from the io thread if sync volume is used, otherwise from the main thread.
1560 * Only to be called by source implementor */
1561 void pa_source_set_soft_volume(pa_source *s, const pa_cvolume *volume) {
1562
1563 pa_source_assert_ref(s);
1564 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1565
1566 if (s->flags & PA_SOURCE_DEFERRED_VOLUME)
1567 pa_source_assert_io_context(s);
1568 else
1569 pa_assert_ctl_context();
1570
1571 if (!volume)
1572 pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
1573 else
1574 s->soft_volume = *volume;
1575
1576 if (PA_SOURCE_IS_LINKED(s->state) && !(s->flags & PA_SOURCE_DEFERRED_VOLUME))
1577 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME, NULL, 0, NULL) == 0);
1578 else
1579 s->thread_info.soft_volume = s->soft_volume;
1580 }
1581
1582 /* Called from the main thread. Only called for the root source in volume sharing
1583 * cases, except for internal recursive calls. */
1584 static void propagate_real_volume(pa_source *s, const pa_cvolume *old_real_volume) {
1585 pa_source_output *o;
1586 uint32_t idx;
1587
1588 pa_source_assert_ref(s);
1589 pa_assert(old_real_volume);
1590 pa_assert_ctl_context();
1591 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1592
1593 /* This is called when the hardware's real volume changes due to
1594 * some external event. We copy the real volume into our
1595 * reference volume and then rebuild the stream volumes based on
1596 * i->real_ratio which should stay fixed. */
1597
1598 if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1599 if (pa_cvolume_equal(old_real_volume, &s->real_volume))
1600 return;
1601
1602 /* 1. Make the real volume the reference volume */
1603 update_reference_volume(s, &s->real_volume, &s->channel_map, TRUE);
1604 }
1605
1606 if (pa_source_flat_volume_enabled(s)) {
1607
1608 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1609 pa_cvolume old_volume = o->volume;
1610
1611 /* 2. Since the source's reference and real volumes are equal
1612 * now our ratios should be too. */
1613 o->reference_ratio = o->real_ratio;
1614
1615 /* 3. Recalculate the new stream reference volume based on the
1616 * reference ratio and the sink's reference volume.
1617 *
1618 * This basically calculates:
1619 *
1620 * o->volume = s->reference_volume * o->reference_ratio
1621 *
1622 * This is identical to propagate_reference_volume() */
1623 o->volume = s->reference_volume;
1624 pa_cvolume_remap(&o->volume, &s->channel_map, &o->channel_map);
1625 pa_sw_cvolume_multiply(&o->volume, &o->volume, &o->reference_ratio);
1626
1627 /* Notify if something changed */
1628 if (!pa_cvolume_equal(&old_volume, &o->volume)) {
1629
1630 if (o->volume_changed)
1631 o->volume_changed(o);
1632
1633 pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
1634 }
1635
1636 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1637 propagate_real_volume(o->destination_source, old_real_volume);
1638 }
1639 }
1640
1641 /* Something got changed in the hardware. It probably makes sense
1642 * to save changed hw settings given that hw volume changes not
1643 * triggered by PA are almost certainly done by the user. */
1644 if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1645 s->save_volume = TRUE;
1646 }
1647
1648 /* Called from io thread */
1649 void pa_source_update_volume_and_mute(pa_source *s) {
1650 pa_assert(s);
1651 pa_source_assert_io_context(s);
1652
1653 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE, NULL, 0, NULL, NULL);
1654 }
1655
1656 /* Called from main thread */
1657 const pa_cvolume *pa_source_get_volume(pa_source *s, pa_bool_t force_refresh) {
1658 pa_source_assert_ref(s);
1659 pa_assert_ctl_context();
1660 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1661
1662 if (s->refresh_volume || force_refresh) {
1663 struct pa_cvolume old_real_volume;
1664
1665 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1666
1667 old_real_volume = s->real_volume;
1668
1669 if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume)
1670 s->get_volume(s);
1671
1672 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_VOLUME, NULL, 0, NULL) == 0);
1673
1674 update_real_volume(s, &s->real_volume, &s->channel_map);
1675 propagate_real_volume(s, &old_real_volume);
1676 }
1677
1678 return &s->reference_volume;
1679 }
1680
1681 /* Called from main thread. In volume sharing cases, only the root source may
1682 * call this. */
1683 void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_real_volume) {
1684 pa_cvolume old_real_volume;
1685
1686 pa_source_assert_ref(s);
1687 pa_assert_ctl_context();
1688 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1689 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1690
1691 /* The source implementor may call this if the volume changed to make sure everyone is notified */
1692
1693 old_real_volume = s->real_volume;
1694 update_real_volume(s, new_real_volume, &s->channel_map);
1695 propagate_real_volume(s, &old_real_volume);
1696 }
1697
1698 /* Called from main thread */
1699 void pa_source_set_mute(pa_source *s, pa_bool_t mute, pa_bool_t save) {
1700 pa_bool_t old_muted;
1701
1702 pa_source_assert_ref(s);
1703 pa_assert_ctl_context();
1704 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1705
1706 old_muted = s->muted;
1707 s->muted = mute;
1708 s->save_muted = (old_muted == s->muted && s->save_muted) || save;
1709
1710 if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->set_mute)
1711 s->set_mute(s);
1712
1713 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MUTE, NULL, 0, NULL) == 0);
1714
1715 if (old_muted != s->muted)
1716 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1717 }
1718
1719 /* Called from main thread */
1720 pa_bool_t pa_source_get_mute(pa_source *s, pa_bool_t force_refresh) {
1721
1722 pa_source_assert_ref(s);
1723 pa_assert_ctl_context();
1724 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1725
1726 if (s->refresh_muted || force_refresh) {
1727 pa_bool_t old_muted = s->muted;
1728
1729 if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_mute)
1730 s->get_mute(s);
1731
1732 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MUTE, NULL, 0, NULL) == 0);
1733
1734 if (old_muted != s->muted) {
1735 s->save_muted = TRUE;
1736
1737 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1738
1739 /* Make sure the soft mute status stays in sync */
1740 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MUTE, NULL, 0, NULL) == 0);
1741 }
1742 }
1743
1744 return s->muted;
1745 }
1746
1747 /* Called from main thread */
1748 void pa_source_mute_changed(pa_source *s, pa_bool_t new_muted) {
1749 pa_source_assert_ref(s);
1750 pa_assert_ctl_context();
1751 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1752
1753 /* The source implementor may call this if the mute state changed to make sure everyone is notified */
1754
1755 if (s->muted == new_muted)
1756 return;
1757
1758 s->muted = new_muted;
1759 s->save_muted = TRUE;
1760
1761 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1762 }
1763
1764 /* Called from main thread */
1765 pa_bool_t pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p) {
1766 pa_source_assert_ref(s);
1767 pa_assert_ctl_context();
1768
1769 if (p)
1770 pa_proplist_update(s->proplist, mode, p);
1771
1772 if (PA_SOURCE_IS_LINKED(s->state)) {
1773 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1774 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1775 }
1776
1777 return TRUE;
1778 }
1779
1780 /* Called from main thread */
1781 /* FIXME -- this should be dropped and be merged into pa_source_update_proplist() */
1782 void pa_source_set_description(pa_source *s, const char *description) {
1783 const char *old;
1784 pa_source_assert_ref(s);
1785 pa_assert_ctl_context();
1786
1787 if (!description && !pa_proplist_contains(s->proplist, PA_PROP_DEVICE_DESCRIPTION))
1788 return;
1789
1790 old = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1791
1792 if (old && description && pa_streq(old, description))
1793 return;
1794
1795 if (description)
1796 pa_proplist_sets(s->proplist, PA_PROP_DEVICE_DESCRIPTION, description);
1797 else
1798 pa_proplist_unset(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1799
1800 if (PA_SOURCE_IS_LINKED(s->state)) {
1801 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1802 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1803 }
1804 }
1805
1806 /* Called from main thread */
1807 unsigned pa_source_linked_by(pa_source *s) {
1808 pa_source_assert_ref(s);
1809 pa_assert_ctl_context();
1810 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1811
1812 return pa_idxset_size(s->outputs);
1813 }
1814
1815 /* Called from main thread */
1816 unsigned pa_source_used_by(pa_source *s) {
1817 unsigned ret;
1818
1819 pa_source_assert_ref(s);
1820 pa_assert_ctl_context();
1821 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1822
1823 ret = pa_idxset_size(s->outputs);
1824 pa_assert(ret >= s->n_corked);
1825
1826 return ret - s->n_corked;
1827 }
1828
1829 /* Called from main thread */
1830 unsigned pa_source_check_suspend(pa_source *s) {
1831 unsigned ret;
1832 pa_source_output *o;
1833 uint32_t idx;
1834
1835 pa_source_assert_ref(s);
1836 pa_assert_ctl_context();
1837
1838 if (!PA_SOURCE_IS_LINKED(s->state))
1839 return 0;
1840
1841 ret = 0;
1842
1843 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1844 pa_source_output_state_t st;
1845
1846 st = pa_source_output_get_state(o);
1847
1848 /* We do not assert here. It is perfectly valid for a source output to
1849 * be in the INIT state (i.e. created, marked done but not yet put)
1850 * and we should not care if it's unlinked as it won't contribute
1851 * towards our busy status.
1852 */
1853 if (!PA_SOURCE_OUTPUT_IS_LINKED(st))
1854 continue;
1855
1856 if (st == PA_SOURCE_OUTPUT_CORKED)
1857 continue;
1858
1859 if (o->flags & PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND)
1860 continue;
1861
1862 ret ++;
1863 }
1864
1865 return ret;
1866 }
1867
1868 /* Called from the IO thread */
1869 static void sync_output_volumes_within_thread(pa_source *s) {
1870 pa_source_output *o;
1871 void *state = NULL;
1872
1873 pa_source_assert_ref(s);
1874 pa_source_assert_io_context(s);
1875
1876 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
1877 if (pa_cvolume_equal(&o->thread_info.soft_volume, &o->soft_volume))
1878 continue;
1879
1880 o->thread_info.soft_volume = o->soft_volume;
1881 //pa_source_output_request_rewind(o, 0, TRUE, FALSE, FALSE);
1882 }
1883 }
1884
1885 /* Called from the IO thread. Only called for the root source in volume sharing
1886 * cases, except for internal recursive calls. */
1887 static void set_shared_volume_within_thread(pa_source *s) {
1888 pa_source_output *o;
1889 void *state = NULL;
1890
1891 pa_source_assert_ref(s);
1892
1893 PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED, NULL, 0, NULL);
1894
1895 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
1896 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1897 set_shared_volume_within_thread(o->destination_source);
1898 }
1899 }
1900
1901 /* Called from IO thread, except when it is not */
1902 int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
1903 pa_source *s = PA_SOURCE(object);
1904 pa_source_assert_ref(s);
1905
1906 switch ((pa_source_message_t) code) {
1907
1908 case PA_SOURCE_MESSAGE_ADD_OUTPUT: {
1909 pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
1910
1911 pa_hashmap_put(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index), pa_source_output_ref(o));
1912
1913 if (o->direct_on_input) {
1914 o->thread_info.direct_on_input = o->direct_on_input;
1915 pa_hashmap_put(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index), o);
1916 }
1917
1918 pa_assert(!o->thread_info.attached);
1919 o->thread_info.attached = TRUE;
1920
1921 if (o->attach)
1922 o->attach(o);
1923
1924 pa_source_output_set_state_within_thread(o, o->state);
1925
1926 if (o->thread_info.requested_source_latency != (pa_usec_t) -1)
1927 pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
1928
1929 pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
1930
1931 /* We don't just invalidate the requested latency here,
1932 * because if we are in a move we might need to fix up the
1933 * requested latency. */
1934 pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
1935
1936 /* In flat volume mode we need to update the volume as
1937 * well */
1938 return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
1939 }
1940
1941 case PA_SOURCE_MESSAGE_REMOVE_OUTPUT: {
1942 pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
1943
1944 pa_source_output_set_state_within_thread(o, o->state);
1945
1946 if (o->detach)
1947 o->detach(o);
1948
1949 pa_assert(o->thread_info.attached);
1950 o->thread_info.attached = FALSE;
1951
1952 if (o->thread_info.direct_on_input) {
1953 pa_hashmap_remove(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index));
1954 o->thread_info.direct_on_input = NULL;
1955 }
1956
1957 if (pa_hashmap_remove(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index)))
1958 pa_source_output_unref(o);
1959
1960 pa_source_invalidate_requested_latency(s, TRUE);
1961
1962 /* In flat volume mode we need to update the volume as
1963 * well */
1964 return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
1965 }
1966
1967 case PA_SOURCE_MESSAGE_SET_SHARED_VOLUME: {
1968 pa_source *root_source = pa_source_get_master(s);
1969
1970 if (PA_LIKELY(root_source))
1971 set_shared_volume_within_thread(root_source);
1972
1973 return 0;
1974 }
1975
1976 case PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED:
1977
1978 if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
1979 s->set_volume(s);
1980 pa_source_volume_change_push(s);
1981 }
1982 /* Fall through ... */
1983
1984 case PA_SOURCE_MESSAGE_SET_VOLUME:
1985
1986 if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
1987 s->thread_info.soft_volume = s->soft_volume;
1988 }
1989
1990 /* Fall through ... */
1991
1992 case PA_SOURCE_MESSAGE_SYNC_VOLUMES:
1993 sync_output_volumes_within_thread(s);
1994 return 0;
1995
1996 case PA_SOURCE_MESSAGE_GET_VOLUME:
1997
1998 if ((s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume) {
1999 s->get_volume(s);
2000 pa_source_volume_change_flush(s);
2001 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
2002 }
2003
2004 /* In case source implementor reset SW volume. */
2005 if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2006 s->thread_info.soft_volume = s->soft_volume;
2007 }
2008
2009 return 0;
2010
2011 case PA_SOURCE_MESSAGE_SET_MUTE:
2012
2013 if (s->thread_info.soft_muted != s->muted) {
2014 s->thread_info.soft_muted = s->muted;
2015 }
2016
2017 if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->set_mute)
2018 s->set_mute(s);
2019
2020 return 0;
2021
2022 case PA_SOURCE_MESSAGE_GET_MUTE:
2023
2024 if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->get_mute)
2025 s->get_mute(s);
2026
2027 return 0;
2028
2029 case PA_SOURCE_MESSAGE_SET_STATE: {
2030
2031 pa_bool_t suspend_change =
2032 (s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(PA_PTR_TO_UINT(userdata))) ||
2033 (PA_SOURCE_IS_OPENED(s->thread_info.state) && PA_PTR_TO_UINT(userdata) == PA_SOURCE_SUSPENDED);
2034
2035 s->thread_info.state = PA_PTR_TO_UINT(userdata);
2036
2037 if (suspend_change) {
2038 pa_source_output *o;
2039 void *state = NULL;
2040
2041 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2042 if (o->suspend_within_thread)
2043 o->suspend_within_thread(o, s->thread_info.state == PA_SOURCE_SUSPENDED);
2044 }
2045
2046 return 0;
2047 }
2048
2049 case PA_SOURCE_MESSAGE_DETACH:
2050
2051 /* Detach all streams */
2052 pa_source_detach_within_thread(s);
2053 return 0;
2054
2055 case PA_SOURCE_MESSAGE_ATTACH:
2056
2057 /* Reattach all streams */
2058 pa_source_attach_within_thread(s);
2059 return 0;
2060
2061 case PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY: {
2062
2063 pa_usec_t *usec = userdata;
2064 *usec = pa_source_get_requested_latency_within_thread(s);
2065
2066 /* Yes, that's right, the IO thread will see -1 when no
2067 * explicit requested latency is configured, the main
2068 * thread will see max_latency */
2069 if (*usec == (pa_usec_t) -1)
2070 *usec = s->thread_info.max_latency;
2071
2072 return 0;
2073 }
2074
2075 case PA_SOURCE_MESSAGE_SET_LATENCY_RANGE: {
2076 pa_usec_t *r = userdata;
2077
2078 pa_source_set_latency_range_within_thread(s, r[0], r[1]);
2079
2080 return 0;
2081 }
2082
2083 case PA_SOURCE_MESSAGE_GET_LATENCY_RANGE: {
2084 pa_usec_t *r = userdata;
2085
2086 r[0] = s->thread_info.min_latency;
2087 r[1] = s->thread_info.max_latency;
2088
2089 return 0;
2090 }
2091
2092 case PA_SOURCE_MESSAGE_GET_FIXED_LATENCY:
2093
2094 *((pa_usec_t*) userdata) = s->thread_info.fixed_latency;
2095 return 0;
2096
2097 case PA_SOURCE_MESSAGE_SET_FIXED_LATENCY:
2098
2099 pa_source_set_fixed_latency_within_thread(s, (pa_usec_t) offset);
2100 return 0;
2101
2102 case PA_SOURCE_MESSAGE_GET_MAX_REWIND:
2103
2104 *((size_t*) userdata) = s->thread_info.max_rewind;
2105 return 0;
2106
2107 case PA_SOURCE_MESSAGE_SET_MAX_REWIND:
2108
2109 pa_source_set_max_rewind_within_thread(s, (size_t) offset);
2110 return 0;
2111
2112 case PA_SOURCE_MESSAGE_GET_LATENCY:
2113
2114 if (s->monitor_of) {
2115 *((pa_usec_t*) userdata) = 0;
2116 return 0;
2117 }
2118
2119 /* Implementors need to overwrite this implementation! */
2120 return -1;
2121
2122 case PA_SOURCE_MESSAGE_SET_PORT:
2123
2124 pa_assert(userdata);
2125 if (s->set_port) {
2126 struct source_message_set_port *msg_data = userdata;
2127 msg_data->ret = s->set_port(s, msg_data->port);
2128 }
2129 return 0;
2130
2131 case PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE:
2132 /* This message is sent from IO-thread and handled in main thread. */
2133 pa_assert_ctl_context();
2134
2135 /* Make sure we're not messing with main thread when no longer linked */
2136 if (!PA_SOURCE_IS_LINKED(s->state))
2137 return 0;
2138
2139 pa_source_get_volume(s, TRUE);
2140 pa_source_get_mute(s, TRUE);
2141 return 0;
2142
2143 case PA_SOURCE_MESSAGE_MAX:
2144 ;
2145 }
2146
2147 return -1;
2148 }
2149
2150 /* Called from main thread */
2151 int pa_source_suspend_all(pa_core *c, pa_bool_t suspend, pa_suspend_cause_t cause) {
2152 pa_source *source;
2153 uint32_t idx;
2154 int ret = 0;
2155
2156 pa_core_assert_ref(c);
2157 pa_assert_ctl_context();
2158 pa_assert(cause != 0);
2159
2160 for (source = PA_SOURCE(pa_idxset_first(c->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(c->sources, &idx))) {
2161 int r;
2162
2163 if (source->monitor_of)
2164 continue;
2165
2166 if ((r = pa_source_suspend(source, suspend, cause)) < 0)
2167 ret = r;
2168 }
2169
2170 return ret;
2171 }
2172
2173 /* Called from main thread */
2174 void pa_source_detach(pa_source *s) {
2175 pa_source_assert_ref(s);
2176 pa_assert_ctl_context();
2177 pa_assert(PA_SOURCE_IS_LINKED(s->state));
2178
2179 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_DETACH, NULL, 0, NULL) == 0);
2180 }
2181
2182 /* Called from main thread */
2183 void pa_source_attach(pa_source *s) {
2184 pa_source_assert_ref(s);
2185 pa_assert_ctl_context();
2186 pa_assert(PA_SOURCE_IS_LINKED(s->state));
2187
2188 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_ATTACH, NULL, 0, NULL) == 0);
2189 }
2190
2191 /* Called from IO thread */
2192 void pa_source_detach_within_thread(pa_source *s) {
2193 pa_source_output *o;
2194 void *state = NULL;
2195
2196 pa_source_assert_ref(s);
2197 pa_source_assert_io_context(s);
2198 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2199
2200 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2201 if (o->detach)
2202 o->detach(o);
2203 }
2204
2205 /* Called from IO thread */
2206 void pa_source_attach_within_thread(pa_source *s) {
2207 pa_source_output *o;
2208 void *state = NULL;
2209
2210 pa_source_assert_ref(s);
2211 pa_source_assert_io_context(s);
2212 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2213
2214 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2215 if (o->attach)
2216 o->attach(o);
2217 }
2218
2219 /* Called from IO thread */
2220 pa_usec_t pa_source_get_requested_latency_within_thread(pa_source *s) {
2221 pa_usec_t result = (pa_usec_t) -1;
2222 pa_source_output *o;
2223 void *state = NULL;
2224
2225 pa_source_assert_ref(s);
2226 pa_source_assert_io_context(s);
2227
2228 if (!(s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2229 return PA_CLAMP(s->thread_info.fixed_latency, s->thread_info.min_latency, s->thread_info.max_latency);
2230
2231 if (s->thread_info.requested_latency_valid)
2232 return s->thread_info.requested_latency;
2233
2234 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2235 if (o->thread_info.requested_source_latency != (pa_usec_t) -1 &&
2236 (result == (pa_usec_t) -1 || result > o->thread_info.requested_source_latency))
2237 result = o->thread_info.requested_source_latency;
2238
2239 if (result != (pa_usec_t) -1)
2240 result = PA_CLAMP(result, s->thread_info.min_latency, s->thread_info.max_latency);
2241
2242 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2243 /* Only cache this if we are fully set up */
2244 s->thread_info.requested_latency = result;
2245 s->thread_info.requested_latency_valid = TRUE;
2246 }
2247
2248 return result;
2249 }
2250
2251 /* Called from main thread */
2252 pa_usec_t pa_source_get_requested_latency(pa_source *s) {
2253 pa_usec_t usec = 0;
2254
2255 pa_source_assert_ref(s);
2256 pa_assert_ctl_context();
2257 pa_assert(PA_SOURCE_IS_LINKED(s->state));
2258
2259 if (s->state == PA_SOURCE_SUSPENDED)
2260 return 0;
2261
2262 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
2263
2264 return usec;
2265 }
2266
2267 /* Called from IO thread */
2268 void pa_source_set_max_rewind_within_thread(pa_source *s, size_t max_rewind) {
2269 pa_source_output *o;
2270 void *state = NULL;
2271
2272 pa_source_assert_ref(s);
2273 pa_source_assert_io_context(s);
2274
2275 if (max_rewind == s->thread_info.max_rewind)
2276 return;
2277
2278 s->thread_info.max_rewind = max_rewind;
2279
2280 if (PA_SOURCE_IS_LINKED(s->thread_info.state))
2281 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2282 pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
2283 }
2284
2285 /* Called from main thread */
2286 void pa_source_set_max_rewind(pa_source *s, size_t max_rewind) {
2287 pa_source_assert_ref(s);
2288 pa_assert_ctl_context();
2289
2290 if (PA_SOURCE_IS_LINKED(s->state))
2291 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MAX_REWIND, NULL, max_rewind, NULL) == 0);
2292 else
2293 pa_source_set_max_rewind_within_thread(s, max_rewind);
2294 }
2295
2296 /* Called from IO thread */
2297 void pa_source_invalidate_requested_latency(pa_source *s, pa_bool_t dynamic) {
2298 pa_source_output *o;
2299 void *state = NULL;
2300
2301 pa_source_assert_ref(s);
2302 pa_source_assert_io_context(s);
2303
2304 if ((s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2305 s->thread_info.requested_latency_valid = FALSE;
2306 else if (dynamic)
2307 return;
2308
2309 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2310
2311 if (s->update_requested_latency)
2312 s->update_requested_latency(s);
2313
2314 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2315 if (o->update_source_requested_latency)
2316 o->update_source_requested_latency(o);
2317 }
2318
2319 if (s->monitor_of)
2320 pa_sink_invalidate_requested_latency(s->monitor_of, dynamic);
2321 }
2322
2323 /* Called from main thread */
2324 void pa_source_set_latency_range(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2325 pa_source_assert_ref(s);
2326 pa_assert_ctl_context();
2327
2328 /* min_latency == 0: no limit
2329 * min_latency anything else: specified limit
2330 *
2331 * Similar for max_latency */
2332
2333 if (min_latency < ABSOLUTE_MIN_LATENCY)
2334 min_latency = ABSOLUTE_MIN_LATENCY;
2335
2336 if (max_latency <= 0 ||
2337 max_latency > ABSOLUTE_MAX_LATENCY)
2338 max_latency = ABSOLUTE_MAX_LATENCY;
2339
2340 pa_assert(min_latency <= max_latency);
2341
2342 /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2343 pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2344 max_latency == ABSOLUTE_MAX_LATENCY) ||
2345 (s->flags & PA_SOURCE_DYNAMIC_LATENCY));
2346
2347 if (PA_SOURCE_IS_LINKED(s->state)) {
2348 pa_usec_t r[2];
2349
2350 r[0] = min_latency;
2351 r[1] = max_latency;
2352
2353 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_LATENCY_RANGE, r, 0, NULL) == 0);
2354 } else
2355 pa_source_set_latency_range_within_thread(s, min_latency, max_latency);
2356 }
2357
2358 /* Called from main thread */
2359 void pa_source_get_latency_range(pa_source *s, pa_usec_t *min_latency, pa_usec_t *max_latency) {
2360 pa_source_assert_ref(s);
2361 pa_assert_ctl_context();
2362 pa_assert(min_latency);
2363 pa_assert(max_latency);
2364
2365 if (PA_SOURCE_IS_LINKED(s->state)) {
2366 pa_usec_t r[2] = { 0, 0 };
2367
2368 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY_RANGE, r, 0, NULL) == 0);
2369
2370 *min_latency = r[0];
2371 *max_latency = r[1];
2372 } else {
2373 *min_latency = s->thread_info.min_latency;
2374 *max_latency = s->thread_info.max_latency;
2375 }
2376 }
2377
2378 /* Called from IO thread, and from main thread before pa_source_put() is called */
2379 void pa_source_set_latency_range_within_thread(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2380 pa_source_assert_ref(s);
2381 pa_source_assert_io_context(s);
2382
2383 pa_assert(min_latency >= ABSOLUTE_MIN_LATENCY);
2384 pa_assert(max_latency <= ABSOLUTE_MAX_LATENCY);
2385 pa_assert(min_latency <= max_latency);
2386
2387 /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2388 pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2389 max_latency == ABSOLUTE_MAX_LATENCY) ||
2390 (s->flags & PA_SOURCE_DYNAMIC_LATENCY) ||
2391 s->monitor_of);
2392
2393 if (s->thread_info.min_latency == min_latency &&
2394 s->thread_info.max_latency == max_latency)
2395 return;
2396
2397 s->thread_info.min_latency = min_latency;
2398 s->thread_info.max_latency = max_latency;
2399
2400 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2401 pa_source_output *o;
2402 void *state = NULL;
2403
2404 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2405 if (o->update_source_latency_range)
2406 o->update_source_latency_range(o);
2407 }
2408
2409 pa_source_invalidate_requested_latency(s, FALSE);
2410 }
2411
2412 /* Called from main thread, before the source is put */
2413 void pa_source_set_fixed_latency(pa_source *s, pa_usec_t latency) {
2414 pa_source_assert_ref(s);
2415 pa_assert_ctl_context();
2416
2417 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2418 pa_assert(latency == 0);
2419 return;
2420 }
2421
2422 if (latency < ABSOLUTE_MIN_LATENCY)
2423 latency = ABSOLUTE_MIN_LATENCY;
2424
2425 if (latency > ABSOLUTE_MAX_LATENCY)
2426 latency = ABSOLUTE_MAX_LATENCY;
2427
2428 if (PA_SOURCE_IS_LINKED(s->state))
2429 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_FIXED_LATENCY, NULL, (int64_t) latency, NULL) == 0);
2430 else
2431 s->thread_info.fixed_latency = latency;
2432 }
2433
2434 /* Called from main thread */
2435 pa_usec_t pa_source_get_fixed_latency(pa_source *s) {
2436 pa_usec_t latency;
2437
2438 pa_source_assert_ref(s);
2439 pa_assert_ctl_context();
2440
2441 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY)
2442 return 0;
2443
2444 if (PA_SOURCE_IS_LINKED(s->state))
2445 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_FIXED_LATENCY, &latency, 0, NULL) == 0);
2446 else
2447 latency = s->thread_info.fixed_latency;
2448
2449 return latency;
2450 }
2451
2452 /* Called from IO thread */
2453 void pa_source_set_fixed_latency_within_thread(pa_source *s, pa_usec_t latency) {
2454 pa_source_assert_ref(s);
2455 pa_source_assert_io_context(s);
2456
2457 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2458 pa_assert(latency == 0);
2459 return;
2460 }
2461
2462 pa_assert(latency >= ABSOLUTE_MIN_LATENCY);
2463 pa_assert(latency <= ABSOLUTE_MAX_LATENCY);
2464
2465 if (s->thread_info.fixed_latency == latency)
2466 return;
2467
2468 s->thread_info.fixed_latency = latency;
2469
2470 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2471 pa_source_output *o;
2472 void *state = NULL;
2473
2474 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2475 if (o->update_source_fixed_latency)
2476 o->update_source_fixed_latency(o);
2477 }
2478
2479 pa_source_invalidate_requested_latency(s, FALSE);
2480 }
2481
2482 /* Called from main thread */
2483 size_t pa_source_get_max_rewind(pa_source *s) {
2484 size_t r;
2485 pa_assert_ctl_context();
2486 pa_source_assert_ref(s);
2487
2488 if (!PA_SOURCE_IS_LINKED(s->state))
2489 return s->thread_info.max_rewind;
2490
2491 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MAX_REWIND, &r, 0, NULL) == 0);
2492
2493 return r;
2494 }
2495
2496 /* Called from main context */
2497 int pa_source_set_port(pa_source *s, const char *name, pa_bool_t save) {
2498 pa_device_port *port;
2499 int ret;
2500
2501 pa_source_assert_ref(s);
2502 pa_assert_ctl_context();
2503
2504 if (!s->set_port) {
2505 pa_log_debug("set_port() operation not implemented for source %u \"%s\"", s->index, s->name);
2506 return -PA_ERR_NOTIMPLEMENTED;
2507 }
2508
2509 if (!s->ports)
2510 return -PA_ERR_NOENTITY;
2511
2512 if (!(port = pa_hashmap_get(s->ports, name)))
2513 return -PA_ERR_NOENTITY;
2514
2515 if (s->active_port == port) {
2516 s->save_port = s->save_port || save;
2517 return 0;
2518 }
2519
2520 if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
2521 struct source_message_set_port msg = { .port = port, .ret = 0 };
2522 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_PORT, &msg, 0, NULL) == 0);
2523 ret = msg.ret;
2524 }
2525 else
2526 ret = s->set_port(s, port);
2527
2528 if (ret < 0)
2529 return -PA_ERR_NOENTITY;
2530
2531 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2532
2533 pa_log_info("Changed port of source %u \"%s\" to %s", s->index, s->name, port->name);
2534
2535 s->active_port = port;
2536 s->save_port = save;
2537
2538 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], s);
2539
2540 return 0;
2541 }
2542
2543 PA_STATIC_FLIST_DECLARE(pa_source_volume_change, 0, pa_xfree);
2544
2545 /* Called from the IO thread. */
2546 static pa_source_volume_change *pa_source_volume_change_new(pa_source *s) {
2547 pa_source_volume_change *c;
2548 if (!(c = pa_flist_pop(PA_STATIC_FLIST_GET(pa_source_volume_change))))
2549 c = pa_xnew(pa_source_volume_change, 1);
2550
2551 PA_LLIST_INIT(pa_source_volume_change, c);
2552 c->at = 0;
2553 pa_cvolume_reset(&c->hw_volume, s->sample_spec.channels);
2554 return c;
2555 }
2556
2557 /* Called from the IO thread. */
2558 static void pa_source_volume_change_free(pa_source_volume_change *c) {
2559 pa_assert(c);
2560 if (pa_flist_push(PA_STATIC_FLIST_GET(pa_source_volume_change), c) < 0)
2561 pa_xfree(c);
2562 }
2563
2564 /* Called from the IO thread. */
2565 void pa_source_volume_change_push(pa_source *s) {
2566 pa_source_volume_change *c = NULL;
2567 pa_source_volume_change *nc = NULL;
2568 uint32_t safety_margin = s->thread_info.volume_change_safety_margin;
2569
2570 const char *direction = NULL;
2571
2572 pa_assert(s);
2573 nc = pa_source_volume_change_new(s);
2574
2575 /* NOTE: There is already more different volumes in pa_source that I can remember.
2576 * Adding one more volume for HW would get us rid of this, but I am trying
2577 * to survive with the ones we already have. */
2578 pa_sw_cvolume_divide(&nc->hw_volume, &s->real_volume, &s->soft_volume);
2579
2580 if (!s->thread_info.volume_changes && pa_cvolume_equal(&nc->hw_volume, &s->thread_info.current_hw_volume)) {
2581 pa_log_debug("Volume not changing");
2582 pa_source_volume_change_free(nc);
2583 return;
2584 }
2585
2586 nc->at = pa_source_get_latency_within_thread(s);
2587 nc->at += pa_rtclock_now() + s->thread_info.volume_change_extra_delay;
2588
2589 if (s->thread_info.volume_changes_tail) {
2590 for (c = s->thread_info.volume_changes_tail; c; c = c->prev) {
2591 /* If volume is going up let's do it a bit late. If it is going
2592 * down let's do it a bit early. */
2593 if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&c->hw_volume)) {
2594 if (nc->at + safety_margin > c->at) {
2595 nc->at += safety_margin;
2596 direction = "up";
2597 break;
2598 }
2599 }
2600 else if (nc->at - safety_margin > c->at) {
2601 nc->at -= safety_margin;
2602 direction = "down";
2603 break;
2604 }
2605 }
2606 }
2607
2608 if (c == NULL) {
2609 if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&s->thread_info.current_hw_volume)) {
2610 nc->at += safety_margin;
2611 direction = "up";
2612 } else {
2613 nc->at -= safety_margin;
2614 direction = "down";
2615 }
2616 PA_LLIST_PREPEND(pa_source_volume_change, s->thread_info.volume_changes, nc);
2617 }
2618 else {
2619 PA_LLIST_INSERT_AFTER(pa_source_volume_change, s->thread_info.volume_changes, c, nc);
2620 }
2621
2622 pa_log_debug("Volume going %s to %d at %llu", direction, pa_cvolume_avg(&nc->hw_volume), (long long unsigned) nc->at);
2623
2624 /* We can ignore volume events that came earlier but should happen later than this. */
2625 PA_LLIST_FOREACH(c, nc->next) {
2626 pa_log_debug("Volume change to %d at %llu was dropped", pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at);
2627 pa_source_volume_change_free(c);
2628 }
2629 nc->next = NULL;
2630 s->thread_info.volume_changes_tail = nc;
2631 }
2632
2633 /* Called from the IO thread. */
2634 static void pa_source_volume_change_flush(pa_source *s) {
2635 pa_source_volume_change *c = s->thread_info.volume_changes;
2636 pa_assert(s);
2637 s->thread_info.volume_changes = NULL;
2638 s->thread_info.volume_changes_tail = NULL;
2639 while (c) {
2640 pa_source_volume_change *next = c->next;
2641 pa_source_volume_change_free(c);
2642 c = next;
2643 }
2644 }
2645
2646 /* Called from the IO thread. */
2647 pa_bool_t pa_source_volume_change_apply(pa_source *s, pa_usec_t *usec_to_next) {
2648 pa_usec_t now;
2649 pa_bool_t ret = FALSE;
2650
2651 pa_assert(s);
2652
2653 if (!s->thread_info.volume_changes || !PA_SOURCE_IS_LINKED(s->state)) {
2654 if (usec_to_next)
2655 *usec_to_next = 0;
2656 return ret;
2657 }
2658
2659 pa_assert(s->write_volume);
2660
2661 now = pa_rtclock_now();
2662
2663 while (s->thread_info.volume_changes && now >= s->thread_info.volume_changes->at) {
2664 pa_source_volume_change *c = s->thread_info.volume_changes;
2665 PA_LLIST_REMOVE(pa_source_volume_change, s->thread_info.volume_changes, c);
2666 pa_log_debug("Volume change to %d at %llu was written %llu usec late",
2667 pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at, (long long unsigned) (now - c->at));
2668 ret = TRUE;
2669 s->thread_info.current_hw_volume = c->hw_volume;
2670 pa_source_volume_change_free(c);
2671 }
2672
2673 if (ret)
2674 s->write_volume(s);
2675
2676 if (s->thread_info.volume_changes) {
2677 if (usec_to_next)
2678 *usec_to_next = s->thread_info.volume_changes->at - now;
2679 if (pa_log_ratelimit(PA_LOG_DEBUG))
2680 pa_log_debug("Next volume change in %lld usec", (long long) (s->thread_info.volume_changes->at - now));
2681 }
2682 else {
2683 if (usec_to_next)
2684 *usec_to_next = 0;
2685 s->thread_info.volume_changes_tail = NULL;
2686 }
2687 return ret;
2688 }
2689
2690
2691 /* Called from the main thread */
2692 /* Gets the list of formats supported by the source. The members and idxset must
2693 * be freed by the caller. */
2694 pa_idxset* pa_source_get_formats(pa_source *s) {
2695 pa_idxset *ret;
2696
2697 pa_assert(s);
2698
2699 if (s->get_formats) {
2700 /* Source supports format query, all is good */
2701 ret = s->get_formats(s);
2702 } else {
2703 /* Source doesn't support format query, so assume it does PCM */
2704 pa_format_info *f = pa_format_info_new();
2705 f->encoding = PA_ENCODING_PCM;
2706
2707 ret = pa_idxset_new(NULL, NULL);
2708 pa_idxset_put(ret, f, NULL);
2709 }
2710
2711 return ret;
2712 }
2713
2714 /* Called from the main thread */
2715 /* Checks if the source can accept this format */
2716 pa_bool_t pa_source_check_format(pa_source *s, pa_format_info *f)
2717 {
2718 pa_idxset *formats = NULL;
2719 pa_bool_t ret = FALSE;
2720
2721 pa_assert(s);
2722 pa_assert(f);
2723
2724 formats = pa_source_get_formats(s);
2725
2726 if (formats) {
2727 pa_format_info *finfo_device;
2728 uint32_t i;
2729
2730 PA_IDXSET_FOREACH(finfo_device, formats, i) {
2731 if (pa_format_info_is_compatible(finfo_device, f)) {
2732 ret = TRUE;
2733 break;
2734 }
2735 }
2736
2737 pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
2738 }
2739
2740 return ret;
2741 }
2742
2743 /* Called from the main thread */
2744 /* Calculates the intersection between formats supported by the source and
2745 * in_formats, and returns these, in the order of the source's formats. */
2746 pa_idxset* pa_source_check_formats(pa_source *s, pa_idxset *in_formats) {
2747 pa_idxset *out_formats = pa_idxset_new(NULL, NULL), *source_formats = NULL;
2748 pa_format_info *f_source, *f_in;
2749 uint32_t i, j;
2750
2751 pa_assert(s);
2752
2753 if (!in_formats || pa_idxset_isempty(in_formats))
2754 goto done;
2755
2756 source_formats = pa_source_get_formats(s);
2757
2758 PA_IDXSET_FOREACH(f_source, source_formats, i) {
2759 PA_IDXSET_FOREACH(f_in, in_formats, j) {
2760 if (pa_format_info_is_compatible(f_source, f_in))
2761 pa_idxset_put(out_formats, pa_format_info_copy(f_in), NULL);
2762 }
2763 }
2764
2765 done:
2766 if (source_formats)
2767 pa_idxset_free(source_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
2768
2769 return out_formats;
2770 }