• Home
  • Raw
  • Download

Lines Matching full:s

61 static void reset_callbacks(pa_stream *s) {  in reset_callbacks()  argument
62 s->read_callback = NULL; in reset_callbacks()
63 s->read_userdata = NULL; in reset_callbacks()
64 s->write_callback = NULL; in reset_callbacks()
65 s->write_userdata = NULL; in reset_callbacks()
66 s->state_callback = NULL; in reset_callbacks()
67 s->state_userdata = NULL; in reset_callbacks()
68 s->overflow_callback = NULL; in reset_callbacks()
69 s->overflow_userdata = NULL; in reset_callbacks()
70 s->underflow_callback = NULL; in reset_callbacks()
71 s->underflow_userdata = NULL; in reset_callbacks()
72 s->latency_update_callback = NULL; in reset_callbacks()
73 s->latency_update_userdata = NULL; in reset_callbacks()
74 s->moved_callback = NULL; in reset_callbacks()
75 s->moved_userdata = NULL; in reset_callbacks()
76 s->suspended_callback = NULL; in reset_callbacks()
77 s->suspended_userdata = NULL; in reset_callbacks()
78 s->started_callback = NULL; in reset_callbacks()
79 s->started_userdata = NULL; in reset_callbacks()
80 s->event_callback = NULL; in reset_callbacks()
81 s->event_userdata = NULL; in reset_callbacks()
82 s->buffer_attr_callback = NULL; in reset_callbacks()
83 s->buffer_attr_userdata = NULL; in reset_callbacks()
84 s->underflow_ohos_callback = NULL; in reset_callbacks()
85 s->underflow_ohos_userdata = NULL; in reset_callbacks()
97 pa_stream *s; in pa_stream_new_with_proplist_internal() local
108 s = pa_xnew(pa_stream, 1); in pa_stream_new_with_proplist_internal()
109 PA_REFCNT_INIT(s); in pa_stream_new_with_proplist_internal()
110 s->context = c; in pa_stream_new_with_proplist_internal()
111 s->mainloop = c->mainloop; in pa_stream_new_with_proplist_internal()
113 s->direction = PA_STREAM_NODIRECTION; in pa_stream_new_with_proplist_internal()
114 s->state = PA_STREAM_UNCONNECTED; in pa_stream_new_with_proplist_internal()
115 s->flags = 0; in pa_stream_new_with_proplist_internal()
118 s->sample_spec = *ss; in pa_stream_new_with_proplist_internal()
120 pa_sample_spec_init(&s->sample_spec); in pa_stream_new_with_proplist_internal()
123 s->channel_map = *map; in pa_stream_new_with_proplist_internal()
125 pa_channel_map_init(&s->channel_map); in pa_stream_new_with_proplist_internal()
127 s->n_formats = 0; in pa_stream_new_with_proplist_internal()
129 s->n_formats = n_formats; in pa_stream_new_with_proplist_internal()
131 s->req_formats[i] = pa_format_info_copy(formats[i]); in pa_stream_new_with_proplist_internal()
135 s->format = NULL; in pa_stream_new_with_proplist_internal()
137 s->direct_on_input = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
139 s->proplist = p ? pa_proplist_copy(p) : pa_proplist_new(); in pa_stream_new_with_proplist_internal()
141 pa_proplist_sets(s->proplist, PA_PROP_MEDIA_NAME, name); in pa_stream_new_with_proplist_internal()
143 s->channel = 0; in pa_stream_new_with_proplist_internal()
144 s->channel_valid = false; in pa_stream_new_with_proplist_internal()
145 s->syncid = c->csyncid++; in pa_stream_new_with_proplist_internal()
146 s->stream_index = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
148 s->requested_bytes = 0; in pa_stream_new_with_proplist_internal()
149 memset(&s->buffer_attr, 0, sizeof(s->buffer_attr)); in pa_stream_new_with_proplist_internal()
155 s->buffer_attr.maxlength = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
157s->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()
166s->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()
168 s->buffer_attr.minreq = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
169 s->buffer_attr.prebuf = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
170 s->buffer_attr.fragsize = (uint32_t) -1; in pa_stream_new_with_proplist_internal()
172 s->device_index = PA_INVALID_INDEX; in pa_stream_new_with_proplist_internal()
173 s->device_name = NULL; in pa_stream_new_with_proplist_internal()
174 s->suspended = false; in pa_stream_new_with_proplist_internal()
175 s->corked = false; in pa_stream_new_with_proplist_internal()
177 s->write_memblock = NULL; in pa_stream_new_with_proplist_internal()
178 s->write_data = NULL; in pa_stream_new_with_proplist_internal()
180 pa_memchunk_reset(&s->peek_memchunk); in pa_stream_new_with_proplist_internal()
181 s->peek_data = NULL; in pa_stream_new_with_proplist_internal()
182 s->record_memblockq = NULL; in pa_stream_new_with_proplist_internal()
184 memset(&s->timing_info, 0, sizeof(s->timing_info)); in pa_stream_new_with_proplist_internal()
185 s->timing_info_valid = false; in pa_stream_new_with_proplist_internal()
187 s->previous_time = 0; in pa_stream_new_with_proplist_internal()
188 s->latest_underrun_at_index = -1; in pa_stream_new_with_proplist_internal()
190 s->read_index_not_before = 0; in pa_stream_new_with_proplist_internal()
191 s->write_index_not_before = 0; in pa_stream_new_with_proplist_internal()
193 s->write_index_corrections[i].valid = 0; in pa_stream_new_with_proplist_internal()
194 s->current_write_index_correction = 0; in pa_stream_new_with_proplist_internal()
196 s->auto_timing_update_event = NULL; in pa_stream_new_with_proplist_internal()
197 s->auto_timing_update_requested = false; in pa_stream_new_with_proplist_internal()
198 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_stream_new_with_proplist_internal()
200 reset_callbacks(s); in pa_stream_new_with_proplist_internal()
202 s->smoother = NULL; in pa_stream_new_with_proplist_internal()
205 PA_LLIST_PREPEND(pa_stream, c->streams, s); in pa_stream_new_with_proplist_internal()
206 pa_stream_ref(s); in pa_stream_new_with_proplist_internal()
208 return s; in pa_stream_new_with_proplist_internal()
244 static void stream_unlink(pa_stream *s) { in stream_unlink() argument
246 pa_assert(s); in stream_unlink()
248 if (!s->context) in stream_unlink()
254 for (o = s->context->operations; o; o = n) { in stream_unlink()
257 if (o->stream == s) in stream_unlink()
262 if (s->context->pdispatch) in stream_unlink()
263 pa_pdispatch_unregister_reply(s->context->pdispatch, s); in stream_unlink()
265 if (s->channel_valid) { in stream_unlink()
266 …pa_hashmap_remove((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->pl… in stream_unlink()
267 s->channel = 0; in stream_unlink()
268 s->channel_valid = false; in stream_unlink()
271 PA_LLIST_REMOVE(pa_stream, s->context->streams, s); in stream_unlink()
272 pa_stream_unref(s); in stream_unlink()
274 s->context = NULL; in stream_unlink()
276 if (s->auto_timing_update_event) { in stream_unlink()
277 pa_assert(s->mainloop); in stream_unlink()
278 s->mainloop->time_free(s->auto_timing_update_event); in stream_unlink()
281 reset_callbacks(s); in stream_unlink()
284 static void stream_free(pa_stream *s) { in stream_free() argument
287 pa_assert(s); in stream_free()
289 stream_unlink(s); in stream_free()
291 if (s->write_memblock) { in stream_free()
292 if (s->write_data) in stream_free()
293 pa_memblock_release(s->write_memblock); in stream_free()
294 pa_memblock_unref(s->write_memblock); in stream_free()
297 if (s->peek_memchunk.memblock) { in stream_free()
298 if (s->peek_data) in stream_free()
299 pa_memblock_release(s->peek_memchunk.memblock); in stream_free()
300 pa_memblock_unref(s->peek_memchunk.memblock); in stream_free()
303 if (s->record_memblockq) in stream_free()
304 pa_memblockq_free(s->record_memblockq); in stream_free()
306 if (s->proplist) in stream_free()
307 pa_proplist_free(s->proplist); in stream_free()
309 if (s->smoother) in stream_free()
311 pa_smoother_2_free(s->smoother); in stream_free()
313 pa_smoother_free(s->smoother); in stream_free()
316 for (i = 0; i < s->n_formats; i++) in stream_free()
317 pa_format_info_free(s->req_formats[i]); in stream_free()
319 if (s->format) in stream_free()
320 pa_format_info_free(s->format); in stream_free()
322 pa_xfree(s->device_name); in stream_free()
323 pa_xfree(s); in stream_free()
326 void pa_stream_unref(pa_stream *s) { in pa_stream_unref() argument
327 pa_assert(s); in pa_stream_unref()
328 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_unref()
330 if (PA_REFCNT_DEC(s) <= 0) in pa_stream_unref()
331 stream_free(s); in pa_stream_unref()
334 pa_stream* pa_stream_ref(pa_stream *s) { in pa_stream_ref() argument
335 pa_assert(s); in pa_stream_ref()
336 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_ref()
338 PA_REFCNT_INC(s); in pa_stream_ref()
339 return s; in pa_stream_ref()
342 pa_stream_state_t pa_stream_get_state(const pa_stream *s) { in pa_stream_get_state() argument
343 pa_assert(s); in pa_stream_get_state()
344 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_state()
346 return s->state; in pa_stream_get_state()
349 void pa_stream_terminate(pa_stream *s) { in pa_stream_terminate() argument
350 pa_stream_set_state(s, PA_STREAM_TERMINATED); in pa_stream_terminate()
353 pa_context* pa_stream_get_context(const pa_stream *s) { in pa_stream_get_context() argument
354 pa_assert(s); in pa_stream_get_context()
355 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_context()
357 return s->context; in pa_stream_get_context()
360 uint32_t pa_stream_get_index(const pa_stream *s) { in pa_stream_get_index() argument
361 pa_assert(s); in pa_stream_get_index()
362 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_index()
364 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_index()
365 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, PA_INVALID_… in pa_stream_get_index()
367 return s->stream_index; in pa_stream_get_index()
370 void pa_stream_set_state(pa_stream *s, pa_stream_state_t st) { in pa_stream_set_state() argument
371 pa_assert(s); in pa_stream_set_state()
372 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_state()
374 if (s->state == st) in pa_stream_set_state()
377 pa_stream_ref(s); in pa_stream_set_state()
379 s->state = st; in pa_stream_set_state()
381 if (s->state_callback) in pa_stream_set_state()
382 s->state_callback(s, s->state_userdata); in pa_stream_set_state()
385 stream_unlink(s); in pa_stream_set_state()
387 pa_stream_unref(s); in pa_stream_set_state()
390 static void request_auto_timing_update(pa_stream *s, bool force) { in request_auto_timing_update() argument
391 pa_assert(s); in request_auto_timing_update()
392 pa_assert(PA_REFCNT_VALUE(s) >= 1); in request_auto_timing_update()
394 if (!(s->flags & PA_STREAM_AUTO_TIMING_UPDATE)) in request_auto_timing_update()
397 if (s->state == PA_STREAM_READY && in request_auto_timing_update()
398 (force || !s->auto_timing_update_requested)) { in request_auto_timing_update()
405 if ((o = pa_stream_update_timing_info(s, NULL, NULL))) { in request_auto_timing_update()
407 s->auto_timing_update_requested = true; in request_auto_timing_update()
411 if (s->auto_timing_update_event) { in request_auto_timing_update()
412 if (s->suspended && !force) { in request_auto_timing_update()
413 pa_assert(s->mainloop); in request_auto_timing_update()
414 s->mainloop->time_free(s->auto_timing_update_event); in request_auto_timing_update()
415 s->auto_timing_update_event = NULL; in request_auto_timing_update()
418 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in request_auto_timing_update()
420 …pa_context_rttime_restart(s->context, s->auto_timing_update_event, pa_rtclock_now() + s->auto_timi… in request_auto_timing_update()
422s->auto_timing_interval_usec = PA_MIN(AUTO_TIMING_INTERVAL_END_USEC, s->auto_timing_interval_usec*… in request_auto_timing_update()
429 pa_stream *s; in pa_command_stream_killed() local
446 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->r… in pa_command_stream_killed()
449 if (s->state != PA_STREAM_READY) in pa_command_stream_killed()
453 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_command_stream_killed()
459 static void check_smoother_status(pa_stream *s, bool aposteriori, bool force_start, bool force_stop… in check_smoother_status() argument
462 pa_assert(s); in check_smoother_status()
465 if (!s->smoother) in check_smoother_status()
470 if (s->timing_info_valid) { in check_smoother_status()
472 x -= s->timing_info.transport_usec; in check_smoother_status()
474 x += s->timing_info.transport_usec; in check_smoother_status()
477 if (s->suspended || s->corked || force_stop) in check_smoother_status()
479 pa_smoother_2_pause(s->smoother, x); in check_smoother_status()
481 pa_smoother_pause(s->smoother, x); in check_smoother_status()
483 else if (force_start || s->buffer_attr.prebuf == 0) { in check_smoother_status()
485 if (!s->timing_info_valid && in check_smoother_status()
489 s->context->version >= 13) { in check_smoother_status()
502 pa_smoother_2_resume(s->smoother, x); in check_smoother_status()
504 pa_smoother_resume(s->smoother, x, true); in check_smoother_status()
516 pa_stream *s; in pa_command_stream_moved() local
576 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->re… in pa_command_stream_moved()
579 if (s->state != PA_STREAM_READY) in pa_command_stream_moved()
583 if (s->direction == PA_STREAM_RECORD) in pa_command_stream_moved()
584 s->timing_info.configured_source_usec = usec; in pa_command_stream_moved()
586 s->timing_info.configured_sink_usec = usec; in pa_command_stream_moved()
588 s->buffer_attr.maxlength = maxlength; in pa_command_stream_moved()
589 s->buffer_attr.fragsize = fragsize; in pa_command_stream_moved()
590 s->buffer_attr.tlength = tlength; in pa_command_stream_moved()
591 s->buffer_attr.prebuf = prebuf; in pa_command_stream_moved()
592 s->buffer_attr.minreq = minreq; in pa_command_stream_moved()
595 pa_xfree(s->device_name); in pa_command_stream_moved()
596 s->device_name = pa_xstrdup(dn); in pa_command_stream_moved()
597 s->device_index = di; in pa_command_stream_moved()
599 s->suspended = suspended; in pa_command_stream_moved()
601 if ((s->flags & PA_STREAM_AUTO_TIMING_UPDATE) && !suspended && !s->auto_timing_update_event) { in pa_command_stream_moved()
602 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_command_stream_moved()
603s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in pa_command_stream_moved()
604 request_auto_timing_update(s, true); in pa_command_stream_moved()
607 check_smoother_status(s, true, false, false); in pa_command_stream_moved()
608 request_auto_timing_update(s, true); in pa_command_stream_moved()
610 if (s->moved_callback) in pa_command_stream_moved()
611 s->moved_callback(s, s->moved_userdata); in pa_command_stream_moved()
619 pa_stream *s; in pa_command_stream_buffer_attr() local
665 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams … in pa_command_stream_buffer_attr()
668 if (s->state != PA_STREAM_READY) in pa_command_stream_buffer_attr()
671 if (s->direction == PA_STREAM_RECORD) in pa_command_stream_buffer_attr()
672 s->timing_info.configured_source_usec = usec; in pa_command_stream_buffer_attr()
674 s->timing_info.configured_sink_usec = usec; in pa_command_stream_buffer_attr()
676 s->buffer_attr.maxlength = maxlength; in pa_command_stream_buffer_attr()
677 s->buffer_attr.fragsize = fragsize; in pa_command_stream_buffer_attr()
678 s->buffer_attr.tlength = tlength; in pa_command_stream_buffer_attr()
679 s->buffer_attr.prebuf = prebuf; in pa_command_stream_buffer_attr()
680 s->buffer_attr.minreq = minreq; in pa_command_stream_buffer_attr()
682 request_auto_timing_update(s, true); in pa_command_stream_buffer_attr()
684 if (s->buffer_attr_callback) in pa_command_stream_buffer_attr()
685 s->buffer_attr_callback(s, s->buffer_attr_userdata); in pa_command_stream_buffer_attr()
693 pa_stream *s; in pa_command_stream_suspended() local
717 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c… in pa_command_stream_suspended()
720 if (s->state != PA_STREAM_READY) in pa_command_stream_suspended()
723 s->suspended = suspended; in pa_command_stream_suspended()
725 if ((s->flags & PA_STREAM_AUTO_TIMING_UPDATE) && !suspended && !s->auto_timing_update_event) { in pa_command_stream_suspended()
726 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in pa_command_stream_suspended()
727s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in pa_command_stream_suspended()
728 request_auto_timing_update(s, true); in pa_command_stream_suspended()
731 check_smoother_status(s, true, false, false); in pa_command_stream_suspended()
732 request_auto_timing_update(s, true); in pa_command_stream_suspended()
734 if (s->suspended_callback) in pa_command_stream_suspended()
735 s->suspended_callback(s, s->suspended_userdata); in pa_command_stream_suspended()
743 pa_stream *s; in pa_command_stream_started() local
765 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_stream_started()
768 if (s->state != PA_STREAM_READY) in pa_command_stream_started()
771 check_smoother_status(s, true, true, false); in pa_command_stream_started()
772 request_auto_timing_update(s, true); in pa_command_stream_started()
774 if (s->started_callback) in pa_command_stream_started()
775 s->started_callback(s, s->started_userdata); in pa_command_stream_started()
783 pa_stream *s; in pa_command_stream_event() local
811 …if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->re… in pa_command_stream_event()
814 if (s->state != PA_STREAM_READY) in pa_command_stream_event()
820 if (pa_stream_get_time(s, &stream_time) == 0) in pa_command_stream_event()
824 if (s->event_callback) in pa_command_stream_event()
825 s->event_callback(s, event, pl, s->event_userdata); in pa_command_stream_event()
835 pa_stream *s; in pa_command_request() local
854 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_request()
857 if (s->state != PA_STREAM_READY) in pa_command_request()
860 s->requested_bytes += bytes; in pa_command_request()
863 …pa_log_debug("got request for %lli, now at %lli", (long long) bytes, (long long) s->requested_byte… in pa_command_request()
866 if (s->requested_bytes > 0 && s->write_callback) in pa_command_request()
867 s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata); in pa_command_request()
879 pa_stream *s; in pa_command_overflow_or_underflow() local
910 if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel)))) in pa_command_overflow_or_underflow()
913 if (s->state != PA_STREAM_READY) in pa_command_overflow_or_underflow()
917 if (s->underflow_ohos_callback) { in pa_command_overflow_or_underflow()
918 s->underflow_ohos_callback(s, s->underflow_ohos_userdata); in pa_command_overflow_or_underflow()
924 s->latest_underrun_at_index = offset; in pa_command_overflow_or_underflow()
926 if (s->buffer_attr.prebuf > 0) in pa_command_overflow_or_underflow()
927 check_smoother_status(s, true, false, true); in pa_command_overflow_or_underflow()
929 request_auto_timing_update(s, true); in pa_command_overflow_or_underflow()
932 if (s->overflow_callback) in pa_command_overflow_or_underflow()
933 s->overflow_callback(s, s->overflow_userdata); in pa_command_overflow_or_underflow()
935 if (s->underflow_callback) in pa_command_overflow_or_underflow()
936 s->underflow_callback(s, s->underflow_userdata); in pa_command_overflow_or_underflow()
943 static void invalidate_indexes(pa_stream *s, bool r, bool w) { in invalidate_indexes() argument
944 pa_assert(s); in invalidate_indexes()
945 pa_assert(PA_REFCNT_VALUE(s) >= 1); in invalidate_indexes()
948 pa_log_debug("invalidate r:%u w:%u tag:%u", r, w, s->context->ctag); in invalidate_indexes()
951 if (s->state != PA_STREAM_READY) in invalidate_indexes()
955 s->write_index_not_before = s->context->ctag; in invalidate_indexes()
957 if (s->timing_info_valid) in invalidate_indexes()
958 s->timing_info.write_index_corrupt = true; in invalidate_indexes()
966 s->read_index_not_before = s->context->ctag; in invalidate_indexes()
968 if (s->timing_info_valid) in invalidate_indexes()
969 s->timing_info.read_index_corrupt = true; in invalidate_indexes()
976 request_auto_timing_update(s, true); in invalidate_indexes()
980 pa_stream *s = userdata; in auto_timing_update_callback() local
982 pa_assert(s); in auto_timing_update_callback()
983 pa_assert(PA_REFCNT_VALUE(s) >= 1); in auto_timing_update_callback()
985 pa_stream_ref(s); in auto_timing_update_callback()
986 request_auto_timing_update(s, false); in auto_timing_update_callback()
987 pa_stream_unref(s); in auto_timing_update_callback()
990 static void create_stream_complete(pa_stream *s) { in create_stream_complete() argument
991 pa_assert(s); in create_stream_complete()
992 pa_assert(PA_REFCNT_VALUE(s) >= 1); in create_stream_complete()
993 pa_assert(s->state == PA_STREAM_CREATING); in create_stream_complete()
995 pa_stream_set_state(s, PA_STREAM_READY); in create_stream_complete()
997 if (s->requested_bytes > 0 && s->write_callback) in create_stream_complete()
998 s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata); in create_stream_complete()
1000 if (s->flags & PA_STREAM_AUTO_TIMING_UPDATE) { in create_stream_complete()
1001 s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC; in create_stream_complete()
1002 pa_assert(!s->auto_timing_update_event); in create_stream_complete()
1003s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_… in create_stream_complete()
1005 request_auto_timing_update(s, true); in create_stream_complete()
1008 check_smoother_status(s, true, false, false); in create_stream_complete()
1011 static void patch_buffer_attr(pa_stream *s, pa_buffer_attr *attr, pa_stream_flags_t *flags) { in patch_buffer_attr() argument
1014 pa_assert(s); in patch_buffer_attr()
1023 if (pa_sample_spec_valid(&s->sample_spec)) in patch_buffer_attr()
1024 ss = s->sample_spec; in patch_buffer_attr()
1025 else if (s->n_formats == 1) in patch_buffer_attr()
1026 pa_format_info_to_sample_spec(s->req_formats[0], &ss, NULL); in patch_buffer_attr()
1029 pa_log_debug("Failed to parse $PULSE_LATENCY_MSEC: %s", e); in patch_buffer_attr()
1030 else if (!pa_sample_spec_valid(&s->sample_spec)) in patch_buffer_attr()
1031 pa_log_debug("Ignoring $PULSE_LATENCY_MSEC: %s (invalid sample spec)", e); in patch_buffer_attr()
1044 if (s->context->version >= 13) in patch_buffer_attr()
1057 …attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, &s->sample_spec); /* 250ms of bu… in patch_buffer_attr()
1070 pa_stream *s = userdata; in pa_create_stream_callback() local
1074 pa_assert(s); in pa_create_stream_callback()
1075 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_create_stream_callback()
1076 pa_assert(s->state == PA_STREAM_CREATING); in pa_create_stream_callback()
1078 pa_stream_ref(s); in pa_create_stream_callback()
1081 if (pa_context_handle_error(s->context, command, t, false) < 0) in pa_create_stream_callback()
1084 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_create_stream_callback()
1088 if (pa_tagstruct_getu32(t, &s->channel) < 0 || in pa_create_stream_callback()
1089 s->channel == PA_INVALID_INDEX || in pa_create_stream_callback()
1090 …((s->direction != PA_STREAM_UPLOAD) && (pa_tagstruct_getu32(t, &s->stream_index) < 0 || s->stream_… in pa_create_stream_callback()
1091 ((s->direction != PA_STREAM_RECORD) && pa_tagstruct_getu32(t, &requested_bytes) < 0)) { in pa_create_stream_callback()
1092 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1096 s->requested_bytes = (int64_t) requested_bytes; in pa_create_stream_callback()
1098 if (s->context->version >= 9) { in pa_create_stream_callback()
1099 if (s->direction == PA_STREAM_PLAYBACK) { in pa_create_stream_callback()
1100 if (pa_tagstruct_getu32(t, &s->buffer_attr.maxlength) < 0 || in pa_create_stream_callback()
1101 pa_tagstruct_getu32(t, &s->buffer_attr.tlength) < 0 || in pa_create_stream_callback()
1102 pa_tagstruct_getu32(t, &s->buffer_attr.prebuf) < 0 || in pa_create_stream_callback()
1103 pa_tagstruct_getu32(t, &s->buffer_attr.minreq) < 0) { in pa_create_stream_callback()
1104 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1107 } else if (s->direction == PA_STREAM_RECORD) { in pa_create_stream_callback()
1108 if (pa_tagstruct_getu32(t, &s->buffer_attr.maxlength) < 0 || in pa_create_stream_callback()
1109 pa_tagstruct_getu32(t, &s->buffer_attr.fragsize) < 0) { in pa_create_stream_callback()
1110 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1116 if (s->context->version >= 12 && s->direction != PA_STREAM_UPLOAD) { in pa_create_stream_callback()
1124 pa_tagstruct_getu32(t, &s->device_index) < 0 || in pa_create_stream_callback()
1127 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1131 if (!dn || s->device_index == PA_INVALID_INDEX || in pa_create_stream_callback()
1135 (s->n_formats == 0 && ( in pa_create_stream_callback()
1136 (!(s->flags & PA_STREAM_FIX_FORMAT) && ss.format != s->sample_spec.format) || in pa_create_stream_callback()
1137 (!(s->flags & PA_STREAM_FIX_RATE) && ss.rate != s->sample_spec.rate) || in pa_create_stream_callback()
1138 … (!(s->flags & PA_STREAM_FIX_CHANNELS) && !pa_channel_map_equal(&cm, &s->channel_map))))) { in pa_create_stream_callback()
1139 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1143 pa_xfree(s->device_name); in pa_create_stream_callback()
1144 s->device_name = pa_xstrdup(dn); in pa_create_stream_callback()
1145 s->suspended = suspended; in pa_create_stream_callback()
1147 s->channel_map = cm; in pa_create_stream_callback()
1148 s->sample_spec = ss; in pa_create_stream_callback()
1152 if (s->flags & PA_STREAM_INTERPOLATE_TIMING) in pa_create_stream_callback()
1153 pa_smoother_2_set_sample_spec(s->smoother, pa_rtclock_now(), &s->sample_spec); in pa_create_stream_callback()
1156 if (s->context->version >= 13 && s->direction != PA_STREAM_UPLOAD) { in pa_create_stream_callback()
1160 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1164 if (s->direction == PA_STREAM_RECORD) in pa_create_stream_callback()
1165 s->timing_info.configured_source_usec = usec; in pa_create_stream_callback()
1167 s->timing_info.configured_sink_usec = usec; in pa_create_stream_callback()
1170 if ((s->context->version >= 21 && s->direction == PA_STREAM_PLAYBACK) in pa_create_stream_callback()
1171 || s->context->version >= 22) { in pa_create_stream_callback()
1177 if (s->n_formats > 0) { in pa_create_stream_callback()
1179 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1183 s->format = f; in pa_create_stream_callback()
1187 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_create_stream_callback()
1191 if (s->direction == PA_STREAM_RECORD) { in pa_create_stream_callback()
1192 pa_assert(!s->record_memblockq); in pa_create_stream_callback()
1194 s->record_memblockq = pa_memblockq_new( in pa_create_stream_callback()
1197 s->buffer_attr.maxlength, in pa_create_stream_callback()
1199 &s->sample_spec, in pa_create_stream_callback()
1206 s->channel_valid = true; in pa_create_stream_callback()
1207 …hashmap_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback… in pa_create_stream_callback()
1209 create_stream_complete(s); in pa_create_stream_callback()
1212 pa_stream_unref(s); in pa_create_stream_callback()
1217 pa_stream *s, in create_stream() argument
1230 pa_assert(s); in create_stream()
1231 pa_assert(PA_REFCNT_VALUE(s) >= 1); in create_stream()
1234 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in create_stream()
1235 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE); in create_stream()
1236 …PA_CHECK_VALIDITY(s->context, s->direct_on_input == PA_INVALID_INDEX || direction == PA_STREAM_REC… in create_stream()
1237 PA_CHECK_VALIDITY(s->context, !(flags & ~(PA_STREAM_START_CORKED| in create_stream()
1258 …PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_… in create_stream()
1259 …PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ER… in create_stream()
1260 PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); in create_stream()
1266 …PA_CHECK_VALIDITY(s->context, direction == PA_STREAM_RECORD || !(flags & (PA_STREAM_PEAK_DETECT)),… in create_stream()
1267 …PA_CHECK_VALIDITY(s->context, !sync_stream || (direction == PA_STREAM_PLAYBACK && sync_stream->dir… in create_stream()
1268 …PA_CHECK_VALIDITY(s->context, (flags & (PA_STREAM_ADJUST_LATENCY|PA_STREAM_EARLY_REQUESTS)) != (PA… in create_stream()
1270 pa_stream_ref(s); in create_stream()
1272 s->direction = direction; in create_stream()
1275 s->syncid = sync_stream->syncid; in create_stream()
1278 s->buffer_attr = *attr; in create_stream()
1279 patch_buffer_attr(s, &s->buffer_attr, &flags); in create_stream()
1281 s->flags = flags; in create_stream()
1282 s->corked = !!(flags & PA_STREAM_START_CORKED); in create_stream()
1289 pa_assert(!s->smoother); in create_stream()
1291 s->smoother = pa_smoother_2_new(SMOOTHER_HISTORY_TIME, x, 0, 0); in create_stream()
1293 s->smoother = pa_smoother_new( in create_stream()
1305 …dev = s->direction == PA_STREAM_PLAYBACK ? s->context->conf->default_sink : s->context->conf->defa… in create_stream()
1308 s->context, in create_stream()
1309 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_CREATE_PLAYBACK_STREAM : PA_COMMAND_CR… in create_stream()
1312 if (s->context->version < 13) in create_stream()
1313 pa_tagstruct_puts(t, pa_proplist_gets(s->proplist, PA_PROP_MEDIA_NAME)); in create_stream()
1317 PA_TAG_SAMPLE_SPEC, &s->sample_spec, in create_stream()
1318 PA_TAG_CHANNEL_MAP, &s->channel_map, in create_stream()
1321 PA_TAG_U32, s->buffer_attr.maxlength, in create_stream()
1322 PA_TAG_BOOLEAN, s->corked, in create_stream()
1326 if (pa_sample_spec_valid(&s->sample_spec)) in create_stream()
1327 volume = pa_cvolume_reset(&cv, s->sample_spec.channels); in create_stream()
1336 if (s->direction == PA_STREAM_PLAYBACK) { in create_stream()
1339 PA_TAG_U32, s->buffer_attr.tlength, in create_stream()
1340 PA_TAG_U32, s->buffer_attr.prebuf, in create_stream()
1341 PA_TAG_U32, s->buffer_attr.minreq, in create_stream()
1342 PA_TAG_U32, s->syncid, in create_stream()
1347 pa_tagstruct_putu32(t, s->buffer_attr.fragsize); in create_stream()
1349 if (s->context->version >= 12) { in create_stream()
1362 if (s->context->version >= 13) { in create_stream()
1364 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1372 PA_TAG_PROPLIST, s->proplist, in create_stream()
1375 if (s->direction == PA_STREAM_RECORD) in create_stream()
1376 pa_tagstruct_putu32(t, s->direct_on_input); in create_stream()
1379 if (s->context->version >= 14) { in create_stream()
1381 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1387 if (s->context->version >= 15) { in create_stream()
1389 if (s->direction == PA_STREAM_PLAYBACK) in create_stream()
1396 if (s->context->version >= 17 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1399 if (s->context->version >= 18 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1402 if ((s->context->version >= 21 && s->direction == PA_STREAM_PLAYBACK) in create_stream()
1403 || s->context->version >= 22) { in create_stream()
1405 pa_tagstruct_putu8(t, s->n_formats); in create_stream()
1406 for (i = 0; i < s->n_formats; i++) in create_stream()
1407 pa_tagstruct_put_format_info(t, s->req_formats[i]); in create_stream()
1410 if (s->context->version >= 22 && s->direction == PA_STREAM_RECORD) { in create_stream()
1419 pa_pstream_send_tagstruct(s->context->pstream, t); in create_stream()
1420 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback… in create_stream()
1422 pa_stream_set_state(s, PA_STREAM_CREATING); in create_stream()
1424 pa_stream_unref(s); in create_stream()
1429 pa_stream *s, in pa_stream_connect_playback() argument
1436 pa_assert(s); in pa_stream_connect_playback()
1437 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_connect_playback()
1439 return create_stream(PA_STREAM_PLAYBACK, s, dev, attr, flags, volume, sync_stream); in pa_stream_connect_playback()
1443 pa_stream *s, in pa_stream_connect_record() argument
1448 pa_assert(s); in pa_stream_connect_record()
1449 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_connect_record()
1451 return create_stream(PA_STREAM_RECORD, s, dev, attr, flags, NULL, NULL); in pa_stream_connect_record()
1455 pa_stream *s, in pa_stream_begin_write() argument
1459 pa_assert(s); in pa_stream_begin_write()
1460 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_begin_write()
1462 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_begin_write()
1463 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_begin_write()
1464 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_begin_write()
1465 PA_CHECK_VALIDITY(s->context, data, PA_ERR_INVALID); in pa_stream_begin_write()
1466 PA_CHECK_VALIDITY(s->context, nbytes && *nbytes != 0, PA_ERR_INVALID); in pa_stream_begin_write()
1471 m = pa_mempool_block_size_max(s->context->mempool); in pa_stream_begin_write()
1472 fs = pa_frame_size(&s->sample_spec); in pa_stream_begin_write()
1479 if (!s->write_memblock) { in pa_stream_begin_write()
1480 s->write_memblock = pa_memblock_new(s->context->mempool, *nbytes); in pa_stream_begin_write()
1481 s->write_data = pa_memblock_acquire(s->write_memblock); in pa_stream_begin_write()
1484 *data = s->write_data; in pa_stream_begin_write()
1485 *nbytes = pa_memblock_get_length(s->write_memblock); in pa_stream_begin_write()
1491 pa_stream *s) { in pa_stream_cancel_write() argument
1493 pa_assert(s); in pa_stream_cancel_write()
1494 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_cancel_write()
1496 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_cancel_write()
1497 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_cancel_write()
1498 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_cancel_write()
1499 PA_CHECK_VALIDITY(s->context, s->write_memblock, PA_ERR_BADSTATE); in pa_stream_cancel_write()
1501 pa_assert(s->write_data); in pa_stream_cancel_write()
1503 pa_memblock_release(s->write_memblock); in pa_stream_cancel_write()
1504 pa_memblock_unref(s->write_memblock); in pa_stream_cancel_write()
1505 s->write_memblock = NULL; in pa_stream_cancel_write()
1506 s->write_data = NULL; in pa_stream_cancel_write()
1512 pa_stream *s, in pa_stream_write_ext_free() argument
1520 pa_assert(s); in pa_stream_write_ext_free()
1521 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_write_ext_free()
1524 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_write_ext_free()
1525 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_write_ext_free()
1526 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || s->direction == PA_STREAM_UPLO… in pa_stream_write_ext_free()
1527 PA_CHECK_VALIDITY(s->context, seek <= PA_SEEK_RELATIVE_END, PA_ERR_INVALID); in pa_stream_write_ext_free()
1528 …PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_PLAYBACK || (seek == PA_SEEK_RELATIVE && o… in pa_stream_write_ext_free()
1529 PA_CHECK_VALIDITY(s->context, in pa_stream_write_ext_free()
1530 !s->write_memblock || in pa_stream_write_ext_free()
1531 ((data >= s->write_data) && in pa_stream_write_ext_free()
1532 …((const char*) data + length <= (const char*) s->write_data + pa_memblock_get_length(s->write_memb… in pa_stream_write_ext_free()
1534 PA_CHECK_VALIDITY(s->context, offset % pa_frame_size(&s->sample_spec) == 0, PA_ERR_INVALID); in pa_stream_write_ext_free()
1535 PA_CHECK_VALIDITY(s->context, length % pa_frame_size(&s->sample_spec) == 0, PA_ERR_INVALID); in pa_stream_write_ext_free()
1536 PA_CHECK_VALIDITY(s->context, !free_cb || !s->write_memblock, PA_ERR_INVALID); in pa_stream_write_ext_free()
1538 if (s->write_memblock) { in pa_stream_write_ext_free()
1543 pa_memblock_release(s->write_memblock); in pa_stream_write_ext_free()
1545 chunk.memblock = s->write_memblock; in pa_stream_write_ext_free()
1546 chunk.index = (const char *) data - (const char *) s->write_data; in pa_stream_write_ext_free()
1549 s->write_memblock = NULL; in pa_stream_write_ext_free()
1550 s->write_data = NULL; in pa_stream_write_ext_free()
1552 pa_pstream_send_memblock(s->context->pstream, s->channel, offset, seek, &chunk); in pa_stream_write_ext_free()
1568 if (free_cb && !pa_pstream_get_shm(s->context->pstream)) { in pa_stream_write_ext_free()
1569 …chunk.memblock = pa_memblock_new_user(s->context->mempool, (void*) t_data, t_length, free_cb, free… in pa_stream_write_ext_free()
1577 … blk_size_max = pa_frame_align(pa_mempool_block_size_max(s->context->mempool), &s->sample_spec); in pa_stream_write_ext_free()
1579 chunk.memblock = pa_memblock_new(s->context->mempool, chunk.length); in pa_stream_write_ext_free()
1586 pa_pstream_send_memblock(s->context->pstream, s->channel, t_offset, t_seek, &chunk); in pa_stream_write_ext_free()
1597 if (free_cb && pa_pstream_get_shm(s->context->pstream)) in pa_stream_write_ext_free()
1602 * that's OK, the server side applies the same error */ in pa_stream_write_ext_free()
1603 s->requested_bytes -= (seek == PA_SEEK_RELATIVE ? offset : 0) + (int64_t) length; in pa_stream_write_ext_free()
1606 pa_log_debug("wrote %lli, now at %lli", (long long) length, (long long) s->requested_bytes); in pa_stream_write_ext_free()
1609 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_write_ext_free()
1612 if (s->write_index_corrections[s->current_write_index_correction].valid) { in pa_stream_write_ext_free()
1615 s->write_index_corrections[s->current_write_index_correction].corrupt = false; in pa_stream_write_ext_free()
1616 s->write_index_corrections[s->current_write_index_correction].absolute = true; in pa_stream_write_ext_free()
1617s->write_index_corrections[s->current_write_index_correction].value = offset + (int64_t) length; in pa_stream_write_ext_free()
1619 if (!s->write_index_corrections[s->current_write_index_correction].corrupt) in pa_stream_write_ext_free()
1620s->write_index_corrections[s->current_write_index_correction].value += offset + (int64_t) length; in pa_stream_write_ext_free()
1622 s->write_index_corrections[s->current_write_index_correction].corrupt = true; in pa_stream_write_ext_free()
1626 if (s->timing_info_valid) { in pa_stream_write_ext_free()
1629 s->timing_info.write_index_corrupt = false; in pa_stream_write_ext_free()
1630 s->timing_info.write_index = offset + (int64_t) length; in pa_stream_write_ext_free()
1632 if (!s->timing_info.write_index_corrupt) in pa_stream_write_ext_free()
1633 s->timing_info.write_index += offset + (int64_t) length; in pa_stream_write_ext_free()
1635 s->timing_info.write_index_corrupt = true; in pa_stream_write_ext_free()
1638 if (!s->timing_info_valid || s->timing_info.write_index_corrupt) in pa_stream_write_ext_free()
1639 request_auto_timing_update(s, true); in pa_stream_write_ext_free()
1646 pa_stream *s, in pa_stream_write() argument
1653 return pa_stream_write_ext_free(s, data, length, free_cb, (void*) data, offset, seek); in pa_stream_write()
1656 int pa_stream_peek(pa_stream *s, const void **data, size_t *length) { in pa_stream_peek() argument
1657 pa_assert(s); in pa_stream_peek()
1658 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_peek()
1662 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_peek()
1663 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_peek()
1664 PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE); in pa_stream_peek()
1666 if (!s->peek_memchunk.memblock) { in pa_stream_peek()
1668 if (pa_memblockq_peek(s->record_memblockq, &s->peek_memchunk) < 0) { in pa_stream_peek()
1674 } else if (!s->peek_memchunk.memblock) { in pa_stream_peek()
1678 *length = s->peek_memchunk.length; in pa_stream_peek()
1682 s->peek_data = pa_memblock_acquire(s->peek_memchunk.memblock); in pa_stream_peek()
1685 pa_assert(s->peek_data); in pa_stream_peek()
1686 *data = (uint8_t*) s->peek_data + s->peek_memchunk.index; in pa_stream_peek()
1687 *length = s->peek_memchunk.length; in pa_stream_peek()
1691 int pa_stream_drop(pa_stream *s) { in pa_stream_drop() argument
1692 pa_assert(s); in pa_stream_drop()
1693 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_drop()
1695 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_drop()
1696 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_drop()
1697 PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE); in pa_stream_drop()
1698 PA_CHECK_VALIDITY(s->context, s->peek_memchunk.length > 0, PA_ERR_BADSTATE); in pa_stream_drop()
1700 pa_memblockq_drop(s->record_memblockq, s->peek_memchunk.length); in pa_stream_drop()
1703 if (s->timing_info_valid && !s->timing_info.read_index_corrupt) in pa_stream_drop()
1704 s->timing_info.read_index += (int64_t) s->peek_memchunk.length; in pa_stream_drop()
1706 if (s->peek_memchunk.memblock) { in pa_stream_drop()
1707 pa_assert(s->peek_data); in pa_stream_drop()
1708 s->peek_data = NULL; in pa_stream_drop()
1709 pa_memblock_release(s->peek_memchunk.memblock); in pa_stream_drop()
1710 pa_memblock_unref(s->peek_memchunk.memblock); in pa_stream_drop()
1713 pa_memchunk_reset(&s->peek_memchunk); in pa_stream_drop()
1718 size_t pa_stream_writable_size(const pa_stream *s) { in pa_stream_writable_size() argument
1719 pa_assert(s); in pa_stream_writable_size()
1720 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_writable_size()
1722 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, (size_t) -1); in pa_stream_writable_size()
1723 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, (size_t) -1… in pa_stream_writable_size()
1724 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction != PA_STREAM_RECORD, PA_ERR_BADSTATE, (size_… in pa_stream_writable_size()
1726 return s->requested_bytes > 0 ? (size_t) s->requested_bytes : 0; in pa_stream_writable_size()
1729 size_t pa_stream_readable_size(const pa_stream *s) { in pa_stream_readable_size() argument
1730 pa_assert(s); in pa_stream_readable_size()
1731 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_readable_size()
1733 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, (size_t) -1); in pa_stream_readable_size()
1734 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, (size_t) -1… in pa_stream_readable_size()
1735 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE, (size_… in pa_stream_readable_size()
1737 return pa_memblockq_get_length(s->record_memblockq); in pa_stream_readable_size()
1740 pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_drain() argument
1745 pa_assert(s); in pa_stream_drain()
1746 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_drain()
1748 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_drain()
1749 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_drain()
1750 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_drain()
1755 request_auto_timing_update(s, true); in pa_stream_drain()
1757 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_drain()
1759 t = pa_tagstruct_command(s->context, PA_COMMAND_DRAIN_PLAYBACK_STREAM, &tag); in pa_stream_drain()
1760 pa_tagstruct_putu32(t, s->channel); in pa_stream_drain()
1761 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_drain()
1762 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_drain()
1765 * let's request a timing update */ in pa_stream_drain()
1766 request_auto_timing_update(s, true); in pa_stream_drain()
1771 static pa_usec_t calc_time(const pa_stream *s, bool ignore_transport) { in calc_time() argument
1774 pa_assert(s); in calc_time()
1775 pa_assert(PA_REFCNT_VALUE(s) >= 1); in calc_time()
1776 pa_assert(s->state == PA_STREAM_READY); in calc_time()
1777 pa_assert(s->direction != PA_STREAM_UPLOAD); in calc_time()
1778 pa_assert(s->timing_info_valid); in calc_time()
1779 pa_assert(s->direction != PA_STREAM_PLAYBACK || !s->timing_info.read_index_corrupt); in calc_time()
1780 pa_assert(s->direction != PA_STREAM_RECORD || !s->timing_info.write_index_corrupt); in calc_time()
1782 if (s->direction == PA_STREAM_PLAYBACK) { in calc_time()
1785 …usec = pa_bytes_to_usec(s->timing_info.read_index < 0 ? 0 : (uint64_t) s->timing_info.read_index, … in calc_time()
1787 if (!s->corked && !s->suspended) { in calc_time()
1793 usec += s->timing_info.transport_usec; in calc_time()
1798 if (s->timing_info.sink_usec >= usec) in calc_time()
1801 usec -= s->timing_info.sink_usec; in calc_time()
1805 pa_assert(s->direction == PA_STREAM_RECORD); in calc_time()
1809 …usec = pa_bytes_to_usec(s->timing_info.write_index < 0 ? 0 : (uint64_t) s->timing_info.write_index… in calc_time()
1811 if (!s->corked && !s->suspended) { in calc_time()
1815 usec += s->timing_info.transport_usec; in calc_time()
1818 usec += s->timing_info.source_usec; in calc_time()
1822 if (s->timing_info.sink_usec >= usec) in calc_time()
1825 usec -= s->timing_info.sink_usec; in calc_time()
1833 static inline uint64_t calc_bytes(pa_stream *s, bool ignore_transport) { in calc_bytes() argument
1834 …return (uint64_t)(calc_time(s, ignore_transport) * s->sample_spec.rate / PA_USEC_PER_SEC * pa_fram… in calc_bytes()
1910 /* clocks are not synchronized, let's estimate latency then */ in stream_get_timing_info_callback()
2036 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
2043 pa_assert(s); in pa_stream_update_timing_info()
2044 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_update_timing_info()
2046 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_update_timing_info()
2047 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_update_timing_info()
2048 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_update_timing_info()
2050 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_update_timing_info()
2052 cidx = (s->current_write_index_correction + 1) % PA_MAX_WRITE_INDEX_CORRECTIONS; in pa_stream_update_timing_info()
2055 …PA_CHECK_VALIDITY_RETURN_NULL(s->context, !s->write_index_corrections[cidx].valid, PA_ERR_INTERNAL… in pa_stream_update_timing_info()
2057 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_update_timing_info()
2060 s->context, in pa_stream_update_timing_info()
2061 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_GET_PLAYBACK_LATENCY : PA_COMMAND_GET_… in pa_stream_update_timing_info()
2063 pa_tagstruct_putu32(t, s->channel); in pa_stream_update_timing_info()
2066 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_update_timing_info()
2067 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_get_timing_info_ca… in pa_stream_update_timing_info()
2069 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_update_timing_info()
2072 s->current_write_index_correction = cidx; in pa_stream_update_timing_info()
2074 s->write_index_corrections[cidx].valid = true; in pa_stream_update_timing_info()
2075 s->write_index_corrections[cidx].absolute = false; in pa_stream_update_timing_info()
2076 s->write_index_corrections[cidx].corrupt = false; in pa_stream_update_timing_info()
2077 s->write_index_corrections[cidx].tag = tag; in pa_stream_update_timing_info()
2078 s->write_index_corrections[cidx].value = 0; in pa_stream_update_timing_info()
2085 pa_stream *s = userdata; in pa_stream_disconnect_callback() local
2088 pa_assert(s); in pa_stream_disconnect_callback()
2089 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_disconnect_callback()
2091 pa_stream_ref(s); in pa_stream_disconnect_callback()
2094 if (pa_context_handle_error(s->context, command, t, false) < 0) in pa_stream_disconnect_callback()
2097 pa_stream_set_state(s, PA_STREAM_FAILED); in pa_stream_disconnect_callback()
2100 pa_context_fail(s->context, PA_ERR_PROTOCOL); in pa_stream_disconnect_callback()
2104 pa_stream_set_state(s, PA_STREAM_TERMINATED); in pa_stream_disconnect_callback()
2107 pa_stream_unref(s); in pa_stream_disconnect_callback()
2110 int pa_stream_disconnect(pa_stream *s) { in pa_stream_disconnect() argument
2114 pa_assert(s); in pa_stream_disconnect()
2115 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_disconnect()
2117 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_disconnect()
2118 PA_CHECK_VALIDITY(s->context, s->channel_valid, PA_ERR_BADSTATE); in pa_stream_disconnect()
2119 PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); in pa_stream_disconnect()
2121 pa_stream_ref(s); in pa_stream_disconnect()
2124 s->context, in pa_stream_disconnect()
2125 (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_DELETE_PLAYBACK_STREAM : in pa_stream_disconnect()
2126 …(s->direction == PA_STREAM_RECORD ? PA_COMMAND_DELETE_RECORD_STREAM : PA_COMMAND_DELETE_UPLOAD_STR… in pa_stream_disconnect()
2128 pa_tagstruct_putu32(t, s->channel); in pa_stream_disconnect()
2129 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_disconnect()
2130 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_disconnect_call… in pa_stream_disconnect()
2132 pa_stream_unref(s); in pa_stream_disconnect()
2136 void pa_stream_set_read_callback(pa_stream *s, pa_stream_request_cb_t cb, void *userdata) { in pa_stream_set_read_callback() argument
2137 pa_assert(s); in pa_stream_set_read_callback()
2138 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_read_callback()
2143 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_read_callback()
2146 s->read_callback = cb; in pa_stream_set_read_callback()
2147 s->read_userdata = userdata; in pa_stream_set_read_callback()
2150 void pa_stream_set_write_callback(pa_stream *s, pa_stream_request_cb_t cb, void *userdata) { in pa_stream_set_write_callback() argument
2151 pa_assert(s); in pa_stream_set_write_callback()
2152 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_write_callback()
2157 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_write_callback()
2160 s->write_callback = cb; in pa_stream_set_write_callback()
2161 s->write_userdata = userdata; in pa_stream_set_write_callback()
2164 void pa_stream_set_state_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_state_callback() argument
2165 pa_assert(s); in pa_stream_set_state_callback()
2166 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_state_callback()
2171 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_state_callback()
2174 s->state_callback = cb; in pa_stream_set_state_callback()
2175 s->state_userdata = userdata; in pa_stream_set_state_callback()
2178 void pa_stream_set_overflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_overflow_callback() argument
2179 pa_assert(s); in pa_stream_set_overflow_callback()
2180 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_overflow_callback()
2185 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_overflow_callback()
2188 s->overflow_callback = cb; in pa_stream_set_overflow_callback()
2189 s->overflow_userdata = userdata; in pa_stream_set_overflow_callback()
2192 void pa_stream_set_underflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_underflow_callback() argument
2193 pa_assert(s); in pa_stream_set_underflow_callback()
2194 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_underflow_callback()
2199 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_underflow_callback()
2202 s->underflow_callback = cb; in pa_stream_set_underflow_callback()
2203 s->underflow_userdata = userdata; in pa_stream_set_underflow_callback()
2206 void pa_stream_set_underflow_ohos_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_underflow_ohos_callback() argument
2207 pa_assert(s); in pa_stream_set_underflow_ohos_callback()
2208 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_underflow_ohos_callback()
2213 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_underflow_ohos_callback()
2216 s->underflow_ohos_callback = cb; in pa_stream_set_underflow_ohos_callback()
2217 s->underflow_ohos_userdata = userdata; in pa_stream_set_underflow_ohos_callback()
2220 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
2221 pa_assert(s); in pa_stream_set_latency_update_callback()
2222 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_latency_update_callback()
2227 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_latency_update_callback()
2230 s->latency_update_callback = cb; in pa_stream_set_latency_update_callback()
2231 s->latency_update_userdata = userdata; in pa_stream_set_latency_update_callback()
2234 void pa_stream_set_moved_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_moved_callback() argument
2235 pa_assert(s); in pa_stream_set_moved_callback()
2236 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_moved_callback()
2241 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_moved_callback()
2244 s->moved_callback = cb; in pa_stream_set_moved_callback()
2245 s->moved_userdata = userdata; in pa_stream_set_moved_callback()
2248 void pa_stream_set_suspended_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_suspended_callback() argument
2249 pa_assert(s); in pa_stream_set_suspended_callback()
2250 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_suspended_callback()
2255 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_suspended_callback()
2258 s->suspended_callback = cb; in pa_stream_set_suspended_callback()
2259 s->suspended_userdata = userdata; in pa_stream_set_suspended_callback()
2262 void pa_stream_set_started_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) { in pa_stream_set_started_callback() argument
2263 pa_assert(s); in pa_stream_set_started_callback()
2264 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_started_callback()
2269 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_started_callback()
2272 s->started_callback = cb; in pa_stream_set_started_callback()
2273 s->started_userdata = userdata; in pa_stream_set_started_callback()
2276 void pa_stream_set_event_callback(pa_stream *s, pa_stream_event_cb_t cb, void *userdata) { in pa_stream_set_event_callback() argument
2277 pa_assert(s); in pa_stream_set_event_callback()
2278 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_event_callback()
2283 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_event_callback()
2286 s->event_callback = cb; in pa_stream_set_event_callback()
2287 s->event_userdata = userdata; in pa_stream_set_event_callback()
2290 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
2291 pa_assert(s); in pa_stream_set_buffer_attr_callback()
2292 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_buffer_attr_callback()
2297 if (s->state == PA_STREAM_TERMINATED || s->state == PA_STREAM_FAILED) in pa_stream_set_buffer_attr_callback()
2300 s->buffer_attr_callback = cb; in pa_stream_set_buffer_attr_callback()
2301 s->buffer_attr_userdata = userdata; in pa_stream_set_buffer_attr_callback()
2335 pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_cork() argument
2340 pa_assert(s); in pa_stream_cork()
2341 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_cork()
2343 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_cork()
2344 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_cork()
2345 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_cork()
2350 request_auto_timing_update(s, true); in pa_stream_cork()
2352 s->corked = b; in pa_stream_cork()
2354 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_cork()
2357 s->context, in pa_stream_cork()
2358 …(uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_CORK_PLAYBACK_STREAM : PA_COMMAND_CORK… in pa_stream_cork()
2360 pa_tagstruct_putu32(t, s->channel); in pa_stream_cork()
2362 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_cork()
2363 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_cork()
2365 check_smoother_status(s, false, false, false); in pa_stream_cork()
2367 /* This might cause the indexes to hang/start again, hence let's in pa_stream_cork()
2369 request_auto_timing_update(s, true); in pa_stream_cork()
2374 static pa_operation* stream_send_simple_command(pa_stream *s, uint32_t command, pa_stream_success_c… in stream_send_simple_command() argument
2379 pa_assert(s); in stream_send_simple_command()
2380 pa_assert(PA_REFCNT_VALUE(s) >= 1); in stream_send_simple_command()
2382 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in stream_send_simple_command()
2383 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in stream_send_simple_command()
2385 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in stream_send_simple_command()
2387 t = pa_tagstruct_command(s->context, command, &tag); in stream_send_simple_command()
2388 pa_tagstruct_putu32(t, s->channel); in stream_send_simple_command()
2389 pa_pstream_send_tagstruct(s->context->pstream, t); in stream_send_simple_command()
2390 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in stream_send_simple_command()
2395 pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_flush() argument
2398 pa_assert(s); in pa_stream_flush()
2399 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_flush()
2401 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_flush()
2402 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_flush()
2403 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_flush()
2408 request_auto_timing_update(s, true); in pa_stream_flush()
2410 …if (!(o = stream_send_simple_command(s, (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAN… in pa_stream_flush()
2413 if (s->direction == PA_STREAM_PLAYBACK) { in pa_stream_flush()
2415 if (s->write_index_corrections[s->current_write_index_correction].valid) in pa_stream_flush()
2416 s->write_index_corrections[s->current_write_index_correction].corrupt = true; in pa_stream_flush()
2418 if (s->buffer_attr.prebuf > 0) in pa_stream_flush()
2419 check_smoother_status(s, false, false, true); in pa_stream_flush()
2423 invalidate_indexes(s, false, true); in pa_stream_flush()
2428 invalidate_indexes(s, true, false); in pa_stream_flush()
2438 pa_operation* pa_stream_prebuf(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_prebuf() argument
2441 pa_assert(s); in pa_stream_prebuf()
2442 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_prebuf()
2444 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_prebuf()
2445 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_prebuf()
2446 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_prebuf()
2447 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); in pa_stream_prebuf()
2452 request_auto_timing_update(s, true); in pa_stream_prebuf()
2454 if (!(o = stream_send_simple_command(s, PA_COMMAND_PREBUF_PLAYBACK_STREAM, cb, userdata))) in pa_stream_prebuf()
2458 * let's request a timing update */ in pa_stream_prebuf()
2459 request_auto_timing_update(s, true); in pa_stream_prebuf()
2464 pa_operation* pa_stream_trigger(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) { in pa_stream_trigger() argument
2467 pa_assert(s); in pa_stream_trigger()
2468 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_trigger()
2470 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_trigger()
2471 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_trigger()
2472 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); in pa_stream_trigger()
2473 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); in pa_stream_trigger()
2478 request_auto_timing_update(s, true); in pa_stream_trigger()
2480 if (!(o = stream_send_simple_command(s, PA_COMMAND_TRIGGER_PLAYBACK_STREAM, cb, userdata))) in pa_stream_trigger()
2484 * let's request a timing update */ in pa_stream_trigger()
2485 request_auto_timing_update(s, true); in pa_stream_trigger()
2490 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
2493 pa_assert(s); in pa_stream_set_name()
2494 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_name()
2497 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_name()
2498 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_set_name()
2499 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_set_name()
2501 if (s->context->version >= 13) { in pa_stream_set_name()
2505 o = pa_stream_proplist_update(s, PA_UPDATE_REPLACE, p, cb, userdata); in pa_stream_set_name()
2511 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_set_name()
2513 s->context, in pa_stream_set_name()
2514 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_SET_RECORD_STREAM_NAME : PA_COMMAND_SET_… in pa_stream_set_name()
2516 pa_tagstruct_putu32(t, s->channel); in pa_stream_set_name()
2518 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_set_name()
2519 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_set_name()
2525 int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) { in pa_stream_get_time() argument
2528 pa_assert(s); in pa_stream_get_time()
2529 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_time()
2531 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_time()
2532 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_time()
2533 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_time()
2534 PA_CHECK_VALIDITY(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_time()
2535 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_PLAYBACK || !s->timing_info.read_index_cor… in pa_stream_get_time()
2536 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_RECORD || !s->timing_info.write_index_corr… in pa_stream_get_time()
2538 if (s->smoother) in pa_stream_get_time()
2540 usec = pa_smoother_2_get(s->smoother, pa_rtclock_now()); in pa_stream_get_time()
2542 usec = pa_smoother_get(s->smoother, pa_rtclock_now()); in pa_stream_get_time()
2546 usec = calc_time(s, false); in pa_stream_get_time()
2549 if (!(s->flags & PA_STREAM_NOT_MONOTONIC)) { in pa_stream_get_time()
2550 if (usec < s->previous_time) in pa_stream_get_time()
2551 usec = s->previous_time; in pa_stream_get_time()
2553 s->previous_time = usec; in pa_stream_get_time()
2562 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
2563 pa_assert(s); in time_counter_diff()
2564 pa_assert(PA_REFCNT_VALUE(s) >= 1); in time_counter_diff()
2572 if (negative && s->direction == PA_STREAM_RECORD) { in time_counter_diff()
2580 int pa_stream_get_latency(pa_stream *s, pa_usec_t *r_usec, int *negative) { in pa_stream_get_latency() argument
2585 pa_assert(s); in pa_stream_get_latency()
2586 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_latency()
2589 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_latency()
2590 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_latency()
2591 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_latency()
2592 PA_CHECK_VALIDITY(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_latency()
2593 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_PLAYBACK || !s->timing_info.write_index_co… in pa_stream_get_latency()
2594 …PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_RECORD || !s->timing_info.read_index_corru… in pa_stream_get_latency()
2596 if ((r = pa_stream_get_time(s, &t)) < 0) in pa_stream_get_latency()
2599 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_get_latency()
2600 cindex = s->timing_info.write_index; in pa_stream_get_latency()
2602 cindex = s->timing_info.read_index; in pa_stream_get_latency()
2607 c = pa_bytes_to_usec((uint64_t) cindex, &s->sample_spec); in pa_stream_get_latency()
2609 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_get_latency()
2610 *r_usec = time_counter_diff(s, c, t, negative); in pa_stream_get_latency()
2612 *r_usec = time_counter_diff(s, t, c, negative); in pa_stream_get_latency()
2617 const pa_timing_info* pa_stream_get_timing_info(pa_stream *s) { in pa_stream_get_timing_info() argument
2618 pa_assert(s); in pa_stream_get_timing_info()
2619 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_timing_info()
2621 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_timing_info()
2622 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_timing_info()
2623 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_timing_info()
2624 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->timing_info_valid, PA_ERR_NODATA); in pa_stream_get_timing_info()
2626 return &s->timing_info; in pa_stream_get_timing_info()
2629 const pa_sample_spec* pa_stream_get_sample_spec(pa_stream *s) { in pa_stream_get_sample_spec() argument
2630 pa_assert(s); in pa_stream_get_sample_spec()
2631 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_sample_spec()
2633 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_sample_spec()
2635 return &s->sample_spec; in pa_stream_get_sample_spec()
2638 const pa_channel_map* pa_stream_get_channel_map(pa_stream *s) { in pa_stream_get_channel_map() argument
2639 pa_assert(s); in pa_stream_get_channel_map()
2640 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_channel_map()
2642 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_channel_map()
2644 return &s->channel_map; in pa_stream_get_channel_map()
2647 const pa_format_info* pa_stream_get_format_info(const pa_stream *s) { in pa_stream_get_format_info() argument
2648 pa_assert(s); in pa_stream_get_format_info()
2649 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_format_info()
2652 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_format_info()
2653 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_format_info()
2655 return s->format; in pa_stream_get_format_info()
2657 const pa_buffer_attr* pa_stream_get_buffer_attr(pa_stream *s) { in pa_stream_get_buffer_attr() argument
2658 pa_assert(s); in pa_stream_get_buffer_attr()
2659 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_buffer_attr()
2661 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_buffer_attr()
2662 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_buffer_attr()
2663 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 9, PA_ERR_NOTSUPPORTED); in pa_stream_get_buffer_attr()
2665 return &s->buffer_attr; in pa_stream_get_buffer_attr()
2731 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
2737 pa_assert(s); in pa_stream_set_buffer_attr()
2738 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_buffer_attr()
2741 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_buffer_attr()
2742 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_set_buffer_attr()
2743 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_set_buffer_attr()
2744 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_set_buffer_attr()
2749 request_auto_timing_update(s, true); in pa_stream_set_buffer_attr()
2751 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_set_buffer_attr()
2754 s->context, in pa_stream_set_buffer_attr()
2755 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_SET_RECORD_STREAM_BUFFER_ATTR : PA_COMMA… in pa_stream_set_buffer_attr()
2757 pa_tagstruct_putu32(t, s->channel); in pa_stream_set_buffer_attr()
2760 patch_buffer_attr(s, &copy, NULL); in pa_stream_set_buffer_attr()
2765 if (s->direction == PA_STREAM_PLAYBACK) in pa_stream_set_buffer_attr()
2775 if (s->context->version >= 13) in pa_stream_set_buffer_attr()
2776 pa_tagstruct_put_boolean(t, !!(s->flags & PA_STREAM_ADJUST_LATENCY)); in pa_stream_set_buffer_attr()
2778 if (s->context->version >= 14) in pa_stream_set_buffer_attr()
2779 pa_tagstruct_put_boolean(t, !!(s->flags & PA_STREAM_EARLY_REQUESTS)); in pa_stream_set_buffer_attr()
2781 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_set_buffer_attr()
2782 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_set_buffer_attr_ca… in pa_stream_set_buffer_attr()
2784 /* This might cause changes in the read/write index, hence let's in pa_stream_set_buffer_attr()
2786 request_auto_timing_update(s, true); in pa_stream_set_buffer_attr()
2791 uint32_t pa_stream_get_device_index(const pa_stream *s) { in pa_stream_get_device_index() argument
2792 pa_assert(s); in pa_stream_get_device_index()
2793 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_device_index()
2795 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_device_index()
2796 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, PA_INVALID_… in pa_stream_get_device_index()
2797 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE, PA_INV… in pa_stream_get_device_index()
2798 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED, PA_INVALI… in pa_stream_get_device_index()
2799 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->device_index != PA_INVALID_INDEX, PA_ERR_BADSTATE, PA_… in pa_stream_get_device_index()
2801 return s->device_index; in pa_stream_get_device_index()
2804 const char *pa_stream_get_device_name(const pa_stream *s) { in pa_stream_get_device_name() argument
2805 pa_assert(s); in pa_stream_get_device_name()
2806 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_device_name()
2808 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_get_device_name()
2809 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2810 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2811 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_get_device_name()
2812 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->device_name, PA_ERR_BADSTATE); in pa_stream_get_device_name()
2814 return s->device_name; in pa_stream_get_device_name()
2817 int pa_stream_is_suspended(const pa_stream *s) { in pa_stream_is_suspended() argument
2818 pa_assert(s); in pa_stream_is_suspended()
2819 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_is_suspended()
2821 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_is_suspended()
2822 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_is_suspended()
2823 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_is_suspended()
2824 PA_CHECK_VALIDITY(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_is_suspended()
2826 return s->suspended; in pa_stream_is_suspended()
2829 int pa_stream_is_corked(const pa_stream *s) { in pa_stream_is_corked() argument
2830 pa_assert(s); in pa_stream_is_corked()
2831 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_is_corked()
2833 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_is_corked()
2834 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_is_corked()
2835 PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_is_corked()
2837 return s->corked; in pa_stream_is_corked()
2881 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
2886 pa_assert(s); in pa_stream_update_sample_rate()
2887 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_update_sample_rate()
2889 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_update_sample_rate()
2890 PA_CHECK_VALIDITY_RETURN_NULL(s->context, pa_sample_rate_valid(rate), PA_ERR_INVALID); in pa_stream_update_sample_rate()
2891 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2892 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2893 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->flags & PA_STREAM_VARIABLE_RATE, PA_ERR_BADSTATE); in pa_stream_update_sample_rate()
2894 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); in pa_stream_update_sample_rate()
2896 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_update_sample_rate()
2900 s->context, in pa_stream_update_sample_rate()
2901 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_UPDATE_RECORD_STREAM_SAMPLE_RATE : PA_CO… in pa_stream_update_sample_rate()
2903 pa_tagstruct_putu32(t, s->channel); in pa_stream_update_sample_rate()
2906 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_update_sample_rate()
2907 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_update_sample_rate… in pa_stream_update_sample_rate()
2912 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
2917 pa_assert(s); in pa_stream_proplist_update()
2918 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_proplist_update()
2920 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_proplist_update()
2921 …PA_CHECK_VALIDITY_RETURN_NULL(s->context, mode == PA_UPDATE_SET || mode == PA_UPDATE_MERGE || mode… in pa_stream_proplist_update()
2922 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_proplist_update()
2923 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_proplist_update()
2924 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_proplist_update()
2926 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_proplist_update()
2929 s->context, in pa_stream_proplist_update()
2930 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_UPDATE_RECORD_STREAM_PROPLIST : PA_COMMA… in pa_stream_proplist_update()
2932 pa_tagstruct_putu32(t, s->channel); in pa_stream_proplist_update()
2936 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_proplist_update()
2937 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_proplist_update()
2939 /* Please note that we don't update s->proplist here, because we in pa_stream_proplist_update()
2945 pa_operation *pa_stream_proplist_remove(pa_stream *s, const char *const keys[], pa_stream_success_c… in pa_stream_proplist_remove() argument
2951 pa_assert(s); in pa_stream_proplist_remove()
2952 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_proplist_remove()
2954 PA_CHECK_VALIDITY_RETURN_NULL(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_proplist_remove()
2955 PA_CHECK_VALIDITY_RETURN_NULL(s->context, keys && keys[0], PA_ERR_INVALID); in pa_stream_proplist_remove()
2956 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE); in pa_stream_proplist_remove()
2957 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); in pa_stream_proplist_remove()
2958 PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_proplist_remove()
2960 o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); in pa_stream_proplist_remove()
2963 s->context, in pa_stream_proplist_remove()
2964 …(uint32_t) (s->direction == PA_STREAM_RECORD ? PA_COMMAND_REMOVE_RECORD_STREAM_PROPLIST : PA_COMMA… in pa_stream_proplist_remove()
2966 pa_tagstruct_putu32(t, s->channel); in pa_stream_proplist_remove()
2973 pa_pstream_send_tagstruct(s->context->pstream, t); in pa_stream_proplist_remove()
2974 …pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_call… in pa_stream_proplist_remove()
2976 /* Please note that we don't update s->proplist here, because we in pa_stream_proplist_remove()
2982 int pa_stream_set_monitor_stream(pa_stream *s, uint32_t sink_input_idx) { in pa_stream_set_monitor_stream() argument
2983 pa_assert(s); in pa_stream_set_monitor_stream()
2984 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_set_monitor_stream()
2986 PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED); in pa_stream_set_monitor_stream()
2987 PA_CHECK_VALIDITY(s->context, sink_input_idx != PA_INVALID_INDEX, PA_ERR_INVALID); in pa_stream_set_monitor_stream()
2988 PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE); in pa_stream_set_monitor_stream()
2989 PA_CHECK_VALIDITY(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED); in pa_stream_set_monitor_stream()
2991 s->direct_on_input = sink_input_idx; in pa_stream_set_monitor_stream()
2996 uint32_t pa_stream_get_monitor_stream(const pa_stream *s) { in pa_stream_get_monitor_stream() argument
2997 pa_assert(s); in pa_stream_get_monitor_stream()
2998 pa_assert(PA_REFCNT_VALUE(s) >= 1); in pa_stream_get_monitor_stream()
3000 PA_CHECK_VALIDITY_RETURN_ANY(s->context, !pa_detect_fork(), PA_ERR_FORKED, PA_INVALID_INDEX); in pa_stream_get_monitor_stream()
3001 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direct_on_input != PA_INVALID_INDEX, PA_ERR_BADSTATE, … in pa_stream_get_monitor_stream()
3002 …PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->context->version >= 13, PA_ERR_NOTSUPPORTED, PA_INVALI… in pa_stream_get_monitor_stream()
3004 return s->direct_on_input; in pa_stream_get_monitor_stream()