Lines Matching refs:sink

45 #include <pulsecore/sink.h>
65 #include "alsa-sink.h"
106 pa_sink *sink;
212 pa_log_debug("Suspending sink %s, because another application requested us to release the device.", u->sink->name);
214 if (pa_sink_suspend(u->sink, true, PA_SUSPEND_APPLICATION) < 0)
238 if (!u->sink || !u->reserve)
241 if ((description = pa_proplist_gets(u->sink->proplist, PA_PROP_DEVICE_DESCRIPTION)))
280 pa_log_debug("Suspending sink %s, because another application is blocking the access to the device.", u->sink->name);
281 pa_sink_suspend(u->sink, true, PA_SUSPEND_APPLICATION);
283 pa_log_debug("Resuming sink %s, because other applications aren't blocking access to the device any more.", u->sink->name);
284 pa_sink_suspend(u->sink, false, PA_SUSPEND_APPLICATION);
336 max_use_2 = pa_frame_align(max_use/2, &u->sink->sample_spec);
338 u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->sink->sample_spec);
341 u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->sink->sample_spec);
358 u->tsched_watermark_usec = pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec);
385 old_min_latency = u->sink->thread_info.min_latency;
387 new_min_latency = PA_MIN(new_min_latency, u->sink->thread_info.max_latency);
393 pa_sink_set_latency_range_within_thread(u->sink, new_min_latency, u->sink->thread_info.max_latency);
433 /* Called from IO Context on unsuspend or from main thread when creating sink */
436 u->tsched_watermark = pa_convert_size(tsched_watermark, ss, &u->sink->sample_spec);
438 u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->sink->sample_spec);
439 u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->sink->sample_spec);
441 u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->sink->sample_spec);
442 u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->sink->sample_spec);
448 pa_sink_set_latency_range_within_thread(u->sink,
452 pa_sink_set_latency_range(u->sink,
459 u->min_latency_ref = u->sink->thread_info.min_latency;
475 usec = pa_sink_get_requested_latency_within_thread(u->sink);
478 usec = pa_bytes_to_usec(u->hwbuf_size, &u->sink->sample_spec);
583 (double) pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) / PA_USEC_PER_MSEC,
584 (double) pa_bytes_to_usec(u->watermark_inc_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC,
585 (double) pa_bytes_to_usec(u->watermark_dec_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC);
620 pa_sink_assert_ref(u->sink);
634 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
660 pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) {
719 if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
757 pa_sink_render_into_full(u->sink, &chunk);
790 input_underrun = pa_sink_process_input_underruns(u->sink, left_to_play);
793 pa_usec_t underrun_sleep = pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec);
795 *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec);
817 pa_sink_assert_ref(u->sink);
828 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
854 pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2)
898 pa_sink_render(u->sink, n_bytes, &u->memchunk);
954 input_underrun = pa_sink_process_input_underruns(u->sink, left_to_play);
957 pa_usec_t underrun_sleep = pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec);
959 *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec);
992 if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, status, &delay, u->hwbuf_size, &u->sink->sample_spec, false)) < 0)) {
1017 now2 = pa_bytes_to_usec((uint64_t) position, &u->sink->sample_spec);
1042 delay = (int64_t) pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - (int64_t) now2;
1046 delay += pa_bytes_to_usec(u->memchunk.length, &u->sink->sample_spec);
1087 pa_sink_set_max_rewind_within_thread(u->sink, 0);
1088 pa_sink_set_max_request_within_thread(u->sink, 0);
1108 if ((latency = pa_sink_get_requested_latency_within_thread(u->sink)) != (pa_usec_t) -1) {
1113 b = pa_usec_to_bytes(latency, &u->sink->sample_spec);
1136 avail_min += pa_usec_to_bytes(sleep_usec, &u->sink->sample_spec) / u->frame_size;
1155 pa_sink_request_rewind(u->sink, (size_t) -1);
1158 pa_sink_set_max_request_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused);
1160 pa_sink_set_max_rewind_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused);
1163 pa_sink_set_max_rewind_within_thread(u->sink, 0);
1205 if ((is_iec958(u) || is_hdmi(u)) && pa_sink_is_passthrough(u->sink)) {
1235 if (pa_frame_size(&u->sink->sample_spec) != u->frame_size) {
1236 update_size(u, &u->sink->sample_spec);
1241 ss = u->sink->sample_spec;
1257 if (!pa_sample_spec_equal(&ss, &u->sink->sample_spec)) {
1265 pa_proplist_setf(u->sink->proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%zu", u->hwbuf_size);
1266 pa_proplist_setf(u->sink->proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%zu", u->fragment_size);
1284 /* reset the watermark to the value defined when sink was created */
1286 reset_watermark(u, u->tsched_watermark_ref, &u->sink->sample_spec, true);
1308 * Sets the mixer settings to match the current sink and port state (the port
1320 * sink has no ports. */
1328 pa_alsa_path_select(u->mixer_path, setting, u->mixer_handle, u->sink->muted);
1330 if (u->sink->set_mute)
1331 u->sink->set_mute(u->sink);
1332 if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) {
1333 if (u->sink->write_volume)
1334 u->sink->write_volume(u->sink);
1336 if (u->sink->set_volume)
1337 u->sink->set_volume(u->sink);
1387 old_state = u->sink->state;
1439 * would start the sink suspended if opening the device
1470 if (!PA_SINK_IS_LINKED(u->sink->state))
1473 if (u->sink->suspend_cause & PA_SUSPEND_SESSION)
1477 pa_sink_get_volume(u->sink, true);
1478 pa_sink_get_mute(u->sink, true);
1493 if (u->sink->suspend_cause & PA_SUSPEND_SESSION)
1497 pa_sink_update_volume_and_mute(u->sink);
1662 pa_sink_set_write_volume_callback(u->sink, NULL);
1663 pa_sink_set_get_volume_callback(u->sink, NULL);
1664 pa_sink_set_set_volume_callback(u->sink, NULL);
1668 pa_sink_set_get_volume_callback(u->sink, sink_get_volume_cb);
1669 pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
1672 pa_sink_set_write_volume_callback(u->sink, sink_write_volume_cb);
1675 pa_sink_set_write_volume_callback(u->sink, NULL);
1678 pa_sink_enable_decibel_volume(u->sink, true);
1681 u->sink->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1682 u->sink->n_volume_steps = PA_VOLUME_NORM+1;
1684 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->sink->base_volume));
1686 pa_sink_enable_decibel_volume(u->sink, false);
1689 u->sink->base_volume = PA_VOLUME_NORM;
1690 u->sink->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1;
1697 pa_sink_set_get_mute_callback(u->sink, NULL);
1698 pa_sink_set_set_mute_callback(u->sink, NULL);
1701 pa_sink_set_get_mute_callback(u->sink, sink_get_mute_cb);
1702 pa_sink_set_set_mute_callback(u->sink, sink_set_mute_cb);
1720 pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_SYNC_MIXER, p, 0, NULL);
1741 pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_SYNC_MIXER, p, 0, NULL);
1837 pa_sink_set_sample_format(u->sink, spec->format);
1849 pa_sink_set_sample_format(u->sink, u->verified_sample_spec.format);
1857 pa_sink_set_sample_rate(u->sink, spec->rate);
1868 pa_sink_set_sample_rate(u->sink, u->verified_sample_spec.rate);
1887 if (!PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
1888 pa_sink_process_rewind(u->sink, 0);
1893 rewind_nbytes = u->sink->thread_info.rewind_nbytes;
1900 if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
1947 pa_sink_process_rewind(u->sink, rewind_nbytes);
1959 pa_sink_process_rewind(u->sink, 0);
1984 if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) {
1990 if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
2067 if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) {
2069 pa_sink_volume_change_apply(u->sink, &volume_sleep);
2102 if (u->sink->flags & PA_SINK_DEFERRED_VOLUME)
2103 pa_sink_volume_change_apply(u->sink, NULL);
2109 if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
2241 if (u->sink->active_port && u->ucm_context) {
2242 if (pa_alsa_ucm_set_port(u->ucm_context, u->sink->active_port, true) < 0)
2249 if (u->sink->active_port) {
2256 data = PA_DEVICE_PORT_DATA(u->sink->active_port);
2259 pa_alsa_path_select(data->path, data->setting, u->mixer_handle, u->sink->muted);
2263 data = PA_DEVICE_PORT_DATA(u->sink->active_port);
2268 pa_alsa_path_select(u->mixer_path, NULL, u->mixer_handle, u->sink->muted);
2279 pa_alsa_path_select(u->mixer_path, u->mixer_path->settings, u->mixer_handle, u->sink->muted);
2301 if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) {
2593 * cannot accept that, because nobody implemented sink channel count
2680 u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE | PA_SINK_LATENCY | (u->use_tsched ? PA_SINK_DYNAMIC_LATENCY : 0) |
2686 if (!u->sink) {
2687 pa_log("Failed to create sink object");
2692 u->smoother = pa_smoother_2_new(SMOOTHER_WINDOW_USEC, pa_rtclock_now(), frame_size, u->sink->sample_spec.rate);
2713 PA_HASHMAP_FOREACH(port, u->sink->ports, state) {
2719 u->sink->priority += h_prio;
2723 &u->sink->thread_info.volume_change_safety_margin) < 0) {
2729 &u->sink->thread_info.volume_change_extra_delay) < 0) {
2734 u->sink->parent.process_msg = sink_process_msg;
2736 u->sink->update_requested_latency = sink_update_requested_latency_cb;
2737 u->sink->set_state_in_main_thread = sink_set_state_in_main_thread_cb;
2738 u->sink->set_state_in_io_thread = sink_set_state_in_io_thread_cb;
2740 u->sink->set_port = sink_set_port_ucm_cb;
2742 u->sink->set_port = sink_set_port_cb;
2743 u->sink->reconfigure = sink_reconfigure_cb;
2744 u->sink->userdata = u;
2746 pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
2747 pa_sink_set_rtpoll(u->sink, u->rtpoll);
2753 pa_cvolume_mute(&u->hardware_volume, u->sink->sample_spec.channels);
2762 pa_sink_set_max_request(u->sink, u->hwbuf_size);
2764 pa_sink_set_max_rewind(u->sink, u->hwbuf_size);
2767 pa_sink_set_max_rewind(u->sink, 0);
2774 pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->hwbuf_size, &ss));
2786 thread_name = pa_sprintf_malloc("alsa-sink-%s", pa_strnull(pa_proplist_gets(u->sink->proplist, "alsa.id")));
2796 if (u->sink->set_volume)
2797 u->sink->set_volume(u->sink);
2799 if (u->sink->get_volume)
2800 u->sink->get_volume(u->sink);
2804 if (u->sink->set_mute)
2805 u->sink->set_mute(u->sink);
2807 if (u->sink->get_mute) {
2810 if (u->sink->get_mute(u->sink, &mute) >= 0)
2811 pa_sink_set_mute(u->sink, mute, false);
2815 if ((volume_is_set || mute_is_set) && u->sink->write_volume)
2816 u->sink->write_volume(u->sink);
2829 u->sink->get_formats = sink_get_formats;
2830 u->sink->set_formats = sink_set_formats;
2833 pa_sink_put(u->sink);
2846 if (u->sink->active_port && !u->ucm_context) {
2849 port_data = PA_DEVICE_PORT_DATA(u->sink->active_port);
2851 if (port_data->suspend_when_unavailable && u->sink->active_port->available == PA_AVAILABLE_NO)
2852 pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE);
2855 return u->sink;
2872 if (u->sink)
2873 pa_sink_unlink(u->sink);
2882 if (u->sink)
2883 pa_sink_unref(u->sink);
2905 /* Only free the mixer_path if the sink owns it */