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?