summaryrefslogtreecommitdiff
path: root/src/rharchive.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rharchive.c')
-rw-r--r--src/rharchive.c118
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, &micro, &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;