core/audio: Add gstreamer elements for decoding files

We only play local music, so we know that we're using a file and we
don't need a uridecodebin to figure it out for us.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2017-04-05 09:13:37 -04:00
parent 1182e55df9
commit 9c6a9f7759
3 changed files with 36 additions and 2 deletions

View File

@ -16,6 +16,11 @@ static int audio_pause_count = -1;
static GstElement *audio_player = NULL;
static guint audio_old_id = 0;
static GstElement *audio_pipeline = NULL;
static GstElement *audio_source = NULL;
static GstElement *audio_decoder = NULL;
static guint audio_bus_id = 0;
static struct audio_callbacks *audio_cb = NULL;
@ -41,6 +46,9 @@ static void __audio_gst_load(struct track *track, GstState state)
audio_track = track;
gst_element_set_state(audio_player, GST_STATE_NULL);
g_object_set(G_OBJECT(audio_player), "uri", uri, NULL);
g_object_set(G_OBJECT(audio_source), "location", path, NULL);
__audio_change_state(state);
if (audio_cb)
@ -125,6 +133,16 @@ void audio_init(int *argc, char ***argv, struct audio_callbacks *callbacks)
audio_old_id = gst_bus_add_watch(bus, __audio_message, NULL);
gst_object_unref(bus);
audio_pipeline = gst_pipeline_new("pipeline");
audio_source = gst_element_factory_make("filesrc", "source");
audio_decoder = gst_element_factory_make("decodebin", "decoder");
bus = gst_pipeline_get_bus(GST_PIPELINE(audio_pipeline));
audio_bus_id = gst_bus_add_watch(bus, __audio_message, NULL);
gst_bin_add_many(GST_BIN(audio_pipeline), audio_source, audio_decoder, NULL);
gst_element_link(audio_source, audio_decoder);
gst_object_unref(bus);
if (settings_has(SETTINGS_VOLUME))
volume = settings_get(SETTINGS_VOLUME);
audio_set_volume(volume);
@ -138,8 +156,15 @@ void audio_deinit()
gst_object_unref(GST_ELEMENT(audio_player));
g_source_remove(audio_old_id);
audio_player = NULL;
audio_track = NULL;
gst_element_set_state(audio_pipeline, GST_STATE_NULL);
gst_object_unref(GST_ELEMENT(audio_pipeline));
g_source_remove(audio_bus_id);
audio_player = NULL;
audio_pipeline = NULL;
audio_source = NULL;
audio_decoder = NULL;
audio_track = NULL;
gst_deinit();
}
@ -293,6 +318,11 @@ void audio_pause_after(int n)
}
#ifdef CONFIG_TESTING
GstElement *test_audio_pipeline()
{
return audio_pipeline;
}
GstElement *test_old_player()
{
return audio_player;

View File

@ -82,6 +82,7 @@ void audio_error(GstMessage *);
void audio_pause_after(int);
#ifdef CONFIG_TESTING
GstElement *test_audio_pipeline();
GstElement *test_old_player();
#endif /* CONFIG_TESTING */
#endif /* OCARINA_CORE_AUDIO_H */

View File

@ -47,6 +47,7 @@ static struct audio_callbacks test_audio_cb = {
static void test_init()
{
g_assert_null(test_audio_pipeline());
g_assert_null(test_old_player());
g_assert_null(audio_cur_track());
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_NULL);
@ -73,6 +74,7 @@ static void test_init()
while (idle_run_task()) {};
g_assert_null(audio_cur_track());
g_assert_nonnull(test_audio_pipeline());
g_assert_nonnull(test_old_player());
}
@ -236,6 +238,7 @@ static void test_deinit()
{
core_deinit();
g_assert_null(audio_cur_track());
g_assert_null(test_audio_pipeline());
g_assert_null(test_old_player());
}