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:
parent
1182e55df9
commit
9c6a9f7759
34
core/audio.c
34
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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue