Lines Matching refs:data

51 pa_source_output_new_data* pa_source_output_new_data_init(pa_source_output_new_data *data) {
52 pa_assert(data);
54 pa_zero(*data);
55 data->resample_method = PA_RESAMPLER_INVALID;
56 data->proplist = pa_proplist_new();
57 data->volume_writable = true;
59 return data;
62 void pa_source_output_new_data_set_sample_spec(pa_source_output_new_data *data, const pa_sample_spec *spec) {
63 pa_assert(data);
65 if ((data->sample_spec_is_set = !!spec))
66 data->sample_spec = *spec;
69 void pa_source_output_new_data_set_channel_map(pa_source_output_new_data *data, const pa_channel_map *map) {
70 pa_assert(data);
72 if ((data->channel_map_is_set = !!map))
73 data->channel_map = *map;
76 bool pa_source_output_new_data_is_passthrough(pa_source_output_new_data *data) {
77 pa_assert(data);
79 if (PA_LIKELY(data->format) && PA_UNLIKELY(!pa_format_info_is_pcm(data->format)))
82 if (PA_UNLIKELY(data->flags & PA_SOURCE_OUTPUT_PASSTHROUGH))
88 void pa_source_output_new_data_set_volume(pa_source_output_new_data *data, const pa_cvolume *volume) {
89 pa_assert(data);
90 pa_assert(data->volume_writable);
92 if ((data->volume_is_set = !!volume))
93 data->volume = *volume;
96 void pa_source_output_new_data_apply_volume_factor(pa_source_output_new_data *data, const pa_cvolume *volume_factor) {
97 pa_assert(data);
100 if (data->volume_factor_is_set)
101 pa_sw_cvolume_multiply(&data->volume_factor, &data->volume_factor, volume_factor);
103 data->volume_factor_is_set = true;
104 data->volume_factor = *volume_factor;
108 void pa_source_output_new_data_apply_volume_factor_source(pa_source_output_new_data *data, const pa_cvolume *volume_factor) {
109 pa_assert(data);
112 if (data->volume_factor_source_is_set)
113 pa_sw_cvolume_multiply(&data->volume_factor_source, &data->volume_factor_source, volume_factor);
115 data->volume_factor_source_is_set = true;
116 data->volume_factor_source = *volume_factor;
120 void pa_source_output_new_data_set_muted(pa_source_output_new_data *data, bool mute) {
121 pa_assert(data);
123 data->muted_is_set = true;
124 data->muted = mute;
127 bool pa_source_output_new_data_set_source(pa_source_output_new_data *data, pa_source *s, bool save,
132 pa_assert(data);
135 if (!data->req_formats) {
137 data->source = s;
139 pa_xfree(data->preferred_source);
140 data->preferred_source = pa_xstrdup(s->name);
142 data->source_requested_by_application = requested_by_application;
145 formats = pa_source_check_formats(s, data->req_formats);
149 data->source = s;
151 pa_xfree(data->preferred_source);
152 data->preferred_source = pa_xstrdup(s->name);
154 data->source_requested_by_application = requested_by_application;
155 if (data->nego_formats)
156 pa_idxset_free(data->nego_formats, (pa_free_cb_t) pa_format_info_free);
157 data->nego_formats = formats;
169 bool pa_source_output_new_data_set_formats(pa_source_output_new_data *data, pa_idxset *formats) {
170 pa_assert(data);
173 if (data->req_formats)
174 pa_idxset_free(data->req_formats, (pa_free_cb_t) pa_format_info_free);
176 data->req_formats = formats;
178 if (data->source) {
180 return pa_source_output_new_data_set_source(data, data->source, (data->preferred_source != NULL),
181 data->source_requested_by_application);
187 void pa_source_output_new_data_done(pa_source_output_new_data *data) {
188 pa_assert(data);
190 if (data->req_formats)
191 pa_idxset_free(data->req_formats, (pa_free_cb_t) pa_format_info_free);
193 if (data->nego_formats)
194 pa_idxset_free(data->nego_formats, (pa_free_cb_t) pa_format_info_free);
196 if (data->format)
197 pa_format_info_free(data->format);
199 if (data->preferred_source)
200 pa_xfree(data->preferred_source);
202 pa_proplist_free(data->proplist);
233 pa_source_output_new_data *data) {
245 pa_assert(data);
248 if (data->client)
249 pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
251 if (data->destination_source && (data->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
252 data->volume_writable = false;
254 if (!data->req_formats) {
261 f = pa_format_info_from_sample_spec2(&data->sample_spec, data->channel_map_is_set ? &data->channel_map : NULL,
262 !(data->flags & PA_SOURCE_OUTPUT_FIX_FORMAT),
263 !(data->flags & PA_SOURCE_OUTPUT_FIX_RATE),
264 !(data->flags & PA_SOURCE_OUTPUT_FIX_CHANNELS));
270 pa_source_output_new_data_set_formats(data, formats);
273 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], data)) < 0)
276 pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
278 if (!data->source) {
281 if (data->direct_on_input) {
282 source = data->direct_on_input->sink->monitor_source;
289 pa_source_output_new_data_set_source(data, source, false, false);
294 if (!data->format && data->nego_formats && !pa_idxset_isempty(data->nego_formats))
295 data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
297 if (PA_LIKELY(data->format)) {
298 /* We know that data->source is set, because data->format has been set.
299 * data->format is set after a successful format negotiation, and that
300 * can't happen before data->source has been set. */
301 pa_assert(data->source);
303 pa_log_debug("Negotiated format: %s", pa_format_info_snprint(fmt, sizeof(fmt), data->format));
309 PA_IDXSET_FOREACH(format, data->req_formats, idx)
315 pa_return_val_if_fail(PA_SOURCE_IS_LINKED(data->source->state), -PA_ERR_BADSTATE);
316 pa_return_val_if_fail(!data->direct_on_input || data->direct_on_input->sink == data->source->monitor_of, -PA_ERR_INVALID);
320 if (data->volume_is_set && !pa_source_output_new_data_is_passthrough(data)) {
321 /* If volume is set, we need to save the original data->channel_map,
323 * final channel map of the stream in case data->channel_map gets
325 r = pa_stream_get_volume_channel_map(&data->volume, data->channel_map_is_set ? &data->channel_map : NULL, data->format, &volume_map);
336 r = pa_format_info_to_sample_spec2(data->format, &data->sample_spec, &data->channel_map, &data->source->sample_spec,
337 &data->source->channel_map);
343 if (pa_source_output_new_data_is_passthrough(data)) {
344 data->volume_is_set = true;
345 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
346 data->volume_is_absolute = true;
347 data->save_volume = false;
350 if (!data->volume_is_set) {
351 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
352 data->volume_is_absolute = false;
353 data->save_volume = false;
356 if (!data->volume_writable)
357 data->save_volume = false;
362 pa_cvolume_remap(&data->volume, &volume_map, &data->channel_map);
364 if (!data->volume_factor_is_set)
365 pa_cvolume_reset(&data->volume_factor, data->sample_spec.channels);
367 pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor, &data->sample_spec), -PA_ERR_INVALID);
369 if (!data->volume_factor_source_is_set)
370 pa_cvolume_reset(&data->volume_factor_source, data->source->sample_spec.channels);
372 pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor_source, &data->source->sample_spec), -PA_ERR_INVALID);
374 if (!data->muted_is_set)
375 data->muted = false;
377 if (!(data->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) &&
378 !pa_sample_spec_equal(&data->sample_spec, &data->source->sample_spec)) {
383 pa_source_reconfigure(data->source, &data->sample_spec, pa_source_output_new_data_is_passthrough(data));
386 if (pa_source_output_new_data_is_passthrough(data) &&
387 !pa_sample_spec_equal(&data->sample_spec, &data->source->sample_spec)) {
394 if (data->resample_method == PA_RESAMPLER_INVALID)
395 data->resample_method = core->resample_method;
397 pa_return_val_if_fail(data->resample_method < PA_RESAMPLER_MAX, -PA_ERR_INVALID);
399 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_FIXATE], data)) < 0)
402 if ((data->flags & PA_SOURCE_OUTPUT_NO_CREATE_ON_SUSPEND) &&
403 data->source->state == PA_SOURCE_SUSPENDED) {
408 if (pa_idxset_size(data->source->outputs) >= PA_MAX_OUTPUTS_PER_SOURCE) {
413 if ((data->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ||
414 !pa_sample_spec_equal(&data->sample_spec, &data->source->sample_spec) ||
415 !pa_channel_map_equal(&data->channel_map, &data->source->channel_map)) {
417 if (!pa_source_output_new_data_is_passthrough(data)) /* no resampler for passthrough content */
420 &data->source->sample_spec, &data->source->channel_map,
421 &data->sample_spec, &data->channel_map,
423 data->resample_method,
424 ((data->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
425 ((data->flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
426 (core->disable_remixing || (data->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
441 o->flags = data->flags;
442 o->proplist = pa_proplist_copy(data->proplist);
443 o->driver = pa_xstrdup(pa_path_get_filename(data->driver));
444 o->module = data->module;
445 o->source = data->source;
446 o->source_requested_by_application = data->source_requested_by_application;
447 o->destination_source = data->destination_source;
448 o->client = data->client;
450 o->requested_resample_method = data->resample_method;
452 o->sample_spec = data->sample_spec;
453 o->channel_map = data->channel_map;
454 o->format = pa_format_info_copy(data->format);
456 if (!data->volume_is_absolute && pa_source_flat_volume_enabled(o->source)) {
461 remapped = data->source->reference_volume;
462 pa_cvolume_remap(&remapped, &data->source->channel_map, &data->channel_map);
463 pa_sw_cvolume_multiply(&o->volume, &data->volume, &remapped);
465 o->volume = data->volume;
467 o->volume_factor = data->volume_factor;
468 o->volume_factor_source = data->volume_factor_source;
469 o->real_ratio = o->reference_ratio = data->volume;
472 o->volume_writable = data->volume_writable;
473 o->save_volume = data->save_volume;
474 o->preferred_source = pa_xstrdup(data->preferred_source);
475 o->save_muted = data->save_muted;
477 o->muted = data->muted;
479 o->direct_on_input = data->direct_on_input;
783 * data is actually still unplayed and might hence still
786 * of the queued data is actually still changeable. Hence
961 * have to touch the thread info data directly */
991 * have to touch the thread info data directly */
1072 /* We don't copy the data to the thread_info data. That's left for someone else to do */
1154 old_value = pa_xstrdup("(data)");
1193 old_value_str = "(data)";
1204 new_value_str = "(data)";
1783 void pa_source_output_send_event(pa_source_output *o, const char *event, pa_proplist *data) {
1794 if (!data)
1795 data = pl = pa_proplist_new();
1798 hook_data.data = data;
1804 o->send_event(o, event, data);