diff options
author | Christian Pointner <equinox@helsinki.at> | 2011-02-15 13:35:30 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2011-02-15 13:35:30 (GMT) |
commit | 4d0498e4a7533307241a807cac6de1eb0c56ba18 (patch) | |
tree | ac41ad38882bf1597e9e2675f6313a13073eccda /src/rharchive.c | |
parent | cef04da3c24cdcf1c1ffeb214c74f6ef0aaaa0ad (diff) |
first gstreamer pipeline
Diffstat (limited to 'src/rharchive.c')
-rw-r--r-- | src/rharchive.c | 118 |
1 files changed, 93 insertions, 25 deletions
diff --git a/src/rharchive.c b/src/rharchive.c index 0c92b5c..36743e2 100644 --- a/src/rharchive.c +++ b/src/rharchive.c @@ -31,44 +31,99 @@ #include <string.h> #include <sys/select.h> +#include <gst/gst.h> + #include "datatypes.h" #include "options.h" #include "string_list.h" #include "log.h" #include "daemon.h" + + +static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop *)data; + + switch (GST_MESSAGE_TYPE(msg)) { + case GST_MESSAGE_EOS: { + log_printf(NOTICE, "End of stream"); // thread safety... + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_ERROR: { + gchar *debug; + GError *error; + + gst_message_parse_error(msg, &error, &debug); + g_free(debug); + log_printf(ERROR, "%s", error->message); // thread safety... + g_error_free(error); + g_main_loop_quit(loop); + break; + } + default: + break; + } + return TRUE; +} + + +static void on_pad_added (GstElement *element, GstPad *pad, gpointer data) +{ + GstPad *sinkpad; + GstElement *decoder = (GstElement *)data; + + log_printf(INFO, "Dynamic pad created, linking demuxer/decoder"); // thread safety... + sinkpad = gst_element_get_static_pad(decoder, "sink"); + gst_pad_link(pad, sinkpad); + gst_object_unref(sinkpad); +} + int main_loop(options_t* opt) { log_printf(INFO, "entering main loop"); - int sig_fd = signal_init(); - if(sig_fd < 0) - return -1; - - int return_value = 0; - while(!return_value) { - fd_set readfds, writefds; - FD_ZERO(&readfds); - FD_ZERO(&writefds); - FD_SET(sig_fd, &readfds); - int nfds = sig_fd; - int ret = select(nfds + 1, &readfds, &writefds, NULL, NULL); - if(ret == -1 && errno != EINTR) { - log_printf(ERROR, "select returned with error: %s", strerror(errno)); - return_value = -1; - break; - } - if(!ret || ret == -1) - continue; + GMainLoop *loop; - if(FD_ISSET(sig_fd, &readfds)) { - return_value = signal_handle(); - if(return_value == 1) break; - } + GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink; + GstBus *bus; + + loop = g_main_loop_new (NULL, FALSE); + + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "file-source"); + demuxer = gst_element_factory_make("oggdemux", "ogg-demuxer"); + decoder = gst_element_factory_make("vorbisdec", "vorbis-decoder"); + conv = gst_element_factory_make("audioconvert", "converter"); + sink = gst_element_factory_make("autoaudiosink", "audio-output"); + + if(!pipeline || !source || !demuxer || !decoder || !conv || !sink) { + log_printf(ERROR, "One element could not be created. Exiting."); + return -1; } + g_object_set(G_OBJECT(source), "location", "file.ogg", NULL); + + bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); + gst_bus_add_watch(bus, bus_call, loop); + gst_object_unref(bus); - signal_stop(); - return return_value; + gst_bin_add_many(GST_BIN(pipeline), source, demuxer, decoder, conv, sink, NULL); + + gst_element_link(source, demuxer); + gst_element_link_many(decoder, conv, sink, NULL); + g_signal_connect(demuxer, "pad-added", G_CALLBACK(on_pad_added), decoder); + + log_printf(INFO, "Set State: Playing"); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + g_main_loop_run (loop); + + log_printf(INFO, "Stopping pipeline"); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (pipeline)); + + return 0; } int main(int argc, char* argv[]) @@ -160,6 +215,18 @@ int main(int argc, char* argv[]) fclose(pid_file); } + gst_init(NULL, NULL); + const gchar *nano_str; + guint major, minor, micro, nano; + gst_version(&major, &minor, µ, &nano); + if (nano == 1) + nano_str = "(CVS)"; + else if (nano == 2) + nano_str = "(Prerelease)"; + else + nano_str = ""; + log_printf(NOTICE, "rharchive linked against GStreamer %d.%d.%d %s", major, minor, micro, nano_str); + ret = main_loop(&opt); options_clear(&opt); @@ -171,6 +238,7 @@ int main(int argc, char* argv[]) else log_printf(NOTICE, "shutdown after signal"); + gst_deinit(); log_close(); return ret; |