midiparse: small fixes

This commit is contained in:
Wim Taymans 2013-03-21 07:21:00 +01:00
parent 10cb1a7a3a
commit a093d65310

View file

@ -21,16 +21,15 @@
/** /**
* SECTION:element-midiparse * SECTION:element-midiparse
* @see_also: timidity, wildmidi * @see_also: fluidsynth
* *
* This element renders midi-files as audio streams using * This element parses midi-files into midi events. You would need a midi
* <ulink url="http://midiparse.sourceforge.net//">MidiParse</ulink>. * renderer such as fluidsynth to convert the events into raw samples.
* It offers better sound quality compared to the timidity or wildmidi element.
* *
* <refsect2> * <refsect2>
* <title>Example pipeline</title> * <title>Example pipeline</title>
* |[ * |[
* gst-launch-1.0 filesrc location=song.mid ! midiparse ! pulsesink * gst-launch-1.0 filesrc location=song.mid ! midiparse ! fluidsynth ! pulsesink
* ]| This example pipeline will parse the midi and render to raw audio which is * ]| This example pipeline will parse the midi and render to raw audio which is
* played via pulseaudio. * played via pulseaudio.
* </refsect2> * </refsect2>
@ -206,7 +205,7 @@ gst_midi_parse_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
break; break;
case GST_QUERY_SEEKING: case GST_QUERY_SEEKING:
gst_query_set_seeking (query, midiparse->segment.format, gst_query_set_seeking (query, midiparse->segment.format,
TRUE, 0, midiparse->segment.duration); FALSE, 0, midiparse->segment.duration);
break; break;
default: default:
res = gst_pad_query_default (pad, parent, query); res = gst_pad_query_default (pad, parent, query);
@ -216,26 +215,6 @@ gst_midi_parse_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
return res; return res;
} }
static GstEvent *
gst_midi_parse_get_new_segment_event (GstMidiParse * midiparse,
GstFormat format)
{
GstSegment *segment, newseg;
GstEvent *event;
segment = &midiparse->segment;
newseg = *segment;
newseg.format = format;
newseg.start = segment->start;
newseg.stop = segment->stop;
newseg.time = segment->time;
event = gst_event_new_segment (&newseg);
return event;
}
static gboolean static gboolean
gst_midi_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_midi_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
{ {
@ -449,7 +428,7 @@ gst_midi_parse_chunk (GstMidiParse * midiparse, guint8 * data, guint size)
if (size < length + 8) if (size < length + 8)
goto short_chunk; goto short_chunk;
type = *((guint32 *) data); type = GST_STR_FOURCC (data);
switch (type) { switch (type) {
case GST_MAKE_FOURCC ('M', 'T', 'h', 'd'): case GST_MAKE_FOURCC ('M', 'T', 'h', 'd'):
@ -504,14 +483,14 @@ gst_midi_parse_parse_song (GstMidiParse * midiparse)
size -= consumed; size -= consumed;
} }
outcaps = gst_caps_copy (gst_pad_get_pad_template_caps (midiparse->srcpad)); outcaps = gst_pad_get_pad_template_caps (midiparse->srcpad);
gst_pad_set_caps (midiparse->srcpad, outcaps); gst_pad_set_caps (midiparse->srcpad, outcaps);
gst_caps_unref (outcaps); gst_caps_unref (outcaps);
gst_segment_init (&midiparse->segment, GST_FORMAT_TIME); gst_segment_init (&midiparse->segment, GST_FORMAT_TIME);
gst_pad_push_event (midiparse->srcpad, gst_pad_push_event (midiparse->srcpad,
gst_midi_parse_get_new_segment_event (midiparse, GST_FORMAT_TIME)); gst_event_new_segment (&midiparse->segment));
GST_DEBUG_OBJECT (midiparse, "Parsing song done"); GST_DEBUG_OBJECT (midiparse, "Parsing song done");
@ -628,11 +607,9 @@ handle_next_event (GstMidiParse * midiparse, GstMidiTrack * track)
GST_LOG_OBJECT (midiparse, "track %p, status 0x%02x", track, status); GST_LOG_OBJECT (midiparse, "track %p, status 0x%02x", track, status);
if ((status & 0x80) == 0) { if ((status & 0x80) == 0) {
if ((track->running_status & 0x80) == 0) { if ((track->running_status & 0x80) == 0)
GST_ERROR_OBJECT (midiparse, goto undefined_status;
"Undefined status and invalid running status");
return GST_FLOW_ERROR;
}
event = track->running_status; event = track->running_status;
} else { } else {
event = status; event = status;
@ -685,6 +662,7 @@ handle_next_event (GstMidiParse * midiparse, GstMidiTrack * track)
GST_BUFFER_PTS (outbuf) = gst_util_uint64_scale (track->position, GST_BUFFER_PTS (outbuf) = gst_util_uint64_scale (track->position,
1000 * midiparse->tempo, midiparse->division); 1000 * midiparse->tempo, midiparse->division);
GST_BUFFER_DTS (outbuf) = GST_BUFFER_PTS (outbuf);
GST_DEBUG_OBJECT (midiparse, "pushing %" GST_TIME_FORMAT, GST_DEBUG_OBJECT (midiparse, "pushing %" GST_TIME_FORMAT,
GST_TIME_ARGS (GST_BUFFER_PTS (outbuf))); GST_TIME_ARGS (GST_BUFFER_PTS (outbuf)));
@ -696,6 +674,13 @@ handle_next_event (GstMidiParse * midiparse, GstMidiTrack * track)
track->running_status = event; track->running_status = event;
return ret; return ret;
/* ERRORS */
undefined_status:
{
GST_ERROR_OBJECT (midiparse, "Undefined status and invalid running status");
return GST_FLOW_ERROR;
}
} }
static GstFlowReturn static GstFlowReturn
@ -728,7 +713,6 @@ gst_midi_parse_do_play (GstMidiParse * midiparse)
midiparse->segment.position = next_position; midiparse->segment.position = next_position;
done: done:
return res; return res;
eos: eos: