// g++ `pkg-config gstreamer-0.8 --libs --cflags` playbin.cpp -o playbin

#include <gst/gst.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>

int main(int argc, char *argv[])
{
    gst_init(&argc, &argv);

    double userVolume = 1;

    if(argc == 3)
        userVolume = strtod(argv[2], (char **) argv[2] + strlen(argv[2]));
    else if(argc != 2) {
        std::cout << "Usage: playbin filename [volume]" << std::endl;
        return 1;
    }

    const char *filename = argv[1];

    GstElement *playbin = gst_element_factory_make("playbin", "pipeline");

    GString *uri = g_string_new("file://");

    if(filename[0] != '/') {
        char wd[PATH_MAX];
        g_string_append(uri, getcwd(wd, PATH_MAX));
        g_string_append(uri, "/");
    }

    g_string_append(uri, filename);

    g_object_set(G_OBJECT(playbin), "uri", uri->str, 0);
    g_object_set(G_OBJECT(playbin), "volume", userVolume, 0);

    gst_element_set_state(playbin, GST_STATE_PLAYING);

    gst_main();

    gst_element_set_state(playbin, GST_STATE_NULL);
    gst_object_unref(GST_OBJECT(playbin));

    return 0;
}
