posted on: 2011-04-20 21:09:46
I made a simple little gst streamer metronome.
>So I started with this blog or more appropriately I started with the code he provided. Then I modified the code to use a time out instead of a call back, voila a metronome.
#include <gst/gst.h> #include <stdbool.h> static GMainLoop *loop; GstElement *pipeline; static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data) { switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: { gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); break; } case GST_MESSAGE_ERROR: { GError *err; gst_message_parse_error(msg, &err, NULL); g_error("%s", err->message); g_error_free(err); g_main_loop_quit(loop); break; } default: break; } return true; } static gboolean play_beat(){ gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); return true; } static void play_uri(const char *uri, float bpm){ GstBus *bus; loop = g_main_loop_new(NULL, FALSE); pipeline = gst_element_factory_make("playbin", "player"); if (uri) g_object_set(G_OBJECT(pipeline), "uri", uri, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); gst_bus_add_watch(bus, bus_call, NULL); gst_object_unref(bus); float rate = 60.0/bpm ; int timeout = (int)(1000*rate); g_message("%d", timeout); g_timeout_add(timeout,play_beat,NULL); g_main_loop_run(loop); gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); } int main(int argc, char *argv[]){ gst_init(&argc, &argv); float bpm = atof(argv[2]); play_uri(argv[1], bpm); return 0; }
Note, I do not use c much.
Comments
create comment?