committed by
crueter
22 changed files with 214 additions and 206 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
-
80src/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-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
#include "audio_core/audio_manager.h"
|
#include "audio_core/audio_manager.h"
|
||||
|
#include "common/thread.h"
|
||||
#include "core/core.h"
|
#include "core/core.h"
|
||||
#include "core/hle/service/audio/errors.h"
|
#include "core/hle/service/audio/errors.h"
|
||||
|
|
||||
namespace AudioCore { |
namespace AudioCore { |
||||
|
|
||||
AudioManager::AudioManager() { |
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() { |
void AudioManager::Shutdown() { |
||||
running = false; |
|
||||
events.SetAudioEvent(Event::Type::Max, true); |
events.SetAudioEvent(Event::Type::Max, true); |
||||
thread.join(); |
|
||||
|
if (thread.joinable()) { |
||||
|
thread.request_stop(); |
||||
|
thread.join(); |
||||
|
} |
||||
} |
} |
||||
|
|
||||
Result AudioManager::SetOutManager(BufferEventFunc buffer_func) { |
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) { |
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) { |
void AudioManager::SetEvent(const Event::Type type, const bool signalled) { |
||||
events.SetAudioEvent(type, 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
|
} // namespace AudioCore
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue