diff --git a/core/audio.cpp b/core/audio.cpp index e4831ecc..f633b221 100644 --- a/core/audio.cpp +++ b/core/audio.cpp @@ -100,6 +100,15 @@ void audio_init(int *argc, char ***argv) } } +void audio_deinit() +{ + gst_element_set_state(audio_player, GST_STATE_NULL); + gst_object_unref(audio_player); + audio_player = NULL; + + gst_deinit(); +} + void audio :: play() { if (cur_track) diff --git a/core/core.cpp b/core/core.cpp index 4d73f82b..8dc74954 100644 --- a/core/core.cpp +++ b/core/core.cpp @@ -26,6 +26,7 @@ void core :: init(int *argc, char ***argv, struct core_init_data *init) void core :: deinit() { + audio_deinit(); tempq_deinit(); history_deinit(); collection_deinit(); diff --git a/gui/gst.cpp b/gui/gst.cpp index 344b0e45..98b06f62 100644 --- a/gui/gst.cpp +++ b/gui/gst.cpp @@ -271,6 +271,4 @@ void gst :: init() void gst :: quit() { delete gst_driver; - gst_change_state(GST_STATE_NULL); - gst_deinit(); } diff --git a/include/core/audio.h b/include/core/audio.h index c266da7f..5c806822 100644 --- a/include/core/audio.h +++ b/include/core/audio.h @@ -158,6 +158,9 @@ namespace audio /* Called to initialize the audio manager. */ void audio_init(int *, char ***); +/* Called to deinitialize the audio manager. */ +void audio_deinit(); + GstElement *audio_get_player(); #endif /* OCARINA_CORE_AUDIO_H */ diff --git a/tests/core/audio.cpp b/tests/core/audio.cpp index ede3ec66..fe81027b 100644 --- a/tests/core/audio.cpp +++ b/tests/core/audio.cpp @@ -57,8 +57,14 @@ static void test_init() test_equal(audio :: current_track(), NULL); test_not_equal(audio_get_player(), NULL); +} +static void test_deinit() +{ core :: deinit(); + + test_equal(audio :: current_track(), NULL); + test_equal(audio_get_player(), NULL); } @@ -206,6 +212,7 @@ void test_autopause() DECLARE_UNIT_TESTS( UNIT_TEST("Audio Initialization", test_init), + UNIT_TEST("Audio Deinitialization", test_deinit), UNIT_TEST("Test Audio Pre-Init", test_pre_init), UNIT_TEST("Test Audio Init 2", test_init2), UNIT_TEST("Test Audio Playback Controls", test_playback_controls),