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 void gst_audio_test_src_finalize (GObject * object) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (object); if (src->gen) g_rand_free (src->gen); src->gen = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); }
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; }
static void gst_audio_test_src_src_fixate (GstPad * pad, GstCaps * caps) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (GST_PAD_PARENT (pad)); const gchar *name; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); GST_DEBUG_OBJECT (src, "fixating samplerate to %d", src->samplerate); gst_structure_fixate_field_nearest_int (structure, "rate", src->samplerate); name = gst_structure_get_name (structure); if (strcmp (name, "audio/x-raw-int") == 0) gst_structure_fixate_field_nearest_int (structure, "width", 32); else if (strcmp (name, "audio/x-raw-float") == 0) gst_structure_fixate_field_nearest_int (structure, "width", 64); /* fixate to mono unless downstream requires stereo, for backwards compat */ gst_structure_fixate_field_nearest_int (structure, "channels", 1); }
static GstCaps * gst_audio_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (bsrc); GstStructure *structure; caps = gst_caps_make_writable (caps); structure = gst_caps_get_structure (caps, 0); GST_DEBUG_OBJECT (src, "fixating samplerate to %d", GST_AUDIO_DEF_RATE); gst_structure_fixate_field_nearest_int (structure, "rate", GST_AUDIO_DEF_RATE); gst_structure_fixate_field_string (structure, "format", DEFAULT_FORMAT_STR); /* fixate to mono unless downstream requires stereo, for backwards compat */ gst_structure_fixate_field_nearest_int (structure, "channels", 1); caps = GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps); return caps; }
static gboolean gst_audio_test_src_query (GstBaseSrc * basesrc, GstQuery * query) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (src_fmt == dest_fmt) { dest_val = src_val; goto done; } switch (src_fmt) { case GST_FORMAT_DEFAULT: switch (dest_fmt) { case GST_FORMAT_TIME: /* samples to time */ dest_val = gst_util_uint64_scale_int (src_val, GST_SECOND, src->samplerate); break; default: goto error; } break; case GST_FORMAT_TIME: switch (dest_fmt) { case GST_FORMAT_DEFAULT: /* time to samples */ dest_val = gst_util_uint64_scale_int_round (src_val, src->samplerate, GST_SECOND); break; default: goto error; } break; default: goto error; } done: gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); res = TRUE; break; } default: res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); break; } return res; /* ERROR */ error: { GST_DEBUG_OBJECT (src, "query failed"); return FALSE; } }
static gboolean gst_audio_test_src_query (GstBaseSrc * basesrc, GstQuery * query) { GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (!gst_audio_info_convert (&src->info, src_fmt, src_val, dest_fmt, &dest_val)) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); res = TRUE; break; } case GST_QUERY_SCHEDULING: { /* if we can operate in pull mode */ gst_query_set_scheduling (query, GST_SCHEDULING_FLAG_SEEKABLE, 1, -1, 0); gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH); if (src->can_activate_pull) gst_query_add_scheduling_mode (query, GST_PAD_MODE_PULL); res = TRUE; break; } case GST_QUERY_LATENCY: { if (src->info.rate > 0) { GstClockTime latency; latency = gst_util_uint64_scale (src->generate_samples_per_buffer, GST_SECOND, src->info.rate); gst_query_set_latency (query, gst_base_src_is_live (GST_BASE_SRC_CAST (src)), latency, GST_CLOCK_TIME_NONE); GST_DEBUG_OBJECT (src, "Reporting latency of %" GST_TIME_FORMAT, GST_TIME_ARGS (latency)); res = TRUE; } break; } default: res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); break; } return res; /* ERROR */ error: { GST_DEBUG_OBJECT (src, "query failed"); return FALSE; } }