+ wavpackdec->sample_rate = WavpackGetSampleRate (wavpackdec->context);
+ wavpackdec->channels = WavpackGetNumChannels (wavpackdec->context);
+ wavpackdec->width = WavpackGetBitsPerSample (wavpackdec->context);
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ "rate", G_TYPE_INT, wavpackdec->sample_rate,
+ "channels", G_TYPE_INT, wavpackdec->channels,
+ "depth", G_TYPE_INT, wavpackdec->width,
+ "width", G_TYPE_INT, wavpackdec->width,
+ "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
+ "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+
+ if (!gst_pad_set_caps (wavpackdec->srcpad, caps)) {
+ gst_caps_unref (caps);
+ WavpackCloseFile (wavpackdec->context);
+ wavpackdec->context = NULL;
+ gst_buffer_unref (buf);
+ if (cbuf) {
+ gst_buffer_unref (cbuf);
+ }
+ /* FIXME: use the right error */
+ GST_ELEMENT_ERROR (wavpackdec, LIBRARY, INIT, (NULL),
+ ("Couldn't set caps on source pad: %" GST_PTR_FORMAT, caps));
+ return GST_FLOW_ERROR;
+ }
+ gst_caps_unref (caps);
+ gst_pad_use_fixed_caps (wavpackdec->srcpad);
+ }
+
+ g_assert (wavpackdec->context);
+ unpack_buf =
+ (int32_t *) g_malloc (sizeof (int32_t) * wph.block_samples *
+ wavpackdec->channels);
+ unpacked_sample_count =
+ WavpackUnpackSamples (wavpackdec->context, unpack_buf, wph.block_samples);
+ g_assert (unpacked_sample_count == wph.block_samples);
+
+ ret =
+ gst_pad_alloc_buffer_and_set_caps (wavpackdec->srcpad,
+ GST_BUFFER_OFFSET (buf),
+ wph.block_samples * ((wavpackdec->width +
+ 7) >> 3) * wavpackdec->channels,
+ GST_PAD_CAPS (wavpackdec->srcpad), &outbuf);
+
+ if (GST_FLOW_IS_FATAL (ret)) {
+ WavpackCloseFile (wavpackdec->context);
+ wavpackdec->context = NULL;
+ g_free (unpack_buf);
+ gst_buffer_unref (buf);
+ if (cbuf) {
+ gst_buffer_unref (cbuf);
+ }
+ return ret;
+ } else if (ret != GST_FLOW_OK) {
+ g_free (unpack_buf);
+ gst_buffer_unref (buf);
+ if (cbuf) {
+ gst_buffer_unref (cbuf);
+ }
+ return ret;
+ }
+
+ gst_wavpack_dec_format_samples (wavpackdec, GST_BUFFER_DATA (outbuf),
+ unpack_buf, wph.block_samples);
+ g_free (unpack_buf);
+ gst_buffer_stamp (outbuf, buf);