gst: Begin reworking gst driver

I removed the need for an overridden constructor and destructor.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2014-12-20 10:45:40 -05:00
parent e866ea2574
commit 882da67480
1 changed files with 34 additions and 52 deletions

View File

@ -5,9 +5,22 @@
#include <core/driver.h> #include <core/driver.h>
#include <gst/gst.h> #include <gst/gst.h>
class GSTDriver;
static GSTDriver *gst_driver; static GstBus *gst_bus;
static GstElement *gst_player;
bool gst_change_state(GstState state)
{
GstStateChangeReturn ret = gst_element_set_state(gst_player, state);
switch (ret) {
case GST_STATE_CHANGE_SUCCESS:
case GST_STATE_CHANGE_ASYNC:
return true;
default:
return false;
}
}
/** /**
@ -19,21 +32,9 @@ static GSTDriver *gst_driver;
class GSTDriver : public Driver class GSTDriver : public Driver
{ {
private: private:
GstElement *player;
std::string cur_file; std::string cur_file;
bool change_state(GstState state);
public: public:
/**
* GStreamer audio driver constructor.
*/
GSTDriver(int *, char ***);
/**
* GStreamer audio driver destructor.
*/
~GSTDriver();
/** /**
* Called to initialize the GStreamer audio driver. * Called to initialize the GStreamer audio driver.
* @param eos_cb End-of-stream callback function. * @param eos_cb End-of-stream callback function.
@ -91,6 +92,7 @@ public:
void on_message(GstMessage *); void on_message(GstMessage *);
}; };
static GSTDriver *gst_driver;
static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data) static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data)
{ {
@ -111,35 +113,6 @@ static void parse_gst_error(GstMessage *error, const std::string filepath)
g_free(debug); g_free(debug);
} }
GSTDriver :: GSTDriver(int *argc, char ***argv)
: Driver()
{
GstBus *bus;
gst_init(argc, argv);
player = gst_element_factory_make("playbin", "ocarina_player");
bus = gst_pipeline_get_bus(GST_PIPELINE(player));
gst_bus_add_watch(bus, on_gst_message, this);
}
GSTDriver :: ~GSTDriver()
{
change_state(GST_STATE_NULL);
gst_deinit();
}
bool GSTDriver :: change_state(GstState state)
{
GstStateChangeReturn ret = gst_element_set_state(player, state);
switch (ret) {
case GST_STATE_CHANGE_SUCCESS:
case GST_STATE_CHANGE_ASYNC:
return true;
default:
return false;
}
}
void GSTDriver :: init(void (*eos_cb)()) void GSTDriver :: init(void (*eos_cb)())
{ {
on_eos = eos_cb; on_eos = eos_cb;
@ -150,38 +123,38 @@ void GSTDriver :: load(const std::string &filepath)
gchar *uri; gchar *uri;
cur_file = filepath; cur_file = filepath;
change_state(GST_STATE_NULL); gst_change_state(GST_STATE_NULL);
uri = gst_filename_to_uri(filepath.c_str(), NULL); uri = gst_filename_to_uri(filepath.c_str(), NULL);
g_object_set(G_OBJECT(player), "uri", uri, NULL); g_object_set(G_OBJECT(gst_player), "uri", uri, NULL);
g_free(uri); g_free(uri);
} }
bool GSTDriver :: play() bool GSTDriver :: play()
{ {
return change_state(GST_STATE_PLAYING); return gst_change_state(GST_STATE_PLAYING);
} }
bool GSTDriver :: pause() bool GSTDriver :: pause()
{ {
return change_state(GST_STATE_PAUSED); return gst_change_state(GST_STATE_PAUSED);
} }
bool GSTDriver :: is_playing() bool GSTDriver :: is_playing()
{ {
GstState state; GstState state;
gst_element_get_state(player, &state, NULL, GST_CLOCK_TIME_NONE); gst_element_get_state(gst_player, &state, NULL, GST_CLOCK_TIME_NONE);
return state == GST_STATE_PLAYING; return state == GST_STATE_PLAYING;
} }
void GSTDriver :: seek_to(long offset) void GSTDriver :: seek_to(long offset)
{ {
gst_element_seek_simple(player, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, offset); gst_element_seek_simple(gst_player, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, offset);
} }
long GSTDriver :: position() long GSTDriver :: position()
{ {
long position; long position;
if (gst_element_query_position(player, GST_FORMAT_TIME, &position)) if (gst_element_query_position(gst_player, GST_FORMAT_TIME, &position))
return position; return position;
return 0; return 0;
} }
@ -190,7 +163,7 @@ long GSTDriver :: duration()
{ {
long duration; long duration;
if (gst_element_query_duration(player, GST_FORMAT_TIME, &duration)) if (gst_element_query_duration(gst_player, GST_FORMAT_TIME, &duration))
return duration; return duration;
return 0; return 0;
} }
@ -213,10 +186,19 @@ void GSTDriver :: on_message(GstMessage *message)
void init_gst(int *argc, char ***argv) void init_gst(int *argc, char ***argv)
{ {
gst_driver = new GSTDriver(argc, argv); gst_init(argc, argv);
gst_player = gst_element_factory_make("playbin", "ocarina_player");
gst_bus = gst_pipeline_get_bus(GST_PIPELINE(gst_player));
gst_driver = new GSTDriver();
gst_bus_add_watch(gst_bus, on_gst_message, gst_driver);
} }
void quit_gst() void quit_gst()
{ {
delete gst_driver; delete gst_driver;
gst_change_state(GST_STATE_NULL);
gst_deinit();
} }