}
static void
+send_flush_events (GstElement * element)
+{
+ gboolean res;
+ GstPad *pad;
+
+ pad = gst_element_get_static_pad (element, "sink");
+ res = gst_pad_send_event (pad, gst_event_new_flush_start ());
+ fail_unless (res, "flush-start even not handledt");
+ res = gst_pad_send_event (pad, gst_event_new_flush_stop (TRUE));
+ fail_unless (res, "flush-stop event not handled");
+ gst_object_unref (pad);
+}
+
+static void
+send_segment_event (GstElement * element)
+{
+ GstSegment segment;
+ gboolean res;
+ GstPad *pad;
+
+ pad = gst_element_get_static_pad (element, "sink");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ res = gst_pad_send_event (pad, gst_event_new_segment (&segment));
+ fail_unless (res, "SEGMENT event not handled");
+ gst_object_unref (pad);
+}
+
+static void
send_eos_event (GstElement * element)
{
GstBus *bus = gst_element_get_bus (element);
GstPad *pad = gst_element_get_static_pad (element, "sink");
- GstEvent *event = gst_event_new_eos ();
+ gboolean res;
- fail_unless (gst_pad_send_event (pad, event),
- "Cannot send EOS event: Not handled.");
+ res = gst_pad_send_event (pad, gst_event_new_eos ());
+ fail_unless (res, "EOS event not handled");
/* There is no sink element, so _we_ post the EOS message on the bus here. Of
* course we generate any EOS ourselves, but this allows us to poll for the
set_playing_state (element);
/* Single track: */
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
/* First album: */
g_object_set (element, "num-tracks", 3, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 2);
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 0);
/* Second album: */
g_object_set (element, "num-tracks", 2, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 0);
/* Single track: */
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 0);
/* No buffer for the first track. */
+ send_segment_event (element);
send_eos_event (element);
/* No tags should be posted, there was nothing to analyze: */
poll_eos (element);
/* A test waveform with known gain result as second track: */
+ send_flush_events (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_mono (&accumulator, 44100, 512,
0.25));
/* No buffer for the last track. */
+ send_flush_events (element);
+ send_segment_event (element);
send_eos_event (element);
tag_list = poll_tags (element);
set_playing_state (element);
/* Single track: */
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0));
send_eos_event (element);
poll_eos (element);
/* First album: */
g_object_set (element, "num-tracks", 2, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0));
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0));
send_eos_event (element);
poll_eos (element);
/* Second album, with a single track: */
g_object_set (element, "num-tracks", 1, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0));
send_eos_event (element);
poll_eos (element);
fail_unless_num_tracks (element, 0);
/* Single track: */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0));
send_eos_event (element);
poll_eos (element);
GstTagList *tag_list;
set_playing_state (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 512, -1.369, 0.0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Swapped channels. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, -1.369));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Mono. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_mono (8000, 512, -1.369));
send_eos_event (element);
tag_list = poll_tags (element);
set_playing_state (element);
/* Half amplitude. */
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 1 << 14, 0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Swapped channels. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 1 << 14));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Mono. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 1 << 14));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Half amplitude, negative variant. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -1 << 14, 0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Swapped channels. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -1 << 14));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Mono. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -1 << 14));
send_eos_event (element);
tag_list = poll_tags (element);
* highest positive amplitude we do not reach 1.0, only for
* -32768! */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 32767, 0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Swapped channels. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 32767));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Mono. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 32767));
send_eos_event (element);
tag_list = poll_tags (element);
/* Negative variant, reaching 1.0. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -32768, 0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Swapped channels. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -32768));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
/* Mono. */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -32768));
send_eos_event (element);
tag_list = poll_tags (element);
g_object_set (element, "num-tracks", 2, NULL);
set_playing_state (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5));
send_eos_event (element);
tag_list = poll_tags (element);
/* Try a second album: */
g_object_set (element, "num-tracks", 3, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.4, 0.4));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
fail_unless_num_tracks (element, 2);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.45, 0.45));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.2, 0.2));
send_eos_event (element);
tag_list = poll_tags (element);
/* And now a single track, not in album mode (num-tracks is 0
* now): */
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.1, 0.1));
send_eos_event (element);
tag_list = poll_tags (element);
set_playing_state (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_mono (8000, 1024, 1.0));
send_eos_event (element);
tag_list = poll_tags (element);
gst_tag_list_free (tag_list);
g_object_set (element, "num-tracks", 1, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_mono (8000, 1024, 0.5));
send_eos_event (element);
tag_list = poll_tags (element);
g_object_set (element, "num-tracks", 2, NULL);
set_playing_state (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0));
send_eos_event (element);
tag_list = poll_tags (element);
g_object_set (element, "num-tracks", 0, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5));
send_eos_event (element);
tag_list = poll_tags (element);
/* The three tracks are constructed such that if any of these is in fact
* ignored for the album gain, the album gain will differ. */
-
+ send_segment_event (element);
accumulator = 0;
for (i = 8; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
fail_if_album_tags (tag_list);
gst_tag_list_free (tag_list);
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 12; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
fail_if_album_tags (tag_list);
gst_tag_list_free (tag_list);
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 180; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
g_object_set (element, "forced", FALSE, NULL);
set_playing_state (element);
+ send_segment_event (element);
tag_list = gst_tag_list_new_empty ();
/* Provided values are totally arbitrary. */
gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
/* Now back to a track without tags. */
+ send_flush_events (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
0.25, 0.25));
g_object_set (element, "forced", FALSE, NULL);
set_playing_state (element);
+ send_segment_event (element);
tag_list = gst_tag_list_new_empty ();
gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_GAIN, 2.21,
NULL);
poll_eos (element);
/* Now a track without tags. */
-
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
g_object_set (element, "forced", FALSE, NULL);
set_playing_state (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_const_float_stereo (8000, 512, 0.5, 0.5));
send_eos_event (element);
poll_eos (element);
+ send_flush_events (element);
+ send_segment_event (element);
/* Now back to a normal track, this one has no tags: */
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25,
g_object_set (element, "forced", FALSE, NULL);
set_playing_state (element);
+ send_segment_event (element);
tag_list = gst_tag_list_new_empty ();
/* Provided values are totally arbitrary. */
gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
/* Now an album without tags. */
g_object_set (element, "num-tracks", 2, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
gst_tag_list_free (tag_list);
fail_unless_num_tracks (element, 1);
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL);
set_playing_state (element);
+ send_segment_event (element);
tag_list = gst_tag_list_new_empty ();
/* Provided values are totally arbitrary. */
gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
/* This track has no tags, but needs to be skipped anyways since we
* are in album processing mode. */
+ send_flush_events (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0));
send_eos_event (element);
fail_unless_num_tracks (element, 0);
/* Normal track after the album. Of course not to be skipped. */
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25,
g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL);
set_playing_state (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25,
0.25));
/* The second track has indeed full tags, but although being not forced, this
* one has to be processed because album processing is on. */
+ send_flush_events (element);
+ send_segment_event (element);
tag_list = gst_tag_list_new_empty ();
/* Provided values are totally arbitrary. */
gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL);
set_playing_state (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25,
0.25));
/* Disabling album processing before end of album: */
g_object_set (element, "num-tracks", 0, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
+
/* Processing a track that has to be skipped. */
tag_list = gst_tag_list_new_empty ();
/* Provided values are totally arbitrary. */
set_playing_state (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
0.25, 0.25));
g_object_set (element, "reference-level", 83., "num-tracks", 2, NULL);
+ send_flush_events (element);
+ send_segment_event (element);
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
0.25, 0.25));
"Incorrect reference level tag");
gst_tag_list_free (tag_list);
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (i = 20; i--;)
push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512,
set_playing_state (element);
for (i = G_N_ELEMENTS (supported_rates); i--;) {
+ send_flush_events (element);
+ send_segment_event (element);
accumulator = 0;
for (j = 0; j < 4; j++)
push_buffer (test_buffer_square_float_stereo (&accumulator,