if (!pa_sink_input_may_move_to(i, dest))
return -PA_ERR_NOTSUPPORTED;
+ if (!pa_format_info_is_pcm(i->format) && !pa_sink_check_format(dest, i->format)) {
+ /* FIXME: Fire a message here so the client can renegotiate */
+ return -PA_ERR_NOTSUPPORTED;
+ }
+
if (i->thread_info.resampler &&
pa_sample_spec_equal(pa_resampler_output_sample_spec(i->thread_info.resampler), &dest->sample_spec) &&
pa_channel_map_equal(pa_resampler_output_channel_map(i->thread_info.resampler), &dest->channel_map))
}
/* Called from the main thread */
+/* Checks if the sink can accept this format */
+pa_bool_t pa_sink_check_format(pa_sink *s, pa_format_info *f)
+{
+ pa_idxset *sink_formats = NULL;
+ pa_format_info *f_sink;
+ uint32_t i;
+ pa_bool_t ret = FALSE;
+
+ pa_assert(s);
+ pa_assert(f);
+
+ sink_formats = pa_sink_get_formats(s);
+
+ PA_IDXSET_FOREACH(f_sink, sink_formats, i) {
+ if (pa_format_info_is_compatible(f_sink, f)) {
+ ret = TRUE;
+ break;
+ }
+ }
+
+ if (sink_formats)
+ pa_idxset_free(sink_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
+
+ return ret;
+}
+
+/* Called from the main thread */
/* Calculates the intersection between formats supported by the sink and
* in_formats, and returns these, in the order of the sink's formats. */
pa_idxset* pa_sink_check_formats(pa_sink *s, pa_idxset *in_formats) {
void pa_sink_move_all_fail(pa_queue *q);
pa_idxset* pa_sink_get_formats(pa_sink *s);
+pa_bool_t pa_sink_check_format(pa_sink *s, pa_format_info *f);
pa_idxset* pa_sink_check_formats(pa_sink *s, pa_idxset *in_formats);
/*** To be called exclusively by the sink driver, from IO context */