22 changed files with 215 additions and 207 deletions
-
3src/audio_core/audio_core.cpp
-
3src/audio_core/audio_core.h
-
3src/audio_core/audio_in_manager.cpp
-
100src/audio_core/audio_manager.cpp
-
10src/audio_core/audio_manager.h
-
3src/audio_core/audio_out_manager.cpp
-
71src/core/hle/service/am/button_poller.cpp
-
32src/core/hle/service/am/button_poller.h
-
31src/core/hle/service/am/event_observer.cpp
-
3src/core/hle/service/am/event_observer.h
-
53src/core/hle/service/am/process_creation.cpp
-
3src/core/hle/service/am/process_creation.h
-
2src/core/hle/service/am/service/application_creator.cpp
-
2src/core/hle/service/am/service/library_applet_creator.cpp
-
2src/core/hle/service/audio/audio_out_manager.cpp
-
2src/core/hle/service/audio/audio_out_manager.h
-
3src/core/hle/service/audio/audio_renderer_manager.cpp
-
3src/core/hle/service/audio/audio_renderer_manager.h
-
3src/core/hle/service/os/process.cpp
-
3src/core/hle/service/os/process.h
-
82src/input_common/drivers/udp_client.cpp
-
5src/video_core/renderer_vulkan/vk_update_descriptor.h
@ -1,81 +1,77 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
|||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "audio_core/audio_manager.h"
|
|||
#include "common/thread.h"
|
|||
#include "core/core.h"
|
|||
#include "core/hle/service/audio/errors.h"
|
|||
|
|||
namespace AudioCore { |
|||
|
|||
AudioManager::AudioManager() { |
|||
thread = std::jthread([this]() { ThreadFunc(); }); |
|||
thread = std::jthread([this](std::stop_token stop_token) { |
|||
Common::SetCurrentThreadName("AudioManager"); |
|||
std::unique_lock l{events.GetAudioEventLock()}; |
|||
events.ClearEvents(); |
|||
while (!stop_token.stop_requested()) { |
|||
const auto timed_out{events.Wait(l, std::chrono::seconds(2))}; |
|||
if (events.CheckAudioEventSet(Event::Type::Max)) { |
|||
break; |
|||
} |
|||
for (size_t i = 0; i < buffer_events.size(); i++) { |
|||
const auto event_type = Event::Type(i); |
|||
if (events.CheckAudioEventSet(event_type) || timed_out) { |
|||
if (buffer_events[i]) { |
|||
buffer_events[i](); |
|||
} |
|||
} |
|||
events.SetAudioEvent(event_type, false); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
void AudioManager::Shutdown() { |
|||
running = false; |
|||
events.SetAudioEvent(Event::Type::Max, true); |
|||
thread.join(); |
|||
if (thread.joinable()) { |
|||
thread.request_stop(); |
|||
thread.join(); |
|||
} |
|||
} |
|||
|
|||
Result AudioManager::SetOutManager(BufferEventFunc buffer_func) { |
|||
if (!running) { |
|||
return Service::Audio::ResultOperationFailed; |
|||
} |
|||
|
|||
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); |
|||
needs_update = true; |
|||
events.SetAudioEvent(Event::Type::AudioOutManager, true); |
|||
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); |
|||
needs_update = true; |
|||
events.SetAudioEvent(Event::Type::AudioOutManager, true); |
|||
} |
|||
return ResultSuccess; |
|||
} |
|||
return ResultSuccess; |
|||
return Service::Audio::ResultOperationFailed; |
|||
} |
|||
|
|||
Result AudioManager::SetInManager(BufferEventFunc buffer_func) { |
|||
if (!running) { |
|||
return Service::Audio::ResultOperationFailed; |
|||
} |
|||
|
|||
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); |
|||
needs_update = true; |
|||
events.SetAudioEvent(Event::Type::AudioInManager, true); |
|||
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); |
|||
needs_update = true; |
|||
events.SetAudioEvent(Event::Type::AudioInManager, true); |
|||
} |
|||
return ResultSuccess; |
|||
} |
|||
return ResultSuccess; |
|||
return Service::Audio::ResultOperationFailed; |
|||
} |
|||
|
|||
void AudioManager::SetEvent(const Event::Type type, const bool signalled) { |
|||
events.SetAudioEvent(type, signalled); |
|||
} |
|||
|
|||
void AudioManager::ThreadFunc() { |
|||
std::unique_lock l{events.GetAudioEventLock()}; |
|||
events.ClearEvents(); |
|||
running = true; |
|||
|
|||
while (running) { |
|||
const auto timed_out{events.Wait(l, std::chrono::seconds(2))}; |
|||
|
|||
if (events.CheckAudioEventSet(Event::Type::Max)) { |
|||
break; |
|||
} |
|||
|
|||
for (size_t i = 0; i < buffer_events.size(); i++) { |
|||
const auto event_type = static_cast<Event::Type>(i); |
|||
|
|||
if (events.CheckAudioEventSet(event_type) || timed_out) { |
|||
if (buffer_events[i]) { |
|||
buffer_events[i](); |
|||
} |
|||
} |
|||
events.SetAudioEvent(event_type, false); |
|||
} |
|||
} |
|||
} |
|||
|
|||
} // namespace AudioCore
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue