diff --git a/gst/monkeyaudio/Makefile.am b/gst/monkeyaudio/Makefile.am index cbf95be130..d63f237e4a 100644 --- a/gst/monkeyaudio/Makefile.am +++ b/gst/monkeyaudio/Makefile.am @@ -18,8 +18,5 @@ noinst_HEADERS = gstmonkeyaudio.h gstmonkeydec.h monkey_io.h gstmonkeyenc.h # I appreciate any help into fixing this mess definitively # I suspect a libtool bug, because in the end it doesn't even *use* the .c # file; my libtool version when seeing this bug was 1.4.2 -#gstmonkeyaudio.c: gstmonkeyaudio.cc -# cp $(srcdir)/gstmonkeyaudio.cc gstmonkeyaudio.c - -#monkeyaudio_types.c: monkeyaudio_types.cc -# cp $(srcdir)/monkeyaudio_types.cc monkeyaudio_types.c +gstmonkeyaudio.c: gstmonkeyaudio.cc + cp $(srcdir)/gstmonkeyaudio.cc gstmonkeyaudio.c diff --git a/gst/monkeyaudio/gstmonkeyaudio.cc b/gst/monkeyaudio/gstmonkeyaudio.cc index 6f81be644c..1ccea2532d 100644 --- a/gst/monkeyaudio/gstmonkeyaudio.cc +++ b/gst/monkeyaudio/gstmonkeyaudio.cc @@ -122,7 +122,7 @@ plugin_init (GModule * module, GstPlugin * plugin) /* register sink pads */ monkeyenc_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - wav_caps, NULL); + raw_caps, NULL); gst_element_factory_add_pad_template (monkey_enc, monkeyenc_sink_template); diff --git a/gst/monkeyaudio/gstmonkeyenc.cc b/gst/monkeyaudio/gstmonkeyenc.cc index 9d5797d6c2..44ff452ca8 100644 --- a/gst/monkeyaudio/gstmonkeyenc.cc +++ b/gst/monkeyaudio/gstmonkeyenc.cc @@ -45,12 +45,15 @@ enum }; -static void gst_monkeyenc_class_init (GstMonkeyEncClass *klass); -static void gst_monkeyenc_init (GstMonkeyEnc *monkeyenc); -static void gst_monkeyenc_loop (GstElement *element); +static void gst_monkeyenc_class_init (GstMonkeyEncClass *klass); +static void gst_monkeyenc_init (GstMonkeyEnc *monkeyenc); +static void gst_monkeyenc_chain (GstPad *pad, GstBuffer *buffer); +static void gst_monkeyenc_handle_event (GstPad *pad, GstBuffer *buffer); +static GstPadLinkReturn + gst_monkeyenc_sinklink (GstPad *pad, GstCaps *caps); static GstElementStateReturn - gst_monkeyenc_change_state (GstElement *element); + gst_monkeyenc_change_state (GstElement *element); static GstElementClass *parent_class = NULL; @@ -90,7 +93,7 @@ gst_monkeyenc_class_init (GstMonkeyEncClass *klass) parent_class = GST_ELEMENT_CLASS( g_type_class_ref(GST_TYPE_ELEMENT)); } -/* + static GstPadLinkReturn gst_monkeyenc_sinklink (GstPad *pad, GstCaps *caps) { @@ -105,10 +108,9 @@ gst_monkeyenc_sinklink (GstPad *pad, GstCaps *caps) gst_caps_get_int (caps, "rate", &monkeyenc->rate); gst_caps_get_int (caps, "depth", &monkeyenc->depth); - monkeyenc->linked = TRUE; - return GST_PAD_LINK_OK; -}*/ +} + static void gst_monkeyenc_init (GstMonkeyEnc * monkeyenc) @@ -119,54 +121,55 @@ gst_monkeyenc_init (GstMonkeyEnc * monkeyenc) monkeyenc->srcpad = gst_pad_new_from_template (monkeyenc_src_template, "src"); gst_element_add_pad (GST_ELEMENT (monkeyenc), monkeyenc->srcpad); - /*gst_pad_set_link_function (monkeyenc->sinkpad, gst_monkeyenc_sinklink);*/ + gst_pad_set_link_function (monkeyenc->sinkpad, gst_monkeyenc_sinklink); - gst_element_set_loop_function (GST_ELEMENT (monkeyenc), gst_monkeyenc_loop); - - monkeyenc->linked = FALSE; + gst_pad_set_chain_function (monkeyenc->sinkpad, gst_monkeyenc_chain); } static void -gst_monkeyenc_loop (GstElement *element) +gst_monkeyenc_handle_event (GstPad *pad, GstBuffer *buffer) +{ + GstEvent *event = GST_EVENT (buffer); + + switch (GST_EVENT_TYPE (event)) + { + default: + gst_pad_event_default (pad, event); + break; + } + + return; +} + +static void +gst_monkeyenc_chain (GstPad *pad, GstBuffer *buffer) { GstMonkeyEnc *monkeyenc; - gint retval, size; + gint retval; + - g_return_if_fail (element != NULL); - g_return_if_fail (GST_IS_MONKEYENC (element)); - - monkeyenc = GST_MONKEYENC (element); - + monkeyenc = GST_MONKEYENC (gst_pad_get_parent (pad)); + g_return_if_fail (GST_IS_MONKEYENC (monkeyenc)); + + /* handle events */ + if (GST_IS_EVENT (buffer)) + { + gst_monkeyenc_handle_event (pad, buffer); + return; + } + if (!GST_PAD_IS_USABLE (monkeyenc->srcpad)) return; if (monkeyenc->init) { - unsigned char *wav_header; - monkeyenc->src_io = new srcpad_CIO; monkeyenc->src_io->Open(""); - monkeyenc->src_io->srcpad = monkeyenc->srcpad; + monkeyenc->src_io->srcpad = monkeyenc->srcpad; - monkeyenc->sink_io = new sinkpad_CIO; - monkeyenc->sink_io->sinkpad = monkeyenc->sinkpad; - monkeyenc->sink_io->bs = gst_bytestream_new (monkeyenc->sinkpad); - if (monkeyenc->sink_io->bs == NULL) - { - gst_element_error(element, "Failed to initiliaze bytestream from sinkpad"); - return; - } - - monkeyenc->inputsrc = new CWAVInputSource (monkeyenc->sink_io, &(monkeyenc->waveformatex), &(monkeyenc->total_blocks), - &(monkeyenc->header_size), &(monkeyenc->terminating), &retval); - - monkeyenc->audiobytes = monkeyenc->total_blocks * monkeyenc->waveformatex.nBlockAlign; - monkeyenc->audiobytesleft = monkeyenc->audiobytes; - - wav_header = (unsigned char*) g_malloc0 (monkeyenc->header_size); - retval = monkeyenc->inputsrc->GetHeaderData (wav_header); - + FillWaveFormatEx(&monkeyenc->waveformatex, monkeyenc->rate, monkeyenc->depth, monkeyenc->channels); + monkeyenc->compress_engine = CreateIAPECompress (&retval); if (monkeyenc->compress_engine == NULL) @@ -175,30 +178,15 @@ gst_monkeyenc_loop (GstElement *element) return; } - retval = monkeyenc->compress_engine->StartEx (monkeyenc->src_io, &(monkeyenc->waveformatex), monkeyenc->audiobytes, - COMPRESSION_LEVEL_NORMAL, wav_header, monkeyenc->header_size); + retval = monkeyenc->compress_engine->StartEx (monkeyenc->src_io, &(monkeyenc->waveformatex), MAX_AUDIO_BYTES_UNKNOWN, + COMPRESSION_LEVEL_NORMAL, NULL, CREATE_WAV_HEADER_ON_DECOMPRESSION); + monkeyenc->init = FALSE; } - retval = monkeyenc->compress_engine->AddDataFromInputSource (monkeyenc->inputsrc, monkeyenc->audiobytesleft, &size); - monkeyenc->audiobytesleft -= size; - - if (monkeyenc->audiobytesleft <= 0) - { - unsigned char *terminating_data; - - terminating_data = (unsigned char *) g_malloc0 (monkeyenc->terminating); - retval = monkeyenc->inputsrc->GetTerminatingData (terminating_data); - - retval = monkeyenc->compress_engine->Finish (terminating_data, monkeyenc->terminating, monkeyenc->terminating); - - monkeyenc->sink_io->SetEOF(); - monkeyenc->src_io->SetEOF(); - monkeyenc->sink_io->Close(); - gst_element_set_eos (element); - } -} - + retval = monkeyenc->compress_engine->AddData ((unsigned char *)GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + monkeyenc->audiobytesleft -= GST_BUFFER_SIZE (buffer); +} static GstElementStateReturn @@ -218,6 +206,7 @@ gst_monkeyenc_change_state (GstElement *element) /* do something to get out of the chain function faster */ break; case GST_STATE_PLAYING_TO_PAUSED: + monkeyenc->compress_engine->Finish (NULL, 0, 0); break; case GST_STATE_PAUSED_TO_READY: break; diff --git a/gst/monkeyaudio/gstmonkeyenc.h b/gst/monkeyaudio/gstmonkeyenc.h index 89a54895cb..2638eab661 100644 --- a/gst/monkeyaudio/gstmonkeyenc.h +++ b/gst/monkeyaudio/gstmonkeyenc.h @@ -58,20 +58,13 @@ struct _GstMonkeyEnc gint channels; gint rate; gint depth; - gboolean linked; gint total_blocks; - gint header_size; - gint terminating; guint64 audiobytes; guint64 audiobytesleft; IAPECompress *compress_engine; WAVEFORMATEX waveformatex; - WAVE_HEADER pWAVHeader; srcpad_CIO *src_io; - sinkpad_CIO *sink_io; - CWAVInputSource *inputsrc; - }; struct _GstMonkeyEncClass