Lines Matching full:s
59 static void reset_callbacks(pa_stream *s) { in reset_callbacks() argument
60 s->read_callback = NULL; in reset_callbacks()
61 s->read_userdata = NULL; in reset_callbacks()
62 s->write_callback = NULL; in reset_callbacks()
63 s->write_userdata = NULL; in reset_callbacks()
64 s->state_callback = NULL; in reset_callbacks()
65 s->state_userdata = NULL; in reset_callbacks()
66 s->overflow_callback = NULL; in reset_callbacks()
67 s->overflow_userdata = NULL; in reset_callbacks()
68 s->underflow_callback = NULL; in reset_callbacks()
69 s->underflow_userdata = NULL; in reset_callbacks()
70 s->latency_update_callback = NULL; in reset_callbacks()
71 s->latency_update_userdata = NULL; in reset_callbacks()
72 s->moved_callback = NULL; in reset_callbacks()
73 s->moved_userdata = NULL; in reset_callbacks()
74 s->suspended_callback = NULL; in reset_callbacks()
75 s->suspended_userdata = NULL; in reset_callbacks()
76 s->started_callback = NULL; in reset_callbacks()
77 s->started_userdata = NULL; in reset_callbacks()
78 s->event_callback = NULL; in reset_callbacks()
79 s->event_userdata = NULL; in reset_callbacks()
80 s->buffer_attr_callback = NULL; in reset_callbacks()
81 s->buffer_attr_userdata = NULL; in reset_callbacks()
93 pa_stream *s; in pa_stream_new_with_proplist_internal() local
104 s = pa_xnew(pa_stream, 1); in pa_stream_new_with_proplist_internal()
105 PA_REFCNT_INIT(s); in pa_stream_new_with_proplist_internal()
106 s->context = c; in pa_stream_new_with_proplist_internal()
107 s->mainloop = c->mainloop; in pa_stream_new_with_proplist_internal()
109 s->direction = PA_STREAM_NODIRECTION; in pa_stream_new_with_proplist_internal()
110 s->state = PA_STREAM_UNCONNECTED; in pa_stream_new_with_proplist_internal()
111 s->flags = 0; in pa_stream_new_with_proplist_internal()
114 s->sample_spec = *ss; in pa_stream_new_with_proplist_internal()
116 pa_sample_spec_init(&s->sample_spec); in pa_stream_new_with_proplist_internal()
119 s->channel_map = *map; in pa_stream_new_with_proplist_internal()
121 pa_channel_map_init(&s->channel_map); in pa_stream_new_with_proplist_internal()
123 s->n_formats = 0; in pa_stream_new_with_proplist_internal()
125 s->n_formats = n_formats; in pa_stream_new_with_proplist_internal()
127 s->req_formats[i] = pa_format_info_copy(formats[i]); in pa_stream_new_with_proplist_internal()
131 s->format = NULL; in pa_stream_new_with_proplist_internal()
133 s->direct_on_input = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
135 s->proplist = p ? pa_proplist_copy(p) : pa_proplist_new(); in pa_stream_new_with_proplist_internal()
137 pa_proplist_sets(s->proplist, PA_PROP_MEDIA_NAME, name); in pa_stream_new_with_proplist_internal()
139 s->channel = 0; in pa_stream_new_with_proplist_internal()
140 s->channel_valid = false; in pa_stream_new_with_proplist_internal()
141 s->syncid = c->csyncid++; in pa_stream_new_with_proplist_internal()
142 s->stream_index = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
144 s->requested_bytes = 0; in pa_stream_new_with_proplist_internal()
145 memset(&s->buffer_attr, 0, sizeof(s->buffer_attr)); in pa_stream_new_with_proplist_internal()
151 s->buffer_attr.maxlength = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
153 …s->buffer_attr.tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, ss); /* 250ms of buffer… in pa_stream_new_with_proplist_internal()
162 …s->buffer_attr.tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, &tmp_ss); /* 250ms of b… in pa_stream_new_with_proplist_internal()
164 s->buffer_attr.minreq = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
165 s->buffer_attr.prebuf = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
166 s->buffer_attr.fragsize = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
168 s->device_index = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
169 s->device_name = NULL; in pa_stream_new_with_proplist_internal()
170 s->suspended = false; in pa_stream_new_with_proplist_internal()
171 s->corked = false; in pa_stream_new_with_proplist_internal()
173 s->write_memblock = NULL; in pa_stream_new_with_proplist_internal()
174 s->write_data = NULL; in pa_stream_new_with_proplist_internal()
176 pa_memchunk_reset(&s->peek_memchunk); in pa_stream_new_with_proplist_internal()
177 s->peek_data = NULL; in pa_stream_new_with_proplist_internal()
178 s->record_memblockq = NULL; in pa_stream_new_with_proplist_internal()
180 memset(&s->timing_info, 0, sizeof(s->timing_info)); in pa_stream_new_with_proplist_internal()
181 s->timing_info_valid = false; in pa_stream_new_with_proplist_internal()
183 s->previous_time = 0; in pa_stream_new_with_proplist_internal()
184 s->latest_underrun_at_index = -1; in pa_stream_new_with_proplist_internal()
186 s->read_index_not_before = 0; in pa_stream_new_with_proplist_internal()
187 s->write_index_not_before = 0; in pa_stream_new_with_proplist_internal()
189 s->write_index_corrections[i].valid = 0; in pa_stream_new_with_proplist_internal()
190 s->current_write_index_correction = 0; in pa_stream_new_with_proplist_internal()
192 s->auto_timing_update_event = NULL; in pa_stream_new_with_proplist_internal()
193 s->auto_timing_update_requested = false; in pa_stream_new_with_proplist_internal()
194 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_stream_new_with_proplist_internal()
196 reset_callbacks(s); in pa_stream_new_with_proplist_internal()
198 s->smoother = NULL; in pa_stream_new_with_proplist_internal()
201 PA_LLIST_PREPEND(pa_stream, c->streams, s); in pa_stream_new_with_proplist_internal()
202 pa_stream_ref(s); in pa_stream_new_with_proplist_internal()
204 return s; in pa_stream_new_with_proplist_internal()
240 static void stream_unlink(pa_stream *s) { in stream_unlink() argument
242 pa_assert(s); in stream_unlink()
244 if (!s->context) in stream_unlink()
250 for (o = s->context->operations; o; o = n) { in stream_unlink()
253 if (o->stream == s) in stream_unlink()
258 if (s->context->pdispatch) in stream_unlink()
259 pa_pdispatch_unregister_reply(s->context->pdispatch, s); in stream_unlink()
261 if (s->channel_valid) { in stream_unlink()
262 …pa_hashmap_remove((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->pl… in stream_unlink()
263 s->channel = 0; in stream_unlink()
264 s->channel_valid = false; in stream_unlink()
267 PA_LLIST_REMOVE(pa_stream, s->context->streams, s); in stream_unlink()
268 pa_stream_unref(s); in stream_unlink()
270 s->context = NULL; in stream_unlink()
272 if (s->auto_timing_update_event) { in stream_unlink()
273 pa_assert(s->mainloop); in stream_unlink()
274 s->mainloop->time_free(s->auto_timing_update_event); in stream_unlink()
277 reset_callbacks(s); in stream_unlink()
280 static void stream_free(pa_stream *s) { in stream_free() argument
283 pa_assert(s); in stream_free()
285 stream_unlink(s); in stream_free()
287 if (s->write_memblock) { in stream_free()
288 if (s->write_data) in stream_free()
289 pa_memblock_release(s->write_memblock); in stream_free()
290 pa_memblock_unref(s->write_memblock); in stream_free()
293 if (s->peek_memchunk.memblock) { in stream_free()
294 if (s->peek_data) in stream_free()
295 pa_memblock_release(s->peek_memchunk.memblock); in stream_free()
296 pa_memblock_unref(s->peek_memchunk.memblock); in stream_free()
299 if (s->record_memblockq) in stream_free()
300 pa_memblockq_free(s->record_memblockq); in stream_free()
302 if (s->proplist) in stream_free()
303 pa_proplist_free(s->proplist); in stream_free()
305 if (s->smoother) in stream_free()
306 pa_smoother_free(s->smoother); in stream_free()
308 for (i = 0; i < s->n_formats; i++) in stream_free()
309 pa_format_info_free(s->req_formats[i]); in stream_free()
311 if (s->format) in stream_free()
312 pa_format_info_free(s->format); in stream_free()
314 pa_xfree(s->device_name); in stream_free()
315 pa_xfree(s); in stream_free()
318 void pa_stream_unref(pa_stream *s) { in pa_stream_unref() argument
319 pa_assert(s); in pa_stream_unref()
320 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_unref()
322 if (PA_REFCNT_DEC(s) <= 0) in pa_stream_unref()
323 stream_free(s); in pa_stream_unref()
326 pa_stream* pa_stream_ref(pa_stream *s) { in pa_stream_ref() argument
327 pa_assert(s); in pa_stream_ref()
328 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_ref()
330 PA_REFCNT_INC(s); in pa_stream_ref()
331 return s; in pa_stream_ref()
334 pa_stream_state_t pa_stream_get_state(const pa_stream *s) { in pa_stream_get_state() argument
335 pa_assert(s); in pa_stream_get_state()
336 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_state()
338 return s->state; in pa_stream_get_state()
341 pa_context* pa_stream_get_context(const pa_stream *s) { in pa_stream_get_context() argument
342 pa_assert(s); in pa_stream_get_context()
343 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_context()
345 return s->context; in pa_stream_get_context()
348 uint32_t pa_stream_get_index(const pa_stream *s) { in pa_stream_get_index() argument
349 pa_assert(s); in pa_stream_get_index()
350 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_index()
352 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_index()
353 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, PA_INVALID_… in pa_stream_get_index()
355 return s->stream_index; in pa_stream_get_index()
358 void pa_stream_set_state(pa_stream *s, pa_stream_state_t st) { in pa_stream_set_state() argument
359 pa_assert(s); in pa_stream_set_state()
360 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_state()
362 if (s->state == st) in pa_stream_set_state()
365 pa_stream_ref(s); in pa_stream_set_state()
367 s->state = st; in pa_stream_set_state()
369 if (s->state_callback) in pa_stream_set_state()
370 s->state_callback(s, s->state_userdata); in pa_stream_set_state()
373 stream_unlink(s); in pa_stream_set_state()
375 pa_stream_unref(s); in pa_stream_set_state()
378 static void request_auto_timing_update(pa_stream *s, bool force) { in request_auto_timing_update() argument
379 pa_assert(s); in request_auto_timing_update()
380 pa_assert(PA_REFCNT_VALUE(s) >= 1); in request_auto_timing_update()
382 if (!(s->flags & PA_STREAM_AUTO_TIMING_UPDATE)) in request_auto_timing_update()
385 if (s->state == PA_STREAM_READY && in request_auto_timing_update()
386 (force || !s->auto_timing_update_requested)) { in request_auto_timing_update()
393 if ((o = pa_stream_update_timing_info(s, NULL, NULL))) { in request_auto_timing_update()
395 s->auto_timing_update_requested = true; in request_auto_timing_update()
399 if (s->auto_timing_update_event) { in request_auto_timing_update()
400 if (s->suspended && !force) { in request_auto_timing_update()
401 pa_assert(s->mainloop); in request_auto_timing_update()
402 s->mainloop->time_free(s->auto_timing_update_event); in request_auto_timing_update()
403 s->auto_timing_update_event = NULL; in request_auto_timing_update()
406 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in request_auto_timing_update()
408 …pa_context_rttime_restart(s->context, s->auto_timing_update_event, pa_rtclock_now() + s->auto_timi… in request_auto_timing_update()
410 …s->auto_timing_interval_usec = PA_MIN(AUTO_TIMING_INTERVAL_END_USEC, s->auto_timing_interval_usec*… in request_auto_timing_update()
417 pa_stream *s; in pa_command_stream_killed() local
434 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->r… in pa_command_stream_killed()
437 if (s->state != PA_STREAM_READY) in pa_command_stream_killed()
441 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_command_stream_killed()
447 static void check_smoother_status(pa_stream *s, bool aposteriori, bool force_start, bool force_stop… in check_smoother_status() argument
450 pa_assert(s); in check_smoother_status()
453 if (!s->smoother) in check_smoother_status()
458 if (s->timing_info_valid) { in check_smoother_status()
460 x -= s->timing_info.transport_usec; in check_smoother_status()
462 x += s->timing_info.transport_usec; in check_smoother_status()
465 if (s->suspended || s->corked || force_stop) in check_smoother_status()
466 pa_smoother_pause(s->smoother, x); in check_smoother_status()
467 else if (force_start || s->buffer_attr.prebuf == 0) { in check_smoother_status()
469 if (!s->timing_info_valid && in check_smoother_status()
473 s->context->version >= 13) { in check_smoother_status()
485 pa_smoother_resume(s->smoother, x, true); in check_smoother_status()
496 pa_stream *s; in pa_command_stream_moved() local
556 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->re… in pa_command_stream_moved()
559 if (s->state != PA_STREAM_READY) in pa_command_stream_moved()
563 if (s->direction == PA_STREAM_RECORD) in pa_command_stream_moved()
564 s->timing_info.configured_source_usec = usec; in pa_command_stream_moved()
566 s->timing_info.configured_sink_usec = usec; in pa_command_stream_moved()
568 s->buffer_attr.maxlength = maxlength; in pa_command_stream_moved()
569 s->buffer_attr.fragsize = fragsize; in pa_command_stream_moved()
570 s->buffer_attr.tlength = tlength; in pa_command_stream_moved()
571 s->buffer_attr.prebuf = prebuf; in pa_command_stream_moved()
572 s->buffer_attr.minreq = minreq; in pa_command_stream_moved()
575 pa_xfree(s->device_name); in pa_command_stream_moved()
576 s->device_name = pa_xstrdup(dn); in pa_command_stream_moved()
577 s->device_index = di; in pa_command_stream_moved()
579 s->suspended = suspended; in pa_command_stream_moved()
581 if ((s->flags & PA_STREAM_AUTO_TIMING_UPDATE) && !suspended && !s->auto_timing_update_event) { in pa_command_stream_moved()
582 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_command_stream_moved()
583 …s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in pa_command_stream_moved()
584 request_auto_timing_update(s, true); in pa_command_stream_moved()
587 check_smoother_status(s, true, false, false); in pa_command_stream_moved()
588 request_auto_timing_update(s, true); in pa_command_stream_moved()
590 if (s->moved_callback) in pa_command_stream_moved()
591 s->moved_callback(s, s->moved_userdata); in pa_command_stream_moved()
599 pa_stream *s; in pa_command_stream_buffer_attr() local
645 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams … in pa_command_stream_buffer_attr()
648 if (s->state != PA_STREAM_READY) in pa_command_stream_buffer_attr()
651 if (s->direction == PA_STREAM_RECORD) in pa_command_stream_buffer_attr()
652 s->timing_info.configured_source_usec = usec; in pa_command_stream_buffer_attr()
654 s->timing_info.configured_sink_usec = usec; in pa_command_stream_buffer_attr()
656 s->buffer_attr.maxlength = maxlength; in pa_command_stream_buffer_attr()
657 s->buffer_attr.fragsize = fragsize; in pa_command_stream_buffer_attr()
658 s->buffer_attr.tlength = tlength; in pa_command_stream_buffer_attr()
659 s->buffer_attr.prebuf = prebuf; in pa_command_stream_buffer_attr()
660 s->buffer_attr.minreq = minreq; in pa_command_stream_buffer_attr()
662 request_auto_timing_update(s, true); in pa_command_stream_buffer_attr()
664 if (s->buffer_attr_callback) in pa_command_stream_buffer_attr()
665 s->buffer_attr_callback(s, s->buffer_attr_userdata); in pa_command_stream_buffer_attr()
673 pa_stream *s; in pa_command_stream_suspended() local
697 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c… in pa_command_stream_suspended()
700 if (s->state != PA_STREAM_READY) in pa_command_stream_suspended()
703 s->suspended = suspended; in pa_command_stream_suspended()
705 if ((s->flags & PA_STREAM_AUTO_TIMING_UPDATE) && !suspended && !s->auto_timing_update_event) { in pa_command_stream_suspended()
706 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_command_stream_suspended()
707 …s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in pa_command_stream_suspended()
708 request_auto_timing_update(s, true); in pa_command_stream_suspended()
711 check_smoother_status(s, true, false, false); in pa_command_stream_suspended()
712 request_auto_timing_update(s, true); in pa_command_stream_suspended()
714 if (s->suspended_callback) in pa_command_stream_suspended()
715 s->suspended_callback(s, s->suspended_userdata); in pa_command_stream_suspended()
723 pa_stream *s; in pa_command_stream_started() local
745 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_stream_started()
748 if (s->state != PA_STREAM_READY) in pa_command_stream_started()
751 check_smoother_status(s, true, true, false); in pa_command_stream_started()
752 request_auto_timing_update(s, true); in pa_command_stream_started()
754 if (s->started_callback) in pa_command_stream_started()
755 s->started_callback(s, s->started_userdata); in pa_command_stream_started()
763 pa_stream *s; in pa_command_stream_event() local
791 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->re… in pa_command_stream_event()
794 if (s->state != PA_STREAM_READY) in pa_command_stream_event()
800 if (pa_stream_get_time(s, &stream_time) == 0) in pa_command_stream_event()
804 if (s->event_callback) in pa_command_stream_event()
805 s->event_callback(s, event, pl, s->event_userdata); in pa_command_stream_event()
815 pa_stream *s; in pa_command_request() local
834 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_request()
837 if (s->state != PA_STREAM_READY) in pa_command_request()
840 s->requested_bytes += bytes; in pa_command_request()
843 …pa_log_debug("got request for %lli, now at %lli", (long long) bytes, (long long) s->requested_byte… in pa_command_request()
846 if (s->requested_bytes > 0 && s->write_callback) in pa_command_request()
847 s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata); in pa_command_request()
859 pa_stream *s; in pa_command_overflow_or_underflow() local
889 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_overflow_or_underflow()
892 if (s->state != PA_STREAM_READY) in pa_command_overflow_or_underflow()
896 s->latest_underrun_at_index = offset; in pa_command_overflow_or_underflow()
898 if (s->buffer_attr.prebuf > 0) in pa_command_overflow_or_underflow()
899 check_smoother_status(s, true, false, true); in pa_command_overflow_or_underflow()
901 request_auto_timing_update(s, true); in pa_command_overflow_or_underflow()
904 if (s->overflow_callback) in pa_command_overflow_or_underflow()
905 s->overflow_callback(s, s->overflow_userdata); in pa_command_overflow_or_underflow()
907 if (s->underflow_callback) in pa_command_overflow_or_underflow()
908 s->underflow_callback(s, s->underflow_userdata); in pa_command_overflow_or_underflow()
915 static void invalidate_indexes(pa_stream *s, bool r, bool w) { in invalidate_indexes() argument
916 pa_assert(s); in invalidate_indexes()
917 pa_assert(PA_REFCNT_VALUE(s) >= 1); in invalidate_indexes()
920 pa_log_debug("invalidate r:%u w:%u tag:%u", r, w, s->context->ctag); in invalidate_indexes()
923 if (s->state != PA_STREAM_READY) in invalidate_indexes()
927 s->write_index_not_before = s->context->ctag; in invalidate_indexes()
929 if (s->timing_info_valid) in invalidate_indexes()
930 s->timing_info.write_index_corrupt = true; in invalidate_indexes()
938 s->read_index_not_before = s->context->ctag; in invalidate_indexes()
940 if (s->timing_info_valid) in invalidate_indexes()
941 s->timing_info.read_index_corrupt = true; in invalidate_indexes()
948 request_auto_timing_update(s, true); in invalidate_indexes()
952 pa_stream *s = userdata; in auto_timing_update_callback() local
954 pa_assert(s); in auto_timing_update_callback()
955 pa_assert(PA_REFCNT_VALUE(s) >= 1); in auto_timing_update_callback()
957 pa_stream_ref(s); in auto_timing_update_callback()
958 request_auto_timing_update(s, false); in auto_timing_update_callback()
959 pa_stream_unref(s); in auto_timing_update_callback()
962 static void create_stream_complete(pa_stream *s) { in create_stream_complete() argument
963 pa_assert(s); in create_stream_complete()
964 pa_assert(PA_REFCNT_VALUE(s) >= 1); in create_stream_complete()
965 pa_assert(s->state == PA_STREAM_CREATING); in create_stream_complete()
967 pa_stream_set_state(s, PA_STREAM_READY); in create_stream_complete()
969 if (s->requested_bytes > 0 && s->write_callback) in create_stream_complete()
970 s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata); in create_stream_complete()
972 if (s->flags & PA_STREAM_AUTO_TIMING_UPDATE) { in create_stream_complete()
973 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in create_stream_complete()
974 pa_assert(!s->auto_timing_update_event); in create_stream_complete()
975 …s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in create_stream_complete()
977 request_auto_timing_update(s, true); in create_stream_complete()
980 check_smoother_status(s, true, false, false); in create_stream_complete()
983 static void patch_buffer_attr(pa_stream *s, pa_buffer_attr *attr, pa_stream_flags_t *flags) { in patch_buffer_attr() argument
986 pa_assert(s); in patch_buffer_attr()
995 if (pa_sample_spec_valid(&s->sample_spec)) in patch_buffer_attr()
996 ss = s->sample_spec; in patch_buffer_attr()
997 else if (s->n_formats == 1) in patch_buffer_attr()
998 pa_format_info_to_sample_spec(s->req_formats[0], &ss, NULL); in patch_buffer_attr()
1001 pa_log_debug("Failed to parse $PULSE_LATENCY_MSEC: %s", e); in patch_buffer_attr()
1002 else if (!pa_sample_spec_valid(&s->sample_spec)) in patch_buffer_attr()
1003 pa_log_debug("Ignoring $PULSE_LATENCY_MSEC: %s (invalid sample spec)", e); in patch_buffer_attr()
1016 if (s->context->version >= 13) in patch_buffer_attr()
1029 …attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, &s->sample_spec); /* 250ms of bu… in patch_buffer_attr()
1042 pa_stream *s = userdata; in pa_create_stream_callback() local
1046 pa_assert(s); in pa_create_stream_callback()
1047 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_create_stream_callback()
1048 pa_assert(s->state == PA_STREAM_CREATING); in pa_create_stream_callback()
1050 pa_stream_ref(s); in pa_create_stream_callback()
1053 if (pa_context_handle_error(s->context, command, t, false) < 0) in pa_create_stream_callback()
1056 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_create_stream_callback()
1060 if (pa_tagstruct_getu32(t, &s->channel) < 0 || in pa_create_stream_callback()
1061 s->channel == PA_INVALID_INDEX || in pa_create_stream_callback()
1062 …((s->direction != PA_STREAM_UPLOAD) && (pa_tagstruct_getu32(t, &s->stream_index) < 0 || s->stream_… in pa_create_stream_callback()
1063 ((s->direction != PA_STREAM_RECORD) && pa_tagstruct_getu32(t, &requested_bytes) < 0)) { in pa_create_stream_callback()
1064 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1068 s->requested_bytes = (int64_t) requested_bytes; in pa_create_stream_callback()
1070 if (s->context->version >= 9) { in pa_create_stream_callback()
1071 if (s->direction == PA_STREAM_PLAYBACK) { in pa_create_stream_callback()
1072 if (pa_tagstruct_getu32(t, &s->buffer_attr.maxlength) < 0 || in pa_create_stream_callback()
1073 pa_tagstruct_getu32(t, &s->buffer_attr.tlength) < 0 || in pa_create_stream_callback()
1074 pa_tagstruct_getu32(t, &s->buffer_attr.prebuf) < 0 || in pa_create_stream_callback()
1075 pa_tagstruct_getu32(t, &s->buffer_attr.minreq) < 0) { in pa_create_stream_callback()
1076 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1079 } else if (s->direction == PA_STREAM_RECORD) { in pa_create_stream_callback()
1080 if (pa_tagstruct_getu32(t, &s->buffer_attr.maxlength) < 0 || in pa_create_stream_callback()
1081 pa_tagstruct_getu32(t, &s->buffer_attr.fragsize) < 0) { in pa_create_stream_callback()
1082 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1088 if (s->context->version >= 12 && s->direction != PA_STREAM_UPLOAD) { in pa_create_stream_callback()
1096 pa_tagstruct_getu32(t, &s->device_index) < 0 || in pa_create_stream_callback()
1099 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1103 if (!dn || s->device_index == PA_INVALID_INDEX || in pa_create_stream_callback()
1107 (s->n_formats == 0 && ( in pa_create_stream_callback()
1108 (!(s->flags & PA_STREAM_FIX_FORMAT) && ss.format != s->sample_spec.format) || in pa_create_stream_callback()
1109 (!(s->flags & PA_STREAM_FIX_RATE) && ss.rate != s->sample_spec.rate) || in pa_create_stream_callback()
1110 … (!(s->flags & PA_STREAM_FIX_CHANNELS) && !pa_channel_map_equal(&cm, &s->channel_map))))) { in pa_create_stream_callback()
1111 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1115 pa_xfree(s->device_name); in pa_create_stream_callback()
1116 s->device_name = pa_xstrdup(dn); in pa_create_stream_callback()
1117 s->suspended = suspended; in pa_create_stream_callback()
1119 s->channel_map = cm; in pa_create_stream_callback()
1120 s->sample_spec = ss; in pa_create_stream_callback()
1123 if (s->context->version >= 13 && s->direction != PA_STREAM_UPLOAD) { in pa_create_stream_callback()
1127 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1131 if (s->direction == PA_STREAM_RECORD) in pa_create_stream_callback()
1132 s->timing_info.configured_source_usec = usec; in pa_create_stream_callback()
1134 s->timing_info.configured_sink_usec = usec; in pa_create_stream_callback()
1137 if ((s->context->version >= 21 && s->direction == PA_STREAM_PLAYBACK) in pa_create_stream_callback()
1138 || s->context->version >= 22) { in pa_create_stream_callback()
1144 if (s->n_formats > 0) { in pa_create_stream_callback()
1146 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1150 s->format = f; in pa_create_stream_callback()
1154 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1158 if (s->direction == PA_STREAM_RECORD) { in pa_create_stream_callback()
1159 pa_assert(!s->record_memblockq); in pa_create_stream_callback()
1161 s->record_memblockq = pa_memblockq_new( in pa_create_stream_callback()
1164 s->buffer_attr.maxlength, in pa_create_stream_callback()
1166 &s->sample_spec, in pa_create_stream_callback()
1173 s->channel_valid = true; in pa_create_stream_callback()
1174 …hashmap_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback… in pa_create_stream_callback()
1176 create_stream_complete(s); in pa_create_stream_callback()
1179 pa_stream_unref(s); in pa_create_stream_callback()
1184 pa_stream *s, in create_stream() argument
1197 pa_assert(s); in create_stream()
1198 pa_assert(PA_REFCNT_VALUE(s) >= 1); in create_stream()
1201 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in create_stream()
1202 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE); in create_stream()
1203 …PA_CHECK_VALIDITY(s->context, s->direct_on_input == PA_INVALID_INDEX || direction == PA_STREAM_REC… in create_stream()
1204 PA_CHECK_VALIDITY(s->context, !(flags & ~(PA_STREAM_START_CORKED| in create_stream()
1225 …PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_… in create_stream()
1226 …PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ER… in create_stream()
1227 PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); in create_stream()
1233 …PA_CHECK_VALIDITY(s->context, direction == PA_STREAM_RECORD || !(flags & (PA_STREAM_PEAK_DETECT)),… in create_stream()
1234 …PA_CHECK_VALIDITY(s->context, !sync_stream || (direction == PA_STREAM_PLAYBACK && sync_stream->dir… in create_stream()
1235 …PA_CHECK_VALIDITY(s->context, (flags & (PA_STREAM_ADJUST_LATENCY|PA_STREAM_EARLY_REQUESTS)) != (PA… in create_stream()
1237 pa_stream_ref(s); in create_stream()
1239 s->direction = direction; in create_stream()
1242 s->syncid = sync_stream->syncid; in create_stream()
1245 s->buffer_attr = *attr; in create_stream()
1246 patch_buffer_attr(s, &s->buffer_attr, &flags); in create_stream()
1248 s->flags = flags; in create_stream()
1249 s->corked = !!(flags & PA_STREAM_START_CORKED); in create_stream()
1256 pa_assert(!s->smoother); in create_stream()
1257 s->smoother = pa_smoother_new( in create_stream()
1268 …dev = s->direction == PA_STREAM_PLAYBACK ? s->context->conf->default_sink : s->context->conf->defa… in create_stream()
1271 s->context, in create_stream()
1272 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_CREATE_PLAYBACK_STREAM : PA_COMMAND_CR… in create_stream()
1275 if (s->context->version < 13) in create_stream()
1276 pa_tagstruct_puts(t, pa_proplist_gets(s->proplist, PA_PROP_MEDIA_NAME)); in create_stream()
1280 PA_TAG_SAMPLE_SPEC, &s->sample_spec, in create_stream()
1281 PA_TAG_CHANNEL_MAP, &s->channel_map, in create_stream()
1284 PA_TAG_U32, s->buffer_attr.maxlength, in create_stream()
1285 PA_TAG_BOOLEAN, s->corked, in create_stream()
1289 if (pa_sample_spec_valid(&s->sample_spec)) in create_stream()
1290 volume = pa_cvolume_reset(&cv, s->sample_spec.channels); in create_stream()
1299 if (s->direction == PA_STREAM_PLAYBACK) { in create_stream()
1302 PA_TAG_U32, s->buffer_attr.tlength, in create_stream()
1303 PA_TAG_U32, s->buffer_attr.prebuf, in create_stream()
1304 PA_TAG_U32, s->buffer_attr.minreq, in create_stream()
1305 PA_TAG_U32, s->syncid, in create_stream()
1310 pa_tagstruct_putu32(t, s->buffer_attr.fragsize); in create_stream()
1312 if (s->context->version >= 12) { in create_stream()
1325 if (s->context->version >= 13) { in create_stream()
1327 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1335 PA_TAG_PROPLIST, s->proplist, in create_stream()
1338 if (s->direction == PA_STREAM_RECORD) in create_stream()
1339 pa_tagstruct_putu32(t, s->direct_on_input); in create_stream()
1342 if (s->context->version >= 14) { in create_stream()
1344 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1350 if (s->context->version >= 15) { in create_stream()
1352 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1359 if (s->context->version >= 17 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1362 if (s->context->version >= 18 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1365 if ((s->context->version >= 21 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1366 || s->context->version >= 22) { in create_stream()
1368 pa_tagstruct_putu8(t, s->n_formats); in create_stream()
1369 for (i = 0; i < s->n_formats; i++) in create_stream()
1370 pa_tagstruct_put_format_info(t, s->req_formats[i]); in create_stream()
1373 if (s->context->version >= 22 && s->direction == PA_STREAM_RECORD) { in create_stream()
1382 pa_pstream_send_tagstruct(s->context->pstream, t); in create_stream()
1383 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback… in create_stream()
1385 pa_stream_set_state(s, PA_STREAM_CREATING); in create_stream()
1387 pa_stream_unref(s); in create_stream()
1392 pa_stream *s, in pa_stream_connect_playback() argument
1399 pa_assert(s); in pa_stream_connect_playback()
1400 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_connect_playback()
1402 return create_stream(PA_STREAM_PLAYBACK, s, dev, attr, flags, volume, sync_stream); in pa_stream_connect_playback()
1406 pa_stream *s, in pa_stream_connect_record() argument
1411 pa_assert(s); in pa_stream_connect_record()
1412 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_connect_record()
1414 return create_stream(PA_STREAM_RECORD, s, dev, attr, flags, NULL, NULL); in pa_stream_connect_record()
1418 pa_stream *s, in pa_stream_begin_write() argument
1422 pa_assert(s); in pa_stream_begin_write()
1423 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_begin_write()
1425 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_begin_write()
1426 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_begin_write()
1427 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_begin_write()
1428 PA_CHECK_VALIDITY(s->context, data, PA_ERR_INVALID); in pa_stream_begin_write()
1429 PA_CHECK_VALIDITY(s->context, nbytes && *nbytes != 0, PA_ERR_INVALID); in pa_stream_begin_write()
1434 m = pa_mempool_block_size_max(s->context->mempool); in pa_stream_begin_write()
1435 fs = pa_frame_size(&s->sample_spec); in pa_stream_begin_write()
1442 if (!s->write_memblock) { in pa_stream_begin_write()
1443 s->write_memblock = pa_memblock_new(s->context->mempool, *nbytes); in pa_stream_begin_write()
1444 s->write_data = pa_memblock_acquire(s->write_memblock); in pa_stream_begin_write()
1447 *data = s->write_data; in pa_stream_begin_write()
1448 *nbytes = pa_memblock_get_length(s->write_memblock); in pa_stream_begin_write()
1454 pa_stream *s) { in pa_stream_cancel_write() argument
1456 pa_assert(s); in pa_stream_cancel_write()
1457 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_cancel_write()
1459 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_cancel_write()
1460 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_cancel_write()
1461 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_cancel_write()
1462 PA_CHECK_VALIDITY(s->context, s->write_memblock, PA_ERR_BADSTATE); in pa_stream_cancel_write()
1464 pa_assert(s->write_data); in pa_stream_cancel_write()
1466 pa_memblock_release(s->write_memblock); in pa_stream_cancel_write()
1467 pa_memblock_unref(s->write_memblock); in pa_stream_cancel_write()
1468 s->write_memblock = NULL; in pa_stream_cancel_write()
1469 s->write_data = NULL; in pa_stream_cancel_write()
1475 pa_stream *s, in pa_stream_write_ext_free() argument
1483 pa_assert(s); in pa_stream_write_ext_free()
1484 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_write_ext_free()
1487 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_write_ext_free()
1488 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_write_ext_free()
1489 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_write_ext_free()
1490 PA_CHECK_VALIDITY(s->context, seek <= PA_SEEK_RELATIVE_END, PA_ERR_INVALID); in pa_stream_write_ext_free()
1491 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || (seek == PA_SEEK_RELATIVE && o… in pa_stream_write_ext_free()
1492 PA_CHECK_VALIDITY(s->context, in pa_stream_write_ext_free()
1493 !s->write_memblock || in pa_stream_write_ext_free()
1494 ((data >= s->write_data) && in pa_stream_write_ext_free()
1495 …((const char*) data + length <= (const char*) s->write_data + pa_memblock_get_length(s->write_memb… in pa_stream_write_ext_free()
1497 PA_CHECK_VALIDITY(s->context, offset % pa_frame_size(&s->sample_spec) == 0, PA_ERR_INVALID); in pa_stream_write_ext_free()
1498 PA_CHECK_VALIDITY(s->context, length % pa_frame_size(&s->sample_spec) == 0, PA_ERR_INVALID); in pa_stream_write_ext_free()
1499 PA_CHECK_VALIDITY(s->context, !free_cb || !s->write_memblock, PA_ERR_INVALID); in pa_stream_write_ext_free()
1501 if (s->write_memblock) { in pa_stream_write_ext_free()
1506 pa_memblock_release(s->write_memblock); in pa_stream_write_ext_free()
1508 chunk.memblock = s->write_memblock; in pa_stream_write_ext_free()
1509 chunk.index = (const char *) data - (const char *) s->write_data; in pa_stream_write_ext_free()
1512 s->write_memblock = NULL; in pa_stream_write_ext_free()
1513 s->write_data = NULL; in pa_stream_write_ext_free()
1515 pa_pstream_send_memblock(s->context->pstream, s->channel, offset, seek, &chunk); in pa_stream_write_ext_free()
1531 if (free_cb && !pa_pstream_get_shm(s->context->pstream)) { in pa_stream_write_ext_free()
1532 …chunk.memblock = pa_memblock_new_user(s->context->mempool, (void*) t_data, t_length, free_cb, free… in pa_stream_write_ext_free()
1540 … blk_size_max = pa_frame_align(pa_mempool_block_size_max(s->context->mempool), &s->sample_spec); in pa_stream_write_ext_free()
1542 chunk.memblock = pa_memblock_new(s->context->mempool, chunk.length); in pa_stream_write_ext_free()
1549 pa_pstream_send_memblock(s->context->pstream, s->channel, t_offset, t_seek, &chunk); in pa_stream_write_ext_free()
1560 if (free_cb && pa_pstream_get_shm(s->context->pstream)) in pa_stream_write_ext_free()
1565 * that's OK, the server side applies the same error */ in pa_stream_write_ext_free()
1566 s->requested_bytes -= (seek == PA_SEEK_RELATIVE ? offset : 0) + (int64_t) length; in pa_stream_write_ext_free()
1569 pa_log_debug("wrote %lli, now at %lli", (long long) length, (long long) s->requested_bytes); in pa_stream_write_ext_free()
1572 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_write_ext_free()
1575 if (s->write_index_corrections[s->current_write_index_correction].valid) { in pa_stream_write_ext_free()
1578 s->write_index_corrections[s->current_write_index_correction].corrupt = false; in pa_stream_write_ext_free()
1579 s->write_index_corrections[s->current_write_index_correction].absolute = true; in pa_stream_write_ext_free()
1580 … s->write_index_corrections[s->current_write_index_correction].value = offset + (int64_t) length; in pa_stream_write_ext_free()
1582 if (!s->write_index_corrections[s->current_write_index_correction].corrupt) in pa_stream_write_ext_free()
1583 … s->write_index_corrections[s->current_write_index_correction].value += offset + (int64_t) length; in pa_stream_write_ext_free()
1585 s->write_index_corrections[s->current_write_index_correction].corrupt = true; in pa_stream_write_ext_free()
1589 if (s->timing_info_valid) { in pa_stream_write_ext_free()
1592 s->timing_info.write_index_corrupt = false; in pa_stream_write_ext_free()
1593 s->timing_info.write_index = offset + (int64_t) length; in pa_stream_write_ext_free()
1595 if (!s->timing_info.write_index_corrupt) in pa_stream_write_ext_free()
1596 s->timing_info.write_index += offset + (int64_t) length; in pa_stream_write_ext_free()
1598 s->timing_info.write_index_corrupt = true; in pa_stream_write_ext_free()
1601 if (!s->timing_info_valid || s->timing_info.write_index_corrupt) in pa_stream_write_ext_free()
1602 request_auto_timing_update(s, true); in pa_stream_write_ext_free()
1609 pa_stream *s, in pa_stream_write() argument
1616 return pa_stream_write_ext_free(s, data, length, free_cb, (void*) data, offset, seek); in pa_stream_write()
1619 int pa_stream_peek(pa_stream *s, const void **data, size_t *length) { in pa_stream_peek() argument
1620 pa_assert(s); in pa_stream_peek()
1621 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_peek()
1625 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_peek()
1626 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_peek()
1627 PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE); in pa_stream_peek()
1629 if (!s->peek_memchunk.memblock) { in pa_stream_peek()
1631 if (pa_memblockq_peek(s->record_memblockq, &s->peek_memchunk) < 0) { in pa_stream_peek()
1637 } else if (!s->peek_memchunk.memblock) { in pa_stream_peek()
1641 *length = s->peek_memchunk.length; in pa_stream_peek()
1645 s->peek_data = pa_memblock_acquire(s->peek_memchunk.memblock); in pa_stream_peek()
1648 pa_assert(s->peek_data); in pa_stream_peek()
1649 *data = (uint8_t*) s->peek_data + s->peek_memchunk.index; in pa_stream_peek()
1650 *length = s->peek_memchunk.length; in pa_stream_peek()
1654 int pa_stream_drop(pa_stream *s) { in pa_stream_drop() argument
1655 pa_assert(s); in pa_stream_drop()
1656 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_drop()
1658 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_drop()
1659 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_drop()
1660 PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE); in pa_stream_drop()
1661 PA_CHECK_VALIDITY(s->context, s->peek_memchunk.length > 0, PA_ERR_BADSTATE); in pa_stream_drop()
1663 pa_memblockq_drop(s->record_memblockq, s->peek_memchunk.length); in pa_stream_drop()
1666 if (s->timing_info_valid && !s->timing_info.read_index_corrupt) in pa_stream_drop()
1667 s->timing_info.read_index += (int64_t) s->peek_memchunk.length; in pa_stream_drop()
1669 if (s->peek_memchunk.memblock) { in pa_stream_drop()
1670 pa_assert(s->peek_data); in pa_stream_drop()
1671 s->peek_data = NULL; in pa_stream_drop()
1672 pa_memblock_release(s->peek_memchunk.memblock); in pa_stream_drop()
1673 pa_memblock_unref(s->peek_memchunk.memblock); in pa_stream_drop()
1676 pa_memchunk_reset(&s->peek_memchunk); in pa_stream_drop()
1681 size_t pa_stream_writable_size(const pa_stream *s) { in pa_stream_writable_size() argument
1682 pa_assert(s); in pa_stream_writable_size()
1683 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_writable_size()
1685 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, (size_t) -1); in pa_stream_writable_size()
1686 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, (size_t) -1… in pa_stream_writable_size()
1687 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction != PA_STREAM_RECORD, PA_ERR_BADSTATE, (size_… in pa_stream_writable_size()
1689 return s->requested_bytes > 0 ? (size_t) s->requested_bytes : 0; in pa_stream_writable_size()
1692 size_t pa_stream_readable_size(const pa_stream *s) { in pa_stream_readable_size() argument
1693 pa_assert(s); in pa_stream_readable_size()
1694 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_readable_size()
1696 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, (size_t) -1); in pa_stream_readable_size()
1697 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, (size_t) -1… in pa_stream_readable_size()
1698 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE, (size_… in pa_stream_readable_size()
1700 return pa_memblockq_get_length(s->record_memblockq); in pa_stream_readable_size()
1703 pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_drain() argument
1708 pa_assert(s); in pa_stream_drain()
1709 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_drain()
1711 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_drain()
1712 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_drain()
1713 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_drain()
1718 request_auto_timing_update(s, true); in pa_stream_drain()
1720 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_drain()
1722 t = pa_tagstruct_command(s->context, PA_COMMAND_DRAIN_PLAYBACK_STREAM, &tag); in pa_stream_drain()
1723 pa_tagstruct_putu32(t, s->channel); in pa_stream_drain()
1724 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_drain()
1725 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_drain()
1728 * let's request a timing update */ in pa_stream_drain()
1729 request_auto_timing_update(s, true); in pa_stream_drain()
1734 static pa_usec_t calc_time(const pa_stream *s, bool ignore_transport) { in calc_time() argument
1737 pa_assert(s); in calc_time()
1738 pa_assert(PA_REFCNT_VALUE(s) >= 1); in calc_time()
1739 pa_assert(s->state == PA_STREAM_READY); in calc_time()
1740 pa_assert(s->direction != PA_STREAM_UPLOAD); in calc_time()
1741 pa_assert(s->timing_info_valid); in calc_time()
1742 pa_assert(s->direction != PA_STREAM_PLAYBACK || !s->timing_info.read_index_corrupt); in calc_time()
1743 pa_assert(s->direction != PA_STREAM_RECORD || !s->timing_info.write_index_corrupt); in calc_time()
1745 if (s->direction == PA_STREAM_PLAYBACK) { in calc_time()
1748 …usec = pa_bytes_to_usec(s->timing_info.read_index < 0 ? 0 : (uint64_t) s->timing_info.read_index, … in calc_time()
1750 if (!s->corked && !s->suspended) { in calc_time()
1756 usec += s->timing_info.transport_usec; in calc_time()
1761 if (s->timing_info.sink_usec >= usec) in calc_time()
1764 usec -= s->timing_info.sink_usec; in calc_time()
1768 pa_assert(s->direction == PA_STREAM_RECORD); in calc_time()
1772 …usec = pa_bytes_to_usec(s->timing_info.write_index < 0 ? 0 : (uint64_t) s->timing_info.write_index… in calc_time()
1774 if (!s->corked && !s->suspended) { in calc_time()
1778 usec += s->timing_info.transport_usec; in calc_time()
1781 usec += s->timing_info.source_usec; in calc_time()
1785 if (s->timing_info.sink_usec >= usec) in calc_time()
1788 usec -= s->timing_info.sink_usec; in calc_time()
1867 /* clocks are not synchronized, let's estimate latency then */ in stream_get_timing_info_callback()
1981 pa_operation* pa_stream_update_timing_info(pa_stream *s, pa_stream_success_cb_t cb, void *userdata)… in pa_stream_update_timing_info() argument
1988 pa_assert(s); in pa_stream_update_timing_info()
1989 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_update_timing_info()
1991 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_update_timing_info()
1992 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_update_timing_info()
1993 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_update_timing_info()
1995 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_update_timing_info()
1997 cidx = (s->current_write_index_correction + 1) % PA_MAX_WRITE_INDEX_CORRECTIONS; in pa_stream_update_timing_info()
2000 …PA_CHECK_VALIDITY_RETURN_NULL(s->context, !s->write_index_corrections[cidx].valid, PA_ERR_INTERNAL… in pa_stream_update_timing_info()
2002 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_update_timing_info()
2005 s->context, in pa_stream_update_timing_info()
2006 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_GET_PLAYBACK_LATENCY : PA_COMMAND_GET_… in pa_stream_update_timing_info()
2008 pa_tagstruct_putu32(t, s->channel); in pa_stream_update_timing_info()
2011 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_update_timing_info()
2012 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_get_timing_info_ca… in pa_stream_update_timing_info()
2014 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_update_timing_info()
2017 s->current_write_index_correction = cidx; in pa_stream_update_timing_info()
2019 s->write_index_corrections[cidx].valid = true; in pa_stream_update_timing_info()
2020 s->write_index_corrections[cidx].absolute = false; in pa_stream_update_timing_info()
2021 s->write_index_corrections[cidx].corrupt = false; in pa_stream_update_timing_info()
2022 s->write_index_corrections[cidx].tag = tag; in pa_stream_update_timing_info()
2023 s->write_index_corrections[cidx].value = 0; in pa_stream_update_timing_info()
2030 pa_stream *s = userdata; in pa_stream_disconnect_callback() local
2033 pa_assert(s); in pa_stream_disconnect_callback()
2034 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_disconnect_callback()
2036 pa_stream_ref(s); in pa_stream_disconnect_callback()
2039 if (pa_context_handle_error(s->context, command, t, false) < 0) in pa_stream_disconnect_callback()
2042 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_stream_disconnect_callback()
2045 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_stream_disconnect_callback()
2049 pa_stream_set_state(s, PA_STREAM_TERMINATED); in pa_stream_disconnect_callback()
2052 pa_stream_unref(s); in pa_stream_disconnect_callback()
2055 int pa_stream_disconnect(pa_stream *s) { in pa_stream_disconnect() argument
2059 pa_assert(s); in pa_stream_disconnect()
2060 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_disconnect()
2062 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_disconnect()
2063 PA_CHECK_VALIDITY(s->context, s->channel_valid, PA_ERR_BADSTATE); in pa_stream_disconnect()
2064 PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); in pa_stream_disconnect()
2066 pa_stream_ref(s); in pa_stream_disconnect()
2069 s->context, in pa_stream_disconnect()
2070 (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_DELETE_PLAYBACK_STREAM : in pa_stream_disconnect()
2071 …(s->direction == PA_STREAM_RECORD ? PA_COMMAND_DELETE_RECORD_STREAM : PA_COMMAND_DELETE_UPLOAD_STR… in pa_stream_disconnect()
2073 pa_tagstruct_putu32(t, s->channel); in pa_stream_disconnect()
2074 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_disconnect()
2075 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_disconnect_call… in pa_stream_disconnect()
2077 pa_stream_unref(s); in pa_stream_disconnect()
2081 void pa_stream_set_read_callback(pa_stream *s, pa_stream_request_cb_t cb, void *userdata) { in pa_stream_set_read_callback() argument
2082 pa_assert(s); in pa_stream_set_read_callback()
2083 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_read_callback()
2088 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_read_callback()
2091 s->read_callback = cb; in pa_stream_set_read_callback()
2092 s->read_userdata = userdata; in pa_stream_set_read_callback()
2095 void pa_stream_set_write_callback(pa_stream *s, pa_stream_request_cb_t cb, void *userdata) { in pa_stream_set_write_callback() argument
2096 pa_assert(s); in pa_stream_set_write_callback()
2097 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_write_callback()
2102 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_write_callback()
2105 s->write_callback = cb; in pa_stream_set_write_callback()
2106 s->write_userdata = userdata; in pa_stream_set_write_callback()
2109 void pa_stream_set_state_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_state_callback() argument
2110 pa_assert(s); in pa_stream_set_state_callback()
2111 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_state_callback()
2116 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_state_callback()
2119 s->state_callback = cb; in pa_stream_set_state_callback()
2120 s->state_userdata = userdata; in pa_stream_set_state_callback()
2123 void pa_stream_set_overflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_overflow_callback() argument
2124 pa_assert(s); in pa_stream_set_overflow_callback()
2125 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_overflow_callback()
2130 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_overflow_callback()
2133 s->overflow_callback = cb; in pa_stream_set_overflow_callback()
2134 s->overflow_userdata = userdata; in pa_stream_set_overflow_callback()
2137 void pa_stream_set_underflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_underflow_callback() argument
2138 pa_assert(s); in pa_stream_set_underflow_callback()
2139 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_underflow_callback()
2144 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_underflow_callback()
2147 s->underflow_callback = cb; in pa_stream_set_underflow_callback()
2148 s->underflow_userdata = userdata; in pa_stream_set_underflow_callback()
2151 void pa_stream_set_latency_update_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_latency_update_callback() argument
2152 pa_assert(s); in pa_stream_set_latency_update_callback()
2153 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_latency_update_callback()
2158 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_latency_update_callback()
2161 s->latency_update_callback = cb; in pa_stream_set_latency_update_callback()
2162 s->latency_update_userdata = userdata; in pa_stream_set_latency_update_callback()
2165 void pa_stream_set_moved_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_moved_callback() argument
2166 pa_assert(s); in pa_stream_set_moved_callback()
2167 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_moved_callback()
2172 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_moved_callback()
2175 s->moved_callback = cb; in pa_stream_set_moved_callback()
2176 s->moved_userdata = userdata; in pa_stream_set_moved_callback()
2179 void pa_stream_set_suspended_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_suspended_callback() argument
2180 pa_assert(s); in pa_stream_set_suspended_callback()
2181 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_suspended_callback()
2186 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_suspended_callback()
2189 s->suspended_callback = cb; in pa_stream_set_suspended_callback()
2190 s->suspended_userdata = userdata; in pa_stream_set_suspended_callback()
2193 void pa_stream_set_started_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_started_callback() argument
2194 pa_assert(s); in pa_stream_set_started_callback()
2195 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_started_callback()
2200 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_started_callback()
2203 s->started_callback = cb; in pa_stream_set_started_callback()
2204 s->started_userdata = userdata; in pa_stream_set_started_callback()
2207 void pa_stream_set_event_callback(pa_stream *s, pa_stream_event_cb_t cb, void *userdata) { in pa_stream_set_event_callback() argument
2208 pa_assert(s); in pa_stream_set_event_callback()
2209 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_event_callback()
2214 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_event_callback()
2217 s->event_callback = cb; in pa_stream_set_event_callback()
2218 s->event_userdata = userdata; in pa_stream_set_event_callback()
2221 void pa_stream_set_buffer_attr_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_buffer_attr_callback() argument
2222 pa_assert(s); in pa_stream_set_buffer_attr_callback()
2223 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_buffer_attr_callback()
2228 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_buffer_attr_callback()
2231 s->buffer_attr_callback = cb; in pa_stream_set_buffer_attr_callback()
2232 s->buffer_attr_userdata = userdata; in pa_stream_set_buffer_attr_callback()
2266 pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_cork() argument
2271 pa_assert(s); in pa_stream_cork()
2272 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_cork()
2274 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_cork()
2275 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_cork()
2276 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_cork()
2281 request_auto_timing_update(s, true); in pa_stream_cork()
2283 s->corked = b; in pa_stream_cork()
2285 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_cork()
2288 s->context, in pa_stream_cork()
2289 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_CORK_PLAYBACK_STREAM : PA_COMMAND_CORK… in pa_stream_cork()
2291 pa_tagstruct_putu32(t, s->channel); in pa_stream_cork()
2293 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_cork()
2294 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_cork()
2296 check_smoother_status(s, false, false, false); in pa_stream_cork()
2298 /* This might cause the indexes to hang/start again, hence let's in pa_stream_cork()
2300 request_auto_timing_update(s, true); in pa_stream_cork()
2305 static pa_operation* stream_send_simple_command(pa_stream *s, uint32_t command, pa_stream_success_c… in stream_send_simple_command() argument
2310 pa_assert(s); in stream_send_simple_command()
2311 pa_assert(PA_REFCNT_VALUE(s) >= 1); in stream_send_simple_command()
2313 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in stream_send_simple_command()
2314 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in stream_send_simple_command()
2316 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in stream_send_simple_command()
2318 t = pa_tagstruct_command(s->context, command, &tag); in stream_send_simple_command()
2319 pa_tagstruct_putu32(t, s->channel); in stream_send_simple_command()
2320 pa_pstream_send_tagstruct(s->context->pstream, t); in stream_send_simple_command()
2321 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in stream_send_simple_command()
2326 pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_flush() argument
2329 pa_assert(s); in pa_stream_flush()
2330 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_flush()
2332 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_flush()
2333 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_flush()
2334 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_flush()
2339 request_auto_timing_update(s, true); in pa_stream_flush()
2341 …if (!(o = stream_send_simple_command(s, (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAN… in pa_stream_flush()
2344 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_flush()
2346 if (s->write_index_corrections[s->current_write_index_correction].valid) in pa_stream_flush()
2347 s->write_index_corrections[s->current_write_index_correction].corrupt = true; in pa_stream_flush()
2349 if (s->buffer_attr.prebuf > 0) in pa_stream_flush()
2350 check_smoother_status(s, false, false, true); in pa_stream_flush()
2354 invalidate_indexes(s, false, true); in pa_stream_flush()
2359 invalidate_indexes(s, true, false); in pa_stream_flush()
2369 pa_operation* pa_stream_prebuf(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_prebuf() argument
2372 pa_assert(s); in pa_stream_prebuf()
2373 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_prebuf()
2375 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_prebuf()
2376 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_prebuf()
2377 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_prebuf()
2378 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); in pa_stream_prebuf()
2383 request_auto_timing_update(s, true); in pa_stream_prebuf()
2385 if (!(o = stream_send_simple_command(s, PA_COMMAND_PREBUF_PLAYBACK_STREAM, cb, userdata))) in pa_stream_prebuf()
2389 * let's request a timing update */ in pa_stream_prebuf()
2390 request_auto_timing_update(s, true); in pa_stream_prebuf()
2395 pa_operation* pa_stream_trigger(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_trigger() argument
2398 pa_assert(s); in pa_stream_trigger()
2399 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_trigger()
2401 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_trigger()
2402 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_trigger()
2403 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_trigger()
2404 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); in pa_stream_trigger()
2409 request_auto_timing_update(s, true); in pa_stream_trigger()
2411 if (!(o = stream_send_simple_command(s, PA_COMMAND_TRIGGER_PLAYBACK_STREAM, cb, userdata))) in pa_stream_trigger()
2415 * let's request a timing update */ in pa_stream_trigger()
2416 request_auto_timing_update(s, true); in pa_stream_trigger()
2421 pa_operation* pa_stream_set_name(pa_stream *s, const char *name, pa_stream_success_cb_t cb, void *u… in pa_stream_set_name() argument
2424 pa_assert(s); in pa_stream_set_name()
2425 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_name()
2428 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_name()
2429 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_set_name()
2430 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_set_name()
2432 if (s->context->version >= 13) { in pa_stream_set_name()
2436 o = pa_stream_proplist_update(s, PA_UPDATE_REPLACE, p, cb, userdata); in pa_stream_set_name()
2442 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_set_name()
2444 s->context, in pa_stream_set_name()
2445 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_SET_RECORD_STREAM_NAME : PA_COMMAND_SET_… in pa_stream_set_name()
2447 pa_tagstruct_putu32(t, s->channel); in pa_stream_set_name()
2449 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_set_name()
2450 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_set_name()
2456 int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) { in pa_stream_get_time() argument
2459 pa_assert(s); in pa_stream_get_time()
2460 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_time()
2462 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_time()
2463 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_time()
2464 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_time()
2465 PA_CHECK_VALIDITY(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_time()
2466 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_PLAYBACK || !s->timing_info.read_index_cor… in pa_stream_get_time()
2467 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_RECORD || !s->timing_info.write_index_corr… in pa_stream_get_time()
2469 if (s->smoother) in pa_stream_get_time()
2470 usec = pa_smoother_get(s->smoother, pa_rtclock_now()); in pa_stream_get_time()
2472 usec = calc_time(s, false); in pa_stream_get_time()
2475 if (!(s->flags & PA_STREAM_NOT_MONOTONIC)) { in pa_stream_get_time()
2476 if (usec < s->previous_time) in pa_stream_get_time()
2477 usec = s->previous_time; in pa_stream_get_time()
2479 s->previous_time = usec; in pa_stream_get_time()
2488 static pa_usec_t time_counter_diff(const pa_stream *s, pa_usec_t a, pa_usec_t b, int *negative) { in time_counter_diff() argument
2489 pa_assert(s); in time_counter_diff()
2490 pa_assert(PA_REFCNT_VALUE(s) >= 1); in time_counter_diff()
2498 if (negative && s->direction == PA_STREAM_RECORD) { in time_counter_diff()
2506 int pa_stream_get_latency(pa_stream *s, pa_usec_t *r_usec, int *negative) { in pa_stream_get_latency() argument
2511 pa_assert(s); in pa_stream_get_latency()
2512 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_latency()
2515 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_latency()
2516 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_latency()
2517 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_latency()
2518 PA_CHECK_VALIDITY(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_latency()
2519 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_PLAYBACK || !s->timing_info.write_index_co… in pa_stream_get_latency()
2520 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_RECORD || !s->timing_info.read_index_corru… in pa_stream_get_latency()
2522 if ((r = pa_stream_get_time(s, &t)) < 0) in pa_stream_get_latency()
2525 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_get_latency()
2526 cindex = s->timing_info.write_index; in pa_stream_get_latency()
2528 cindex = s->timing_info.read_index; in pa_stream_get_latency()
2533 c = pa_bytes_to_usec((uint64_t) cindex, &s->sample_spec); in pa_stream_get_latency()
2535 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_get_latency()
2536 *r_usec = time_counter_diff(s, c, t, negative); in pa_stream_get_latency()
2538 *r_usec = time_counter_diff(s, t, c, negative); in pa_stream_get_latency()
2543 const pa_timing_info* pa_stream_get_timing_info(pa_stream *s) { in pa_stream_get_timing_info() argument
2544 pa_assert(s); in pa_stream_get_timing_info()
2545 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_timing_info()
2547 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_timing_info()
2548 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_timing_info()
2549 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_timing_info()
2550 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_timing_info()
2552 return &s->timing_info; in pa_stream_get_timing_info()
2555 const pa_sample_spec* pa_stream_get_sample_spec(pa_stream *s) { in pa_stream_get_sample_spec() argument
2556 pa_assert(s); in pa_stream_get_sample_spec()
2557 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_sample_spec()
2559 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_sample_spec()
2561 return &s->sample_spec; in pa_stream_get_sample_spec()
2564 const pa_channel_map* pa_stream_get_channel_map(pa_stream *s) { in pa_stream_get_channel_map() argument
2565 pa_assert(s); in pa_stream_get_channel_map()
2566 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_channel_map()
2568 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_channel_map()
2570 return &s->channel_map; in pa_stream_get_channel_map()
2573 const pa_format_info* pa_stream_get_format_info(const pa_stream *s) { in pa_stream_get_format_info() argument
2574 pa_assert(s); in pa_stream_get_format_info()
2575 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_format_info()
2578 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_format_info()
2579 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_format_info()
2581 return s->format; in pa_stream_get_format_info()
2583 const pa_buffer_attr* pa_stream_get_buffer_attr(pa_stream *s) { in pa_stream_get_buffer_attr() argument
2584 pa_assert(s); in pa_stream_get_buffer_attr()
2585 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_buffer_attr()
2587 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_buffer_attr()
2588 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_buffer_attr()
2589 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 9, PA_ERR_NOTSUPPORTED); in pa_stream_get_buffer_attr()
2591 return &s->buffer_attr; in pa_stream_get_buffer_attr()
2657 pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr, pa_stream_success… in pa_stream_set_buffer_attr() argument
2663 pa_assert(s); in pa_stream_set_buffer_attr()
2664 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_buffer_attr()
2667 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_buffer_attr()
2668 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_set_buffer_attr()
2669 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_set_buffer_attr()
2670 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_set_buffer_attr()
2675 request_auto_timing_update(s, true); in pa_stream_set_buffer_attr()
2677 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_set_buffer_attr()
2680 s->context, in pa_stream_set_buffer_attr()
2681 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_SET_RECORD_STREAM_BUFFER_ATTR : PA_COMMA… in pa_stream_set_buffer_attr()
2683 pa_tagstruct_putu32(t, s->channel); in pa_stream_set_buffer_attr()
2686 patch_buffer_attr(s, ©, NULL); in pa_stream_set_buffer_attr()
2691 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_set_buffer_attr()
2701 if (s->context->version >= 13) in pa_stream_set_buffer_attr()
2702 pa_tagstruct_put_boolean(t, !!(s->flags & PA_STREAM_ADJUST_LATENCY)); in pa_stream_set_buffer_attr()
2704 if (s->context->version >= 14) in pa_stream_set_buffer_attr()
2705 pa_tagstruct_put_boolean(t, !!(s->flags & PA_STREAM_EARLY_REQUESTS)); in pa_stream_set_buffer_attr()
2707 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_set_buffer_attr()
2708 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_set_buffer_attr_ca… in pa_stream_set_buffer_attr()
2710 /* This might cause changes in the read/write index, hence let's in pa_stream_set_buffer_attr()
2712 request_auto_timing_update(s, true); in pa_stream_set_buffer_attr()
2717 uint32_t pa_stream_get_device_index(const pa_stream *s) { in pa_stream_get_device_index() argument
2718 pa_assert(s); in pa_stream_get_device_index()
2719 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_device_index()
2721 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_device_index()
2722 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, PA_INVALID_… in pa_stream_get_device_index()
2723 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE, PA_INV… in pa_stream_get_device_index()
2724 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED, PA_INVALI… in pa_stream_get_device_index()
2725 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->device_index != PA_INVALID_INDEX, PA_ERR_BADSTATE, PA_… in pa_stream_get_device_index()
2727 return s->device_index; in pa_stream_get_device_index()
2730 const char *pa_stream_get_device_name(const pa_stream *s) { in pa_stream_get_device_name() argument
2731 pa_assert(s); in pa_stream_get_device_name()
2732 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_device_name()
2734 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_device_name()
2735 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2736 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2737 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_get_device_name()
2738 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->device_name, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2740 return s->device_name; in pa_stream_get_device_name()
2743 int pa_stream_is_suspended(const pa_stream *s) { in pa_stream_is_suspended() argument
2744 pa_assert(s); in pa_stream_is_suspended()
2745 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_is_suspended()
2747 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_is_suspended()
2748 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_is_suspended()
2749 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_is_suspended()
2750 PA_CHECK_VALIDITY(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_is_suspended()
2752 return s->suspended; in pa_stream_is_suspended()
2755 int pa_stream_is_corked(const pa_stream *s) { in pa_stream_is_corked() argument
2756 pa_assert(s); in pa_stream_is_corked()
2757 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_is_corked()
2759 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_is_corked()
2760 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_is_corked()
2761 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_is_corked()
2763 return s->corked; in pa_stream_is_corked()
2803 pa_operation *pa_stream_update_sample_rate(pa_stream *s, uint32_t rate, pa_stream_success_cb_t cb, … in pa_stream_update_sample_rate() argument
2808 pa_assert(s); in pa_stream_update_sample_rate()
2809 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_update_sample_rate()
2811 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_update_sample_rate()
2812 PA_CHECK_VALIDITY_RETURN_NULL(s->context, pa_sample_rate_valid(rate), PA_ERR_INVALID); in pa_stream_update_sample_rate()
2813 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2814 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2815 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->flags & PA_STREAM_VARIABLE_RATE, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2816 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_update_sample_rate()
2818 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_update_sample_rate()
2822 s->context, in pa_stream_update_sample_rate()
2823 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_UPDATE_RECORD_STREAM_SAMPLE_RATE : PA_CO… in pa_stream_update_sample_rate()
2825 pa_tagstruct_putu32(t, s->channel); in pa_stream_update_sample_rate()
2828 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_update_sample_rate()
2829 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_update_sample_rate… in pa_stream_update_sample_rate()
2834 pa_operation *pa_stream_proplist_update(pa_stream *s, pa_update_mode_t mode, pa_proplist *p, pa_str… in pa_stream_proplist_update() argument
2839 pa_assert(s); in pa_stream_proplist_update()
2840 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_proplist_update()
2842 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_proplist_update()
2843 …PA_CHECK_VALIDITY_RETURN_NULL(s->context, mode == PA_UPDATE_SET || mode == PA_UPDATE_MERGE || mode… in pa_stream_proplist_update()
2844 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_proplist_update()
2845 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_proplist_update()
2846 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_proplist_update()
2848 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_proplist_update()
2851 s->context, in pa_stream_proplist_update()
2852 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_UPDATE_RECORD_STREAM_PROPLIST : PA_COMMA… in pa_stream_proplist_update()
2854 pa_tagstruct_putu32(t, s->channel); in pa_stream_proplist_update()
2858 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_proplist_update()
2859 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_proplist_update()
2861 /* Please note that we don't update s->proplist here, because we in pa_stream_proplist_update()
2867 pa_operation *pa_stream_proplist_remove(pa_stream *s, const char *const keys[], pa_stream_success_c… in pa_stream_proplist_remove() argument
2873 pa_assert(s); in pa_stream_proplist_remove()
2874 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_proplist_remove()
2876 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_proplist_remove()
2877 PA_CHECK_VALIDITY_RETURN_NULL(s->context, keys && keys[0], PA_ERR_INVALID); in pa_stream_proplist_remove()
2878 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_proplist_remove()
2879 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_proplist_remove()
2880 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_proplist_remove()
2882 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_proplist_remove()
2885 s->context, in pa_stream_proplist_remove()
2886 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_REMOVE_RECORD_STREAM_PROPLIST : PA_COMMA… in pa_stream_proplist_remove()
2888 pa_tagstruct_putu32(t, s->channel); in pa_stream_proplist_remove()
2895 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_proplist_remove()
2896 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_proplist_remove()
2898 /* Please note that we don't update s->proplist here, because we in pa_stream_proplist_remove()
2904 int pa_stream_set_monitor_stream(pa_stream *s, uint32_t sink_input_idx) { in pa_stream_set_monitor_stream() argument
2905 pa_assert(s); in pa_stream_set_monitor_stream()
2906 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_monitor_stream()
2908 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_monitor_stream()
2909 PA_CHECK_VALIDITY(s->context, sink_input_idx != PA_INVALID_INDEX, PA_ERR_INVALID); in pa_stream_set_monitor_stream()
2910 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE); in pa_stream_set_monitor_stream()
2911 PA_CHECK_VALIDITY(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_set_monitor_stream()
2913 s->direct_on_input = sink_input_idx; in pa_stream_set_monitor_stream()
2918 uint32_t pa_stream_get_monitor_stream(const pa_stream *s) { in pa_stream_get_monitor_stream() argument
2919 pa_assert(s); in pa_stream_get_monitor_stream()
2920 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_monitor_stream()
2922 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_monitor_stream()
2923 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direct_on_input != PA_INVALID_INDEX, PA_ERR_BADSTATE, … in pa_stream_get_monitor_stream()
2924 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED, PA_INVALI… in pa_stream_get_monitor_stream()
2926 return s->direct_on_input; in pa_stream_get_monitor_stream()