diff -r 4a7fac7dd34a -r 2a0f36a70380 gstreamer_test_apps/QtGSTPlayer/record_play.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_test_apps/QtGSTPlayer/record_play.c Mon May 03 12:47:24 2010 +0300 @@ -0,0 +1,855 @@ + + +#include +#include +#include +#include "record_play.h" + + +GstElement *bin; +extern int mCurrentState; + +static GstElement * +create_video_output () +{ + static gboolean have_video = FALSE; + GstBin *bin; + GstElement *queue, *sink; + GstPad *pad; + + if (have_video) { + //g_print ("Already playing a video stream. Ignoring this one\n"); + return NULL; + } + + /* create a new bin to hold the elements */ + if((bin = (GstBin*) gst_bin_new (NULL)) == NULL) + //bin = (GstBin*) gst_pipeline_new("pipeline"); + return NULL; + + /* Queue to ensure all streams can push data */ + queue = gst_element_factory_make ("queue", "q"); + if(queue == NULL) + return NULL;/* Queue should always be available */ + /* Set the queue to buffer 1/10 of a second of raw video */ + g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10, + "max-size-bytes", 0, "max-size-buffers", 0, NULL); + +// cs = gst_element_factory_make ("ffmpegcolorspace", "cs"); +// if (!cs) +// goto no_output; + + /* and a video sink */ + sink = gst_element_factory_make ("fakesink"/*autovideosink*/, "sink"); + if (!sink) + goto no_output; + + /* add objects to the main pipeline */ + gst_bin_add_many (GST_BIN (bin), queue, sink, NULL); + + /* Link the elements */ + gst_element_link_many (queue, sink, NULL); + + /* Retrieve the sinkpad from the queue and 'ghost' it onto + * the bin so that the caller can find it generically */ + pad = gst_element_get_pad (queue, "sink"); + gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad)); + gst_object_unref (pad); + + //have_video = TRUE; + + return GST_ELEMENT (bin); + + /* ERRORS */ +no_output: + { + //g_print ("Could not create either ffmpegcolorspace or autovideosink for output"); + return NULL; + } +} + +static GstElement * +create_audio_output () +{ + static gboolean have_audio = FALSE; + GstBin *bin; + GstElement *queue, *audioconvert,*audioresample, *sink; + GstPad *pad; + + if (have_audio) { + //g_print ("Already playing an audio stream. Ignoring this one\n"); + return NULL; + } + + /* create a new bin to hold the elements */ + bin = (GstBin*) gst_bin_new (NULL); + if(!bin) + goto no_output; + + /* Queue to ensure all streams can push data */ + queue = gst_element_factory_make ("queue", "q"); + if (!queue) /* Queue should always be available */ + goto no_output; + /* Set the queue to buffer 1/10 of a second of raw audio */ + g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10, + "max-size-bytes", 0, "max-size-buffers", 0, NULL); + + /* an audio converter to convert floating-point audio samples to int format */ + audioconvert = gst_element_factory_make ("audioconvert", "ac"); + if (!audioconvert) + goto no_output; + + /* an audio converter to convert floating-point audio samples to int format */ + audioresample = gst_element_factory_make ("audioresample", "audioresample"); + if (!audioresample) + goto no_output; + + /* and an audio sink */ + sink = gst_element_factory_make ("autoaudiosink", "sink"); + if (!sink) + goto no_output; + + /* add objects to the bin */ + gst_bin_add_many (GST_BIN (bin), queue, audioconvert,audioresample, sink, NULL); + + /* link the elements */ + gst_element_link_many (queue, audioconvert,audioresample, sink, NULL); + + /* Retrieve the sinkpad from the queue element and 'ghost' it onto + * the bin so that the caller can find it generically */ + pad = gst_element_get_pad (queue, "sink"); + gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad)); + gst_object_unref (pad); + + //have_audio = TRUE; + + return GST_ELEMENT (bin); + + /* ERRORS */ +no_output: + { + //g_print ("Could not create either ffmpegcolorspace or autovideosink for output"); + return NULL; + } +} + +static void +new_decoded_pad (GstElement * element, GstPad * pad, gboolean last, + GstBin *top_pipeline) +{ + GstPad *out_pad; + GstElement *output = NULL; + GstCaps *caps; + GstStructure *s; + const gchar *stream_type; + + /* Decide which output we are creating based on the stream contents */ + caps = gst_pad_get_caps (pad); + if (caps == NULL) { + //g_print ("Decodebin produced an unknown stream - ignoring\n"); + return; + } + + s = gst_caps_get_structure (caps, 0); + if(s == NULL)/* Caps on a pad should always have exactly one entry */ + return; + + stream_type = gst_structure_get_name (s); + + if (g_str_has_prefix (stream_type, "video/x-raw-")) { + /* Is a new video stream */ + //g_print ("Encountered a new video stream\n"); + output = create_video_output (); + } + else if (g_str_has_prefix (stream_type, "audio/x-raw-")) { + //g_print ("Encountered a new audio stream\n"); + output = create_audio_output (); + } + else { + //g_print ("Found unknown stream of type %s - ignoring\n", stream_type); + } + + /* If no renderer was created, ignore this stream */ + if (output == NULL) + return; + + /* Add the output into our pipeline */ + gst_bin_add (top_pipeline, output); + + /* If we created a output pipeline, retrieve the sink pad from it */ + out_pad = gst_element_get_pad (output, "sink"); + g_return_if_fail (out_pad != NULL); + + /* Attempt to link the new pad to the output */ + if (gst_pad_link (pad, out_pad) != GST_PAD_LINK_OK) { + //g_print ("Failed to add the rendering pipeline for this new data stream\n"); + gst_bin_remove (top_pipeline, output); + gst_object_unref (out_pad); + return; + } + gst_object_unref (out_pad); + + /* New output renderer is successfully linked in the pipeline. + * Change its state to playing so it is ready to receive data */ + gst_element_set_state (output, GST_STATE_PLAYING); +} + +static void +print_tag (const GstTagList * list, const gchar * tag, gpointer unused) +{ + gint i, count; + + count = gst_tag_list_get_tag_size (list, tag); + + for (i = 0; i < count; i++) { + gchar *str; + + if (gst_tag_get_type (tag) == G_TYPE_STRING) { + if (!gst_tag_list_get_string_index (list, tag, i, &str)) + g_assert_not_reached (); + } else { + str = + g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i)); + } + + if (i == 0) { + //g_print (" %15s: %s\n", gst_tag_get_nick (tag), str); + } else { + //g_print (" : %s\n", str); + } + + g_free (str); + } +} + + + +static gboolean +bus_call (GstBus *bus, + GstMessage *message, + gpointer data) +{ + switch (GST_MESSAGE_TYPE (message)){ + case GST_MESSAGE_EOS: + gst_message_unref (message); + gst_element_set_state (bin, GST_STATE_NULL); + /* Unreffing the bin will clean up all its children too */ + gst_object_unref (bin); + mCurrentState = NONE; + break; + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + gst_element_set_state (bin, GST_STATE_NULL); + /* Unreffing the bin will clean up all its children too */ + gst_object_unref (bin); + mCurrentState = NONE; + break; + } + case GST_MESSAGE_WARNING:{ + GError *gerror; + gchar *debug; + + gst_message_parse_warning (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + break; + } + case GST_MESSAGE_TAG: + { + GstTagList *tags; + + gst_message_parse_tag (message, &tags); + if (tags) { + //g_print ("TAGS received from element \"%s\".\n", + // GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)))); + + gst_tag_list_foreach (tags, print_tag, NULL); + gst_tag_list_free (tags); + tags = NULL; + } + break; + } + default: + gst_message_unref (message); + break; + } + return TRUE; +} + + + +//static void +//event_loop (GstElement * pipe) +//{ +// GstBus *bus; +// GstMessage *message = NULL; +// +// bus = gst_element_get_bus (GST_ELEMENT (pipe)); +// +// while (TRUE) { +// message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1); +// +// g_assert (message != NULL); +// +// switch (message->type) { +// case GST_MESSAGE_EOS: +// gst_message_unref (message); +// return; +// case GST_MESSAGE_ERROR:{ +// GError *gerror; +// gchar *debug; +// +// gst_message_parse_error (message, &gerror, &debug); +// gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); +// gst_message_unref (message); +// g_error_free (gerror); +// g_free (debug); +// return; +// } +// case GST_MESSAGE_WARNING:{ +// GError *gerror; +// gchar *debug; +// +// gst_message_parse_warning (message, &gerror, &debug); +// gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); +// gst_message_unref (message); +// g_error_free (gerror); +// g_free (debug); +// break; +// } +// case GST_MESSAGE_TAG: +// { +// GstTagList *tags; +// +// gst_message_parse_tag (message, &tags); +// if (tags) { +// //g_print ("TAGS received from element \"%s\".\n", +// GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)))); +// +// gst_tag_list_foreach (tags, print_tag, NULL); +// gst_tag_list_free (tags); +// tags = NULL; +// } +// break; +// } +// default: +// gst_message_unref (message); +// break; +// } +// } +//} + +int +gst_play_file (const char* file) +{ + GstElement *filesrc, *decodebin, *sink; + GstCaps* caps; + //int length = strlen( file ); + //gst_init (&argc, &argv); + + if (file == NULL) { + //g_print ("file is not present"); + goto no_output; + } + + //g_print ("Constructing pipeline\n"); + + /* create a new bin to hold the elements */ + bin = gst_pipeline_new ("pipeline"); + if(!bin) + goto no_output; + + /* create a disk reader */ + filesrc = gst_element_factory_make ("filesrc", "disk_source"); + if(!filesrc) + goto no_output; + + g_object_set (G_OBJECT (filesrc), "location", file, NULL); + + if( g_str_has_suffix (file, "raw") ) + { + sink = gst_element_factory_make ("devsoundsink", "sink"); + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL); + + gst_element_link_filtered (filesrc, sink, caps); + } + else if( g_str_has_suffix (file, "g711") ) + { + sink = gst_element_factory_make ("devsoundsink", "sink"); + caps = gst_caps_new_simple ("audio/x-alaw", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL); + + gst_element_link_filtered (filesrc, sink, caps); + } + else if( g_str_has_suffix (file, "g729") ) + { + sink = gst_element_factory_make ("devsoundsink", "sink"); + caps = gst_caps_new_simple ("audio/g729", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL); + + gst_element_link_filtered (filesrc, sink, caps); + } + else if( g_str_has_suffix (file, "ilbc") ) + { + sink = gst_element_factory_make ("devsoundsink", "sink"); + + caps = gst_caps_new_simple ("audio/ilbc", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + + gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL); + + gst_element_link_filtered (filesrc, sink, caps); + } + else if( g_str_has_suffix (file, "amr") ) + { + sink = gst_element_factory_make ("devsoundsink", "sink"); + caps = gst_caps_new_simple ("audio/amr", + "width", G_TYPE_INT, 8, + "depth", G_TYPE_INT, 8, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL); + + //gst_element_link (source, sink); + gst_element_link_filtered (filesrc, sink, caps); + } + + else + { + /* Create the decodebin */ + decodebin = gst_element_factory_make ("decodebin", NULL); + if (!decodebin) { + //g_print ("could not find the \"decodebin\" element\n"); + return -1; + } + + /* add objects to the main pipeline */ + gst_bin_add_many (GST_BIN (bin), filesrc, decodebin, NULL); + + /* link the elements. */ + gst_element_link_many (filesrc, decodebin, NULL); + + /* Connect to decodebin's 'new-decoded-pad' signal to detect when it produces + * a new stream */ + g_signal_connect (G_OBJECT (decodebin), "new-decoded-pad", + G_CALLBACK (new_decoded_pad), bin); + } + + gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL); + //g_print ("Starting playback\n"); + /* start playing */ + gst_element_set_state (bin, GST_STATE_PLAYING); + return 0; + +no_output: + return -1; + +} + + +int +gst_record_file (int type) +{ + GstElement *audiosrc, *filesink; + char* carray = NULL; + GstCaps* caps; + //g_print ("Constructing pipeline\n"); + + /* switch case for recording type*/ + switch( type ) + { + case RECORD_RAW: + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + + carray = "c:\\data\\sounds\\Digital\\record.raw"; + break; + + case RECORD_AMR: + { + return gst_record_amr(); + } + break; + + case RECORD_G711: + + caps = gst_caps_new_simple ("audio/x-alaw", + "width", G_TYPE_INT, 8, + "depth", G_TYPE_INT, 8, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + + carray = "c:\\data\\sounds\\Digital\\record.g711"; + break; + + case RECORD_G729: // + + caps = gst_caps_new_simple ("audio/g729", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + + carray = "c:\\data\\sounds\\Digital\\record.g729"; + break; + + case RECORD_ILBC: // + + caps = gst_caps_new_simple ("audio/ilbc", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + + carray = "c:\\data\\sounds\\Digital\\record.ilbc"; + break; + case RECORD_WAV: + { + return gst_record_wav(); + } + break; + case RECORD_AAC: + { + return gst_record_aac(); + } + break; + default: + return -1; + break; + } + /* create a new bin to hold the elements */ + bin = gst_pipeline_new ("pipeline"); + if(!bin) + goto no_output; + + /* create a disk reader */ + audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source"); + if(!audiosrc) + goto no_output; + + /* Create the decodebin */ + filesink = gst_element_factory_make ("filesink", NULL); + if(!filesink) + goto no_output; + + g_object_set (G_OBJECT (audiosrc), + "blocksize", 1280, + NULL); + + g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL); + + /* add objects to the main pipeline */ + gst_bin_add_many (GST_BIN (bin), audiosrc, filesink, NULL); + + /* link the elements. */ + gst_element_link_filtered (audiosrc, filesink, caps); + //gst_element_link_many (audiosrc, filesink, NULL); + gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL); + + //g_print ("Starting recoring\n"); + /* start playing */ + gst_element_set_state (bin, GST_STATE_PLAYING); + + /* Run event loop listening for bus messages until EOS or ERROR */ + //event_loop (bin); + +// //g_print ("Finished playback - stopping pipeline\n"); +// +// /* stop the bin */ +// gst_element_set_state (bin, GST_STATE_NULL); +// +// /* Unreffing the bin will clean up all its children too */ +// gst_object_unref (bin); +// + return 0; +no_output: + return -1; + +} + + +int +gst_record_wav () +{ + GstElement *audiosrc, *filesink, *wavenc; + char* carray = NULL; + GstCaps* caps; + + //g_print ("Constructing pipeline\n"); + + /* create a new bin to hold the elements */ + bin = gst_pipeline_new ("pipeline"); + if(!bin) + goto no_output; + + /* create a disk reader */ + audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source"); + if(!audiosrc) + goto no_output; + + /* Create the decodebin */ + filesink = gst_element_factory_make ("filesink", NULL); + if(!filesink) + goto no_output; + + wavenc = gst_element_factory_make ("wavenc", NULL); + if(!wavenc) + goto no_output; + + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 16000, + "channels", G_TYPE_INT, 1, NULL); + + carray = "c:\\data\\sounds\\Digital\\record.wav"; + + g_object_set (G_OBJECT (audiosrc), + "blocksize", 1280, + NULL); + + g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL); + + /* add objects to the main pipeline */ + gst_bin_add_many (GST_BIN (bin), audiosrc,wavenc, filesink, NULL); + + /* link the elements. */ + gst_element_link_filtered (audiosrc, wavenc, caps); + gst_element_link (wavenc, filesink); + gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL); + //g_print ("Starting recoring\n"); + /* start playing */ + gst_element_set_state (bin, GST_STATE_PLAYING); + + return 0; + +no_output: + return -1; +} + +int gst_pause() +{ + gst_element_set_state (bin, GST_STATE_PAUSED); + return 0; +} + +int gst_resume() +{ + gst_element_set_state (bin, GST_STATE_PLAYING); + return 0; +} + + +int gst_record_stop() +{ + gst_element_send_event (bin, gst_event_new_eos ()); + //gst_element_set_state (bin, GST_STATE_NULL); + return 0; +} + + +int gst_seek() +{ +// need to implement.. +} + +int gst_get_events() +{ + return g_main_context_iteration(NULL, FALSE); + //return 0; +} + +int gst_unref() +{ + //g_print ("Finished playback - stopping pipeline\n"); + /* stop the bin */ + gst_element_set_state (bin, GST_STATE_NULL); + /* Unreffing the bin will clean up all its children too */ + gst_object_unref (bin); + return 0; +} + +int gst_record_aac() +{ + GstElement *audiosrc,*filesink,*aacenc, *mp4mux; + GstBus *bus; + GstPad *mp4sinkpad,*aacencsrcpad; + char* carray = NULL; + GstCaps* caps; + + /*create a pipeline*/ + bin = gst_pipeline_new ("pipeline"); + if(!bin) + goto no_output; + /* create a disk reader */ + audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source"); + if(!audiosrc) + goto no_output; + + /* Create the decodebin */ + filesink = gst_element_factory_make ("filesink", NULL); + if(!filesink) + goto no_output; + //setting num-buffers + //g_object_set (G_OBJECT (audiosrc), "num-buffers", 5000 , NULL); + g_object_set (G_OBJECT (audiosrc), + "blocksize", 1280, + NULL); + + aacenc = gst_element_factory_make("nokiaaacenc", "nokiaaacenc"); + if(!aacenc) + goto no_output; + mp4mux = gst_element_factory_make("mp4mux", "mp4mux"); + if(!mp4mux) + goto no_output; + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + carray = "c:\\data\\sounds\\Digital\\record.mp4"; + + + g_object_set(G_OBJECT (filesink), "location", carray, NULL); + bus = gst_pipeline_get_bus(GST_PIPELINE (bin)); + + gst_bus_add_watch(bus, bus_call, NULL); + + gst_object_unref(bus); + + + //add objects to the main pipeline + gst_bin_add_many(GST_BIN (bin),audiosrc,aacenc,mp4mux,filesink, NULL); + + gst_element_link_filtered (audiosrc, aacenc, caps); + + mp4sinkpad = gst_element_get_request_pad( mp4mux, "audio_%d"); + + aacencsrcpad = gst_element_get_pad( aacenc, "src"); + if (gst_pad_link (aacencsrcpad,mp4sinkpad) != GST_PAD_LINK_OK) { + + g_print("gst_pad_link (aacencsrcpad,mp4sinkpad) failed"); + + return -1; + } + //gst_element_link (aacenc, filesink); + gst_element_link (mp4mux, filesink); + + gst_caps_unref (caps); + + + gst_element_set_state(bin, GST_STATE_PLAYING); + + return 0; +no_output: + return -1; +} + +int gst_record_amr() +{ + GstElement *audiosrc, *filesink, *amrmux; + GstBus *bus; + char* carray = NULL; + GstCaps* caps; + /* create a new bin to hold the elements */ + bin = gst_pipeline_new ("pipeline"); + if(!bin) + goto no_output; + //g_print ("pipeline created"); + audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source"); + // encoder = gst_element_factory_make ("wavenc", NULL); + if(!audiosrc) + goto no_output; + + amrmux = gst_element_factory_make ("amrmux", "muxer"); + if(!amrmux) + goto no_output; + + filesink = gst_element_factory_make("filesink", "filesink"); + if(!filesink) + goto no_output; + + caps = gst_caps_new_simple ("audio/amr", + "width", G_TYPE_INT, 8, + "depth", G_TYPE_INT, 8, + "signed",G_TYPE_BOOLEAN, TRUE, + "endianness",G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 1, NULL); + carray = "c:\\data\\sounds\\Digital\\record.amr"; + + g_object_set (G_OBJECT (audiosrc), + "blocksize", 1280, + NULL); + + g_object_set(G_OBJECT (filesink), "location", carray, NULL); + + bus = gst_pipeline_get_bus (GST_PIPELINE (bin)); + gst_bus_add_watch (bus, bus_call, NULL); + gst_object_unref (bus); + + + /* add objects to the main pipeline */ + gst_bin_add_many(GST_BIN (bin),audiosrc,amrmux,filesink , NULL); + /* link the elements */ + gst_element_link_filtered (audiosrc, amrmux, caps); + + gst_element_link( amrmux, filesink ); + + gst_element_set_state (bin, GST_STATE_PLAYING); + + return 0; +no_output: + return -1; + +}