diff --git a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp index 6e6d477ec2..e0f974a421 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp @@ -74,6 +74,7 @@ struct music_decode cellMusicDecode.notice("set_decode_command(START): context: %s", current_selection_context.to_string()); music_selection_context context = current_selection_context; + context.current_track = context.first_track; for (usz i = 0; i < context.playlist.size(); i++) { diff --git a/rpcs3/util/media_utils.cpp b/rpcs3/util/media_utils.cpp index 2a7a41e2f2..dc68be41a4 100644 --- a/rpcs3/util/media_utils.cpp +++ b/rpcs3/util/media_utils.cpp @@ -465,7 +465,7 @@ namespace utils stop(); } - void audio_decoder::set_context(music_selection_context context) + void audio_decoder::set_context(music_selection_context&& context) { m_context = std::move(context); } @@ -714,8 +714,6 @@ namespace utils return; } - m_context.current_track = m_context.first_track; - if (m_context.context_option == CELL_SEARCH_CONTEXTOPTION_SHUFFLE && m_context.playlist.size() > 1) { // Shuffle once if necessary @@ -740,8 +738,12 @@ namespace utils // Let's only decode one track at a time. Wait for the consumer to finish reading the track. media_log.notice("audio_decoder: waiting until track is consumed..."); - thread_ctrl::wait_on(track_fully_consumed, 0); - track_fully_consumed = false; + + while (thread_ctrl::state() != thread_state::aborting && !track_fully_consumed) + { + thread_ctrl::wait_on(track_fully_consumed, 0); + } + track_fully_consumed = 0; } media_log.notice("audio_decoder: finished playlist"); diff --git a/rpcs3/util/media_utils.h b/rpcs3/util/media_utils.h index 471bda63ae..3c2dab4f05 100644 --- a/rpcs3/util/media_utils.h +++ b/rpcs3/util/media_utils.h @@ -63,7 +63,7 @@ namespace utils audio_decoder(); ~audio_decoder(); - void set_context(music_selection_context context); + void set_context(music_selection_context&& context); void set_swap_endianness(bool swapped); void clear(); void stop();