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

Name: