Lines Matching refs:sink

30 #include <pulsecore/sink.h>
40 PA_MODULE_DESCRIPTION(_("Virtual sink"));
44 _("sink_name=<name for the sink> "
45 "sink_properties=<properties for the sink> "
46 "master=<name of sink to filter> "
62 pa_sink *sink;
91 /* The sink is _put() before the sink input is, so let's
93 * sink input is first shut down, the sink second. */
94 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
102 /* Get the latency of the master sink */
103 pa_sink_get_latency_within_thread(u->sink_input->sink, true) +
105 /* Add the latency internal to our sink input on top */
106 pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
140 * of the master sink to make sure we are heard immediately */
156 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
160 /* Just hand this one over to the master sink */
173 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
177 /* Just hand this one over to the master sink */
224 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state))
228 pa_sink_process_rewind(u->sink, 0);
237 pa_sink_render(u->sink, nbytes, &nchunk);
254 chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
278 /* Get the latency of the master sink */
279 pa_sink_get_latency_within_thread(i->sink, false) +
281 /* Add the latency internal to our sink input on top */
282 pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
295 /* If the sink is not yet linked, there is nothing to rewind */
296 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state))
299 if (u->sink->thread_info.rewind_nbytes > 0) {
303 amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
304 u->sink->thread_info.rewind_nbytes = 0;
313 pa_sink_process_rewind(u->sink, amount);
327 pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
340 pa_sink_set_max_request_within_thread(u->sink, nbytes);
350 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
364 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
374 if (PA_SINK_IS_LINKED(u->sink->thread_info.state))
375 pa_sink_detach_within_thread(u->sink);
377 pa_sink_set_rtpoll(u->sink, NULL);
387 pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
388 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
392 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
397 pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i));
401 pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i));
403 if (PA_SINK_IS_LINKED(u->sink->thread_info.state))
404 pa_sink_attach_within_thread(u->sink);
414 /* The order here matters! We first kill the sink so that streams
415 * can properly be moved away while the sink input is still connected
418 pa_sink_unlink(u->sink);
424 pa_sink_unref(u->sink);
425 u->sink = NULL;
438 pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
439 pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
441 pa_sink_set_asyncmsgq(u->sink, NULL);
450 pa_proplist_gets(u->sink->proplist, "device.vsink.name"), z ? z : dest->name);
452 pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl);
464 pa_sink_volume_changed(u->sink, &i->volume);
474 pa_sink_mute_changed(u->sink, i->muted);
497 pa_log("Master sink not found");
531 /* Create sink */
556 u->sink = pa_sink_new(m->core, &sink_data, (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY))
560 if (!u->sink) {
561 pa_log("Failed to create sink.");
565 u->sink->parent.process_msg = sink_process_msg_cb;
566 u->sink->set_state_in_main_thread = sink_set_state_in_main_thread_cb;
567 u->sink->set_state_in_io_thread = sink_set_state_in_io_thread_cb;
568 u->sink->update_requested_latency = sink_update_requested_latency_cb;
569 u->sink->request_rewind = sink_request_rewind_cb;
570 pa_sink_set_set_mute_callback(u->sink, sink_set_mute_cb);
572 pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
573 pa_sink_enable_decibel_volume(u->sink, true);
577 u->sink->flags |= PA_SINK_FLAT_VOLUME;
578 u->sink->userdata = u;
580 pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
582 /* Create sink input */
587 sink_input_data.origin_sink = u->sink;
588 pa_proplist_setf(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Virtual Sink Stream from %s", pa_proplist_gets(u->sink->proplist, PA_PROP_DEVICE_DESCRIPTION));
614 u->sink->input_to_master = u->sink_input;
617 u->memblockq = pa_memblockq_new("module-virtual-sink memblockq", 0, MEMBLOCKQ_MAXLENGTH, 0, &ss, 1, 1, 0, &silence);
623 * otherwise streams might attach to the sink before the sink
626 pa_sink_put(u->sink);
648 return pa_sink_linked_by(u->sink);
665 if (u->sink)
666 pa_sink_unlink(u->sink);
673 if (u->sink)
674 pa_sink_unref(u->sink);