diff --git a/ext/mikmod/drv_gst.c b/ext/mikmod/drv_gst.c index a924380c72..5708046289 100644 --- a/ext/mikmod/drv_gst.c +++ b/ext/mikmod/drv_gst.c @@ -40,10 +40,12 @@ static void mikmod_Update( void ) length = VC_WriteBytes((SBYTE *) audiobuffer, buffer_size); outdata = gst_buffer_new(); - + GST_BUFFER_DATA( outdata ) = g_memdup( audiobuffer, length ); GST_BUFFER_SIZE( outdata ) = length; + GST_BUFFER_TIMESTAMP( outdata ) = timestamp; + if ( need_sync == 1 ) { /* FIXME, send a flush event or something */ diff --git a/ext/mikmod/gstmikmod.c b/ext/mikmod/gstmikmod.c index 655427b5fa..04a5eb3123 100644 --- a/ext/mikmod/gstmikmod.c +++ b/ext/mikmod/gstmikmod.c @@ -332,13 +332,15 @@ gst_mikmod_loop (GstElement *element) if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) break; } - - if ( mikmod->Buffer ) { - mikmod->Buffer = gst_buffer_append( mikmod->Buffer, buffer_in ); - gst_buffer_unref( buffer_in ); + else + { + if ( mikmod->Buffer ) { + mikmod->Buffer = gst_buffer_append( mikmod->Buffer, buffer_in ); + gst_buffer_unref( buffer_in ); + } + else + mikmod->Buffer = buffer_in; } - else - mikmod->Buffer = buffer_in; } if ( mikmod->_16bit ) @@ -346,6 +348,8 @@ gst_mikmod_loop (GstElement *element) else mode16bits = 8; + gst_mikmod_setup( mikmod ); + MikMod_RegisterDriver(&drv_gst); MikMod_RegisterAllLoaders(); @@ -373,8 +377,9 @@ gst_mikmod_loop (GstElement *element) do { if ( Player_Active() ) { - drv_gst.Update(); + timestamp = ( module->sngtime / 1024.0 ) * GST_SECOND; + drv_gst.Update(); gst_element_yield (element); } else { @@ -438,7 +443,6 @@ GstMikMod *mikmod; GST_DEBUG (0,"state pending %d", GST_STATE_PENDING (element)); - /* if going down into NULL state, close the file if it's open */ if (GST_STATE_PENDING (element) == GST_STATE_READY) { gst_mikmod_setup(mikmod); @@ -469,7 +473,6 @@ GstMikMod *mikmod; MikMod_Exit(); - /* if we haven't failed already, give the parent class a chance to ;-) */ if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); @@ -611,7 +614,7 @@ plugin_init (GModule *module, GstPlugin *plugin) factory = gst_element_factory_new("mikmod",GST_TYPE_MIKMOD, &mikmod_details); g_return_val_if_fail(factory != NULL, FALSE); - gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY); + gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_SECONDARY); gst_element_factory_add_pad_template (factory, mikmod_src_factory ()); gst_element_factory_add_pad_template (factory, mikmod_sink_factory ()); diff --git a/ext/mikmod/gstmikmod.h b/ext/mikmod/gstmikmod.h index 94d5eed161..686c484a04 100644 --- a/ext/mikmod/gstmikmod.h +++ b/ext/mikmod/gstmikmod.h @@ -76,6 +76,7 @@ typedef struct _GstMikModClass GstMikModClass; MODULE *module; MREADER *reader; GstPad *srcpad; +gint64 timestamp; int need_sync; GType gst_mikmod_get_type(void);