diff --git a/src/audio_core/audio_in_manager.cpp b/src/audio_core/audio_in_manager.cpp index 52caae654d..bea07e1258 100644 --- a/src/audio_core/audio_in_manager.cpp +++ b/src/audio_core/audio_in_manager.cpp @@ -44,7 +44,7 @@ void Manager::ReleaseSessionId(Core::System& system, const size_t session_id) { Result Manager::LinkToManager(Core::System& system) { std::scoped_lock l{mutex}; if (!linked_to_manager) { - system.AudioCore().GetAudioManager().SetInManager(&Manager::BufferReleaseAndRegister); + system.AudioCore().GetAudioManager().SetInManager(this, &Manager::BufferReleaseAndRegister); linked_to_manager = true; } diff --git a/src/audio_core/audio_manager.cpp b/src/audio_core/audio_manager.cpp index f64943ef7b..bcbbf009ea 100644 --- a/src/audio_core/audio_manager.cpp +++ b/src/audio_core/audio_manager.cpp @@ -25,7 +25,7 @@ AudioManager::AudioManager(Core::System& system) { const auto event_type = Event::Type(i); if (events.CheckAudioEventSet(event_type) || timed_out) { if (buffer_events[i]) { - buffer_events[i](this, system); + buffer_events[i](buffer_data[i], system); } } events.SetAudioEvent(event_type, false); @@ -42,12 +42,13 @@ void AudioManager::Shutdown() { } } -Result AudioManager::SetOutManager(BufferEventFunc buffer_func) { +Result AudioManager::SetOutManager(void *data, BufferEventFunc buffer_func) { if (thread.joinable()) { std::scoped_lock l{lock}; const auto index{events.GetManagerIndex(Event::Type::AudioOutManager)}; if (buffer_events[index] == nullptr) { buffer_events[index] = std::move(buffer_func); + buffer_data[index] = data; needs_update = true; events.SetAudioEvent(Event::Type::AudioOutManager, true); } @@ -56,12 +57,13 @@ Result AudioManager::SetOutManager(BufferEventFunc buffer_func) { return Service::Audio::ResultOperationFailed; } -Result AudioManager::SetInManager(BufferEventFunc buffer_func) { +Result AudioManager::SetInManager(void *data, BufferEventFunc buffer_func) { if (thread.joinable()) { std::scoped_lock l{lock}; const auto index{events.GetManagerIndex(Event::Type::AudioInManager)}; if (buffer_events[index] == nullptr) { buffer_events[index] = std::move(buffer_func); + buffer_data[index] = data; needs_update = true; events.SetAudioEvent(Event::Type::AudioInManager, true); } diff --git a/src/audio_core/audio_manager.h b/src/audio_core/audio_manager.h index 6a7fdb230e..d763d901bd 100644 --- a/src/audio_core/audio_manager.h +++ b/src/audio_core/audio_manager.h @@ -47,21 +47,15 @@ public: */ void Shutdown(); - /** - * Register the out manager, keeping a function to be called when the out event is signalled. - * - * @param buffer_func - Function to be called on signal. - * @return Result code. - */ - Result SetOutManager(BufferEventFunc buffer_func); + /// Register the out manager, keeping a function to be called when the out event is signalled. + /// @param buffer_func - Function to be called on signal. + /// @return Result code. + Result SetOutManager(void *data, BufferEventFunc buffer_func); - /** - * Register the in manager, keeping a function to be called when the in event is signalled. - * - * @param buffer_func - Function to be called on signal. - * @return Result code. - */ - Result SetInManager(BufferEventFunc buffer_func); + /// Register the in manager, keeping a function to be called when the in event is signalled. + /// @param buffer_func - Function to be called on signal. + /// @return Result code. + Result SetInManager(void *data, BufferEventFunc buffer_func); /** * Set an event to signalled, and signal the thread. @@ -76,8 +70,9 @@ private: bool needs_update{}; /// Events to be set and signalled Event events{}; - /// Callbacks for each manager + /// Callbacks (and user data) for each manager std::array buffer_events{}; + std::array buffer_data{}; /// General lock std::mutex lock{}; /// Main thread for waiting and callbacks diff --git a/src/audio_core/audio_out_manager.cpp b/src/audio_core/audio_out_manager.cpp index 138d3d80ec..165ffec51d 100644 --- a/src/audio_core/audio_out_manager.cpp +++ b/src/audio_core/audio_out_manager.cpp @@ -43,7 +43,7 @@ void Manager::ReleaseSessionId(Core::System& system, const size_t session_id) { Result Manager::LinkToManager(Core::System& system) { std::scoped_lock l{mutex}; if (!linked_to_manager) { - system.AudioCore().GetAudioManager().SetOutManager(&Manager::BufferReleaseAndRegister); + system.AudioCore().GetAudioManager().SetOutManager(this, &Manager::BufferReleaseAndRegister); linked_to_manager = true; } @@ -51,18 +51,15 @@ Result Manager::LinkToManager(Core::System& system) { } void Manager::Start(Core::System& system) { - if (sessions_started) { - return; - } - - std::scoped_lock l{mutex}; - for (auto& session : sessions) { - if (session) { - session->StartSession(); + if (!sessions_started) { + std::scoped_lock l{mutex}; + for (auto& session : sessions) { + if (session) { + session->StartSession(); + } } + sessions_started = true; } - - sessions_started = true; } void Manager::BufferReleaseAndRegister(void *data, Core::System& system) noexcept {