From 9c6a9f77599117662da8dbdb82ab530ce8c1f07e Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 5 Apr 2017 09:13:37 -0400 Subject: [PATCH] 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 --- core/audio.c | 34 ++++++++++++++++++++++++++++++++-- include/core/audio.h | 1 + tests/core/audio.c | 3 +++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/core/audio.c b/core/audio.c index f20809a4..0ee122c7 100644 --- a/core/audio.c +++ b/core/audio.c @@ -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; diff --git a/include/core/audio.h b/include/core/audio.h index d8827369..f8d2fca6 100644 --- a/include/core/audio.h +++ b/include/core/audio.h @@ -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 */ diff --git a/tests/core/audio.c b/tests/core/audio.c index f69a3e06..08279e60 100644 --- a/tests/core/audio.c +++ b/tests/core/audio.c @@ -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()); }