static gboolean gst_audio_test_src_setcaps (GstBaseSrc * basesrc, GstCaps * caps) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc); GstAudioInfo info; if (!gst_audio_info_from_caps (&info, caps)) goto invalid_caps; GST_DEBUG_OBJECT (src, "negotiated to caps %" GST_PTR_FORMAT, caps); src->info = info; gst_base_src_set_blocksize (basesrc, GST_AUDIO_INFO_BPF (&info) * src->samples_per_buffer); gst_audio_test_src_change_wave (src); return TRUE; /* ERROR */ invalid_caps: { GST_ERROR_OBJECT (basesrc, "received invalid caps"); return FALSE; } }
static gboolean gst_audio_test_src_setcaps (GstBaseSrc * basesrc, GstCaps * caps) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc); const GstStructure *structure; const gchar *name; gint width; gboolean ret; structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &src->samplerate); GST_DEBUG_OBJECT (src, "negotiated to samplerate %d", src->samplerate); name = gst_structure_get_name (structure); if (strcmp (name, "audio/x-raw-int") == 0) { ret &= gst_structure_get_int (structure, "width", &width); src->format = (width == 32) ? GST_AUDIO_TEST_SRC_FORMAT_S32 : GST_AUDIO_TEST_SRC_FORMAT_S16; } else { ret &= gst_structure_get_int (structure, "width", &width); src->format = (width == 32) ? GST_AUDIO_TEST_SRC_FORMAT_F32 : GST_AUDIO_TEST_SRC_FORMAT_F64; } /* allocate a new buffer suitable for this pad */ switch (src->format) { case GST_AUDIO_TEST_SRC_FORMAT_S16: src->sample_size = sizeof (gint16); break; case GST_AUDIO_TEST_SRC_FORMAT_S32: src->sample_size = sizeof (gint32); break; case GST_AUDIO_TEST_SRC_FORMAT_F32: src->sample_size = sizeof (gfloat); break; case GST_AUDIO_TEST_SRC_FORMAT_F64: src->sample_size = sizeof (gdouble); break; default: /* can't really happen */ ret = FALSE; break; } ret &= gst_structure_get_int (structure, "channels", &src->channels); GST_DEBUG_OBJECT (src, "negotiated to %d channels", src->channels); gst_audio_test_src_change_wave (src); return ret; }