mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:16:13 +00:00
midiparse: small fixes
This commit is contained in:
parent
10cb1a7a3a
commit
a093d65310
1 changed files with 19 additions and 35 deletions
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue