From 3faf623b27da04bfdfe343d9dadb5c12d305787c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 9 Mar 2004 21:09:11 +0000 Subject: [PATCH] ext/mikmod/gstmikmod.*: make mikmod's loop function not loop infinitely and call gst_element_yield anymore Original commit message from CVS: * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), (gst_mikmod_change_state): * ext/mikmod/gstmikmod.h: make mikmod's loop function not loop infinitely and call gst_element_yield anymore * gst/modplug/gstmodplug.cc: fix pad negotiation --- ChangeLog | 10 ++++++ ext/mikmod/gstmikmod.c | 89 ++++++++++++++++++++++++-------------------------- ext/mikmod/gstmikmod.h | 2 ++ 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3ce8e95..77e4d67 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-03-09 Benjamin Otte + + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), + (gst_mikmod_change_state): + * ext/mikmod/gstmikmod.h: + make mikmod's loop function not loop infinitely and call + gst_element_yield anymore + * gst/modplug/gstmodplug.cc: + fix pad negotiation + 2004-03-09 David Schleef * ext/lcs/Makefile.am: Fix so that the lcs colorspace plugin diff --git a/ext/mikmod/gstmikmod.c b/ext/mikmod/gstmikmod.c index cec788d..f8a6a4e 100644 --- a/ext/mikmod/gstmikmod.c +++ b/ext/mikmod/gstmikmod.c @@ -230,6 +230,8 @@ gst_mikmod_init (GstMikMod *filter) filter->sndfxvolume = 128; filter->songname = NULL; filter->modtype = NULL; + + filter->initialized = FALSE; } static GstCaps * @@ -288,60 +290,55 @@ gst_mikmod_loop (GstElement *element) srcpad = mikmod->srcpad; mikmod->Buffer = NULL; - while ((buffer_in = GST_BUFFER (gst_pad_pull( mikmod->sinkpad )))) { - if ( GST_IS_EVENT (buffer_in) ) { - GstEvent *event = GST_EVENT (buffer_in); + if (!mikmod->initialized) { + while ((buffer_in = GST_BUFFER (gst_pad_pull( mikmod->sinkpad )))) { + if ( GST_IS_EVENT (buffer_in) ) { + GstEvent *event = GST_EVENT (buffer_in); - if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) - break; - } - else - { - if ( mikmod->Buffer ) { - GstBuffer *merge; - merge = gst_buffer_merge( mikmod->Buffer, buffer_in ); - gst_buffer_unref( buffer_in ); - gst_buffer_unref( mikmod->Buffer ); - mikmod->Buffer = merge; + if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) + break; + } else { + if ( mikmod->Buffer ) { + GstBuffer *merge; + merge = gst_buffer_merge( mikmod->Buffer, buffer_in ); + gst_buffer_unref( buffer_in ); + gst_buffer_unref( mikmod->Buffer ); + mikmod->Buffer = merge; + } else { + mikmod->Buffer = buffer_in; + } } - else - mikmod->Buffer = buffer_in; - } - } + } - if (!GST_PAD_CAPS (mikmod->srcpad)) { - if (GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (mikmod->srcpad))) { - GST_ELEMENT_ERROR (mikmod, CORE, NEGOTIATION, (NULL), (NULL)); - return; + if (!GST_PAD_CAPS (mikmod->srcpad)) { + if (GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (mikmod->srcpad))) { + GST_ELEMENT_ERROR (mikmod, CORE, NEGOTIATION, (NULL), (NULL)); + return; + } } - } - MikMod_RegisterDriver(&drv_gst); - MikMod_RegisterAllLoaders(); + MikMod_RegisterDriver(&drv_gst); + MikMod_RegisterAllLoaders(); - MikMod_Init(""); - reader = GST_READER_new( mikmod ); - module = Player_LoadGeneric ( reader, 64, 0 ); + MikMod_Init(""); + reader = GST_READER_new( mikmod ); + module = Player_LoadGeneric ( reader, 64, 0 ); - gst_buffer_unref (mikmod->Buffer); + gst_buffer_unref (mikmod->Buffer); - if ( ! Player_Active() ) - Player_Start(module); - - do { - if ( Player_Active() ) { - - timestamp = ( module->sngtime / 1024.0 ) * GST_SECOND; - drv_gst.Update(); - gst_element_yield (element); - } - else { - gst_element_set_eos (GST_ELEMENT (mikmod)); - gst_pad_push (mikmod->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); - } + if ( ! Player_Active() ) + Player_Start(module); + + mikmod->initialized = TRUE; + } - } - while ( 1 ); + if ( Player_Active() ) { + timestamp = ( module->sngtime / 1024.0 ) * GST_SECOND; + drv_gst.Update(); + } else { + gst_element_set_eos (GST_ELEMENT (mikmod)); + gst_pad_push (mikmod->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); + } } @@ -405,7 +402,7 @@ GstMikMod *mikmod; Player_TogglePause(); Player_SetPosition( 0 ); } - + mikmod->initialized = FALSE; } if (GST_STATE_PENDING (element) == GST_STATE_PLAYING) diff --git a/ext/mikmod/gstmikmod.h b/ext/mikmod/gstmikmod.h index 42d2dfc..208fc5b 100644 --- a/ext/mikmod/gstmikmod.h +++ b/ext/mikmod/gstmikmod.h @@ -63,6 +63,8 @@ struct _GstMikMod { gboolean soft_music; gboolean soft_sndfx; gboolean stereo; + + gboolean initialized; }; struct _GstMikModClass { -- 2.7.4