diff --git a/include/music.h b/include/music.h index 2e746fd..2d3c06e 100644 --- a/include/music.h +++ b/include/music.h @@ -42,9 +42,11 @@ typedef struct { float mix[12]; u8 buf_pos; long data_read; - volatile bool stop; char *filebuf; u32 filesize; + + volatile bool stop; + Handle finished; } audio_s; void play_audio(audio_s *); diff --git a/source/main.c b/source/main.c index 0c9590d..1efeec4 100644 --- a/source/main.c +++ b/source/main.c @@ -136,6 +136,11 @@ void free_lists(void) void exit_function(bool power_pressed) { + if (audio) + { + audio->stop = true; + svcWaitSynchronization(audio->finished, U64_MAX); + } free_lists(); svcCloseHandle(update_icons_handle); exit_screens(); @@ -461,7 +466,11 @@ int main(void) { preview_mode = false; if(current_mode == MODE_THEMES && audio) + { audio->stop = true; + svcWaitSynchronization(audio->finished, U64_MAX); + audio = NULL; + } } continue; } @@ -469,7 +478,11 @@ int main(void) { preview_mode = false; if(current_mode == MODE_THEMES && audio) + { audio->stop = true; + svcWaitSynchronization(audio->finished, U64_MAX); + audio = NULL; + } continue; } } diff --git a/source/music.c b/source/music.c index 785485d..3dcc480 100644 --- a/source/music.c +++ b/source/music.c @@ -30,6 +30,8 @@ // Play a given audio struct Result update_audio(audio_s *audio) { + svcCreateEvent(&audio->finished, RESET_STICKY); + long size = audio->wave_buf[audio->buf_pos].nsamples * 4 - audio->data_read; char size_info[50] = {0}; sprintf(size_info, "Audio Size: %ld\n", size); @@ -70,6 +72,7 @@ void thread_audio(void* data) { while(!audio->stop) { update_audio(audio); } + svcSignalEvent(audio->finished); free(audio->filebuf); free(audio); }