diff options
Diffstat (limited to 'ext/mikmod/gstmikmod.c')
-rw-r--r-- | ext/mikmod/gstmikmod.c | 382 |
1 files changed, 190 insertions, 192 deletions
diff --git a/ext/mikmod/gstmikmod.c b/ext/mikmod/gstmikmod.c index f8a6a4e8..89e057c1 100644 --- a/ext/mikmod/gstmikmod.c +++ b/ext/mikmod/gstmikmod.c @@ -34,12 +34,14 @@ GstElementDetails mikmod_details = { /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SONGNAME, ARG_MODTYPE, @@ -62,68 +64,67 @@ GstPad *srcpad; GstClockTime timestamp; int need_sync; -static GstStaticPadTemplate mikmod_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", +static GstStaticPadTemplate mikmod_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " + GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) { 8000, 11025, 22050, 44100 }, " "channels = (int) [ 1, 2 ]; " - "audio/x-raw-int, " + "audio/x-raw-int, " "signed = (boolean) FALSE, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) { 8000, 11025, 22050, 44100 }, " - "channels = (int) [ 1, 2 ]" - ) -); + "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate mikmod_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mod") -); + ); -static void gst_mikmod_base_init (gpointer g_class); -static void gst_mikmod_class_init (GstMikModClass *klass); -static void gst_mikmod_init (GstMikMod *filter); -static void gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamSpec *pspec ); -static void gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *pspec ); -static GstPadLinkReturn gst_mikmod_srclink (GstPad *pad, const GstCaps *caps); -static GstCaps * gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps); -static void gst_mikmod_loop (GstElement *element); -static gboolean gst_mikmod_setup (GstMikMod *mikmod); -static GstElementStateReturn gst_mikmod_change_state (GstElement *element); +static void gst_mikmod_base_init (gpointer g_class); +static void gst_mikmod_class_init (GstMikModClass * klass); +static void gst_mikmod_init (GstMikMod * filter); +static void gst_mikmod_set_property (GObject * object, guint id, + const GValue * value, GParamSpec * pspec); +static void gst_mikmod_get_property (GObject * object, guint id, GValue * value, + GParamSpec * pspec); +static GstPadLinkReturn gst_mikmod_srclink (GstPad * pad, const GstCaps * caps); +static GstCaps *gst_mikmod_srcfixate (GstPad * pad, const GstCaps * caps); +static void gst_mikmod_loop (GstElement * element); +static gboolean gst_mikmod_setup (GstMikMod * mikmod); +static GstElementStateReturn gst_mikmod_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_mikmod_get_type(void) { +gst_mikmod_get_type (void) +{ static GType mikmod_type = 0; if (!mikmod_type) { static const GTypeInfo mikmod_info = { - sizeof(GstMikModClass), + sizeof (GstMikModClass), gst_mikmod_base_init, NULL, - (GClassInitFunc)gst_mikmod_class_init, + (GClassInitFunc) gst_mikmod_class_init, NULL, NULL, - sizeof(GstMikMod), + sizeof (GstMikMod), 0, - (GInstanceInitFunc)gst_mikmod_init, + (GInstanceInitFunc) gst_mikmod_init, }; - mikmod_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMikmod", &mikmod_info, 0); + mikmod_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMikmod", &mikmod_info, 0); } return mikmod_type; } @@ -141,58 +142,58 @@ gst_mikmod_base_init (gpointer g_class) } static void -gst_mikmod_class_init (GstMikModClass *klass) +gst_mikmod_class_init (GstMikModClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SONGNAME, - g_param_spec_string("songname","songname","songname", - NULL, G_PARAM_READABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MODTYPE, - g_param_spec_string("modtype", "modtype", "modtype", - NULL, G_PARAM_READABLE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MUSICVOLUME, - g_param_spec_int("musicvolume", "musivolume", "musicvolume", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_PANSEP, - g_param_spec_int("pansep", "pansep", "pansep", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_REVERB, - g_param_spec_int("reverb", "reverb", "reverb", - 0, 15, 0, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SNDFXVOLUME, - g_param_spec_int("sndfxvolume", "sndfxvolume", "sndfxvolume", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VOLUME, - g_param_spec_int("volume", "volume", "volume", - 0, 128, 96, G_PARAM_READWRITE )); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_INTERP, - g_param_spec_boolean("interp", "interp", "interp", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_REVERSE, - g_param_spec_boolean("reverse", "reverse", "reverse", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SURROUND, - g_param_spec_boolean("surround", "surround", "surround", - TRUE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HQMIXER, - g_param_spec_boolean("hqmixer", "hqmixer", "hqmixer", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SOFT_MUSIC, - g_param_spec_boolean("soft_music", "soft_music", "soft_music", - TRUE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SOFT_SNDFX, - g_param_spec_boolean("soft_sndfx", "soft_sndfx", "soft_sndfx", - TRUE, G_PARAM_READWRITE )); - - + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SONGNAME, + g_param_spec_string ("songname", "songname", "songname", + NULL, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODTYPE, + g_param_spec_string ("modtype", "modtype", "modtype", + NULL, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUSICVOLUME, + g_param_spec_int ("musicvolume", "musivolume", "musicvolume", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PANSEP, + g_param_spec_int ("pansep", "pansep", "pansep", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_REVERB, + g_param_spec_int ("reverb", "reverb", "reverb", + 0, 15, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SNDFXVOLUME, + g_param_spec_int ("sndfxvolume", "sndfxvolume", "sndfxvolume", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VOLUME, + g_param_spec_int ("volume", "volume", "volume", + 0, 128, 96, G_PARAM_READWRITE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_INTERP, + g_param_spec_boolean ("interp", "interp", "interp", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_REVERSE, + g_param_spec_boolean ("reverse", "reverse", "reverse", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SURROUND, + g_param_spec_boolean ("surround", "surround", "surround", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HQMIXER, + g_param_spec_boolean ("hqmixer", "hqmixer", "hqmixer", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SOFT_MUSIC, + g_param_spec_boolean ("soft_music", "soft_music", "soft_music", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SOFT_SNDFX, + g_param_spec_boolean ("soft_sndfx", "soft_sndfx", "soft_sndfx", + TRUE, G_PARAM_READWRITE)); + + gobject_class->set_property = gst_mikmod_set_property; gobject_class->get_property = gst_mikmod_get_property; @@ -201,52 +202,54 @@ gst_mikmod_class_init (GstMikModClass *klass) static void -gst_mikmod_init (GstMikMod *filter) -{ - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mikmod_sink_factory),"sink"); - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mikmod_src_factory),"src"); - - gst_element_add_pad(GST_ELEMENT(filter),filter->sinkpad); - gst_element_add_pad(GST_ELEMENT(filter),filter->srcpad); +gst_mikmod_init (GstMikMod * filter) +{ + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mikmod_sink_factory), "sink"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mikmod_src_factory), "src"); + + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); gst_pad_set_link_function (filter->srcpad, gst_mikmod_srclink); gst_pad_set_fixate_function (filter->srcpad, gst_mikmod_srcfixate); - + gst_element_set_loop_function (GST_ELEMENT (filter), gst_mikmod_loop); - + filter->Buffer = NULL; - filter->stereo = TRUE; - filter->surround = TRUE; - filter->_16bit = TRUE; - filter->soft_music = TRUE; - filter->soft_sndfx = TRUE; - filter->mixfreq = 44100; - filter->reverb = 0; - filter->pansep = 128; + filter->stereo = TRUE; + filter->surround = TRUE; + filter->_16bit = TRUE; + filter->soft_music = TRUE; + filter->soft_sndfx = TRUE; + filter->mixfreq = 44100; + filter->reverb = 0; + filter->pansep = 128; filter->musicvolume = 128; - filter->volume = 96; + filter->volume = 96; filter->sndfxvolume = 128; - filter->songname = NULL; - filter->modtype = NULL; - + filter->songname = NULL; + filter->modtype = NULL; + filter->initialized = FALSE; } static GstCaps * -gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps) +gst_mikmod_srcfixate (GstPad * pad, const GstCaps * caps) { GstCaps *ret; GstStructure *structure; - + /* FIXME: select est caps here */ if (gst_caps_get_size (caps) > 1) return NULL; ret = gst_caps_copy (caps); structure = gst_caps_get_structure (ret, 0); - + if (gst_caps_structure_fixate_field_nearest_int (structure, "channels", 2)) return ret; if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", 44100)) @@ -257,9 +260,9 @@ gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_mikmod_srclink (GstPad *pad, const GstCaps *caps) +gst_mikmod_srclink (GstPad * pad, const GstCaps * caps) { - GstMikMod *filter; + GstMikMod *filter; GstStructure *structure; gint depth; gint channels; @@ -273,68 +276,69 @@ gst_mikmod_srclink (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "channels", &channels); filter->stereo = (channels == 2); gst_structure_get_int (structure, "rate", &filter->mixfreq); - + return gst_mikmod_setup (filter) ? GST_PAD_LINK_OK : GST_PAD_LINK_REFUSED; } static void -gst_mikmod_loop (GstElement *element) +gst_mikmod_loop (GstElement * element) { GstMikMod *mikmod; GstBuffer *buffer_in; g_return_if_fail (element != NULL); g_return_if_fail (GST_IS_MIKMOD (element)); - + mikmod = GST_MIKMOD (element); srcpad = mikmod->srcpad; mikmod->Buffer = NULL; - + if (!mikmod->initialized) { - while ((buffer_in = GST_BUFFER (gst_pad_pull( mikmod->sinkpad )))) { - if ( GST_IS_EVENT (buffer_in) ) { + 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; + + 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 ); + 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; } } - } - + } + 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_Init(""); - reader = GST_READER_new( mikmod ); - module = Player_LoadGeneric ( reader, 64, 0 ); - + + MikMod_RegisterDriver (&drv_gst); + MikMod_RegisterAllLoaders (); + + MikMod_Init (""); + reader = GST_READER_new (mikmod); + module = Player_LoadGeneric (reader, 64, 0); + gst_buffer_unref (mikmod->Buffer); - - if ( ! Player_Active() ) - Player_Start(module); - + + if (!Player_Active ()) + Player_Start (module); + mikmod->initialized = TRUE; } - if ( Player_Active() ) { - timestamp = ( module->sngtime / 1024.0 ) * GST_SECOND; - drv_gst.Update(); + 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))); @@ -343,7 +347,7 @@ gst_mikmod_loop (GstElement *element) static gboolean -gst_mikmod_setup (GstMikMod *mikmod) +gst_mikmod_setup (GstMikMod * mikmod) { md_musicvolume = mikmod->musicvolume; md_pansep = mikmod->pansep; @@ -354,28 +358,28 @@ gst_mikmod_setup (GstMikMod *mikmod) md_mode = 0; - if ( mikmod->interp ) + if (mikmod->interp) md_mode = md_mode | DMODE_INTERP; - if ( mikmod->reverse ) + if (mikmod->reverse) md_mode = md_mode | DMODE_REVERSE; - if ( mikmod->surround ) + if (mikmod->surround) md_mode = md_mode | DMODE_SURROUND; - if ( mikmod->_16bit ) + if (mikmod->_16bit) md_mode = md_mode | DMODE_16BITS; - if ( mikmod->hqmixer ) + if (mikmod->hqmixer) md_mode = md_mode | DMODE_HQMIXER; - if ( mikmod->soft_music ) + if (mikmod->soft_music) md_mode = md_mode | DMODE_SOFT_MUSIC; - if ( mikmod->soft_sndfx ) + if (mikmod->soft_sndfx) md_mode = md_mode | DMODE_SOFT_SNDFX; - if ( mikmod->stereo ) + if (mikmod->stereo) md_mode = md_mode | DMODE_STEREO; return TRUE; @@ -383,9 +387,9 @@ gst_mikmod_setup (GstMikMod *mikmod) static GstElementStateReturn -gst_mikmod_change_state (GstElement *element) +gst_mikmod_change_state (GstElement * element) { -GstMikMod *mikmod; + GstMikMod *mikmod; g_return_val_if_fail (GST_IS_MIKMOD (element), GST_STATE_FAILURE); @@ -393,35 +397,31 @@ GstMikMod *mikmod; GST_DEBUG ("state pending %d", GST_STATE_PENDING (element)); - if (GST_STATE_PENDING (element) == GST_STATE_READY) - { - gst_mikmod_setup(mikmod); - - if ( Player_Active() ) - { - Player_TogglePause(); - Player_SetPosition( 0 ); - } - mikmod->initialized = FALSE; + if (GST_STATE_PENDING (element) == GST_STATE_READY) { + gst_mikmod_setup (mikmod); + + if (Player_Active ()) { + Player_TogglePause (); + Player_SetPosition (0); + } + mikmod->initialized = FALSE; } - - if (GST_STATE_PENDING (element) == GST_STATE_PLAYING) - { - if ( Player_Active() && Player_Paused() ) - Player_TogglePause(); - else - if ( ! Player_Active() ) - Player_Start(module); - + + if (GST_STATE_PENDING (element) == GST_STATE_PLAYING) { + if (Player_Active () && Player_Paused ()) + Player_TogglePause (); + else if (!Player_Active ()) + Player_Start (module); + } - - if (GST_STATE_PENDING (element) == GST_STATE_PAUSED) - if ( Player_Active() && ! Player_Paused() ) - Player_TogglePause(); - if (GST_STATE_PENDING (element) == GST_STATE_NULL) - MikMod_Exit(); - + if (GST_STATE_PENDING (element) == GST_STATE_PAUSED) + if (Player_Active () && !Player_Paused ()) + Player_TogglePause (); + + if (GST_STATE_PENDING (element) == GST_STATE_NULL) + MikMod_Exit (); + if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); @@ -432,13 +432,14 @@ GstMikMod *mikmod; static void -gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamSpec *pspec ) +gst_mikmod_set_property (GObject * object, guint id, const GValue * value, + GParamSpec * pspec) { GstMikMod *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MIKMOD(object)); - filter = GST_MIKMOD(object); + g_return_if_fail (GST_IS_MIKMOD (object)); + filter = GST_MIKMOD (object); switch (id) { case ARG_SONGNAME: @@ -488,13 +489,14 @@ gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamS } static void -gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *pspec ) +gst_mikmod_get_property (GObject * object, guint id, GValue * value, + GParamSpec * pspec) { GstMikMod *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MIKMOD(object)); - filter = GST_MIKMOD(object); + g_return_if_fail (GST_IS_MIKMOD (object)); + filter = GST_MIKMOD (object); switch (id) { case ARG_MUSICVOLUME: @@ -536,21 +538,17 @@ gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *p } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "mikmod", GST_RANK_SECONDARY, GST_TYPE_MIKMOD)) + if (!gst_element_register (plugin, "mikmod", GST_RANK_SECONDARY, + GST_TYPE_MIKMOD)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mikmod", - "Mikmod plugin library", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mikmod", + "Mikmod plugin library", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) |