Browse Source

2026-09-09 16:05:11

Signed-off-by: lizzie <lizzie@eden-emu.dev>
lizzie/inline-audio-structure-parent-refs
lizzie 1 day ago
parent
commit
7b7608999c
  1. 2
      src/audio_core/audio_in_manager.cpp
  2. 8
      src/audio_core/audio_manager.cpp
  3. 25
      src/audio_core/audio_manager.h
  4. 19
      src/audio_core/audio_out_manager.cpp

2
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;
}

8
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);
}

25
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<BufferEventFunc, 3> buffer_events{};
std::array<void*, 3> buffer_data{};
/// General lock
std::mutex lock{};
/// Main thread for waiting and callbacks

19
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 {

Loading…
Cancel
Save