diff options
| author | 2022-07-16 23:48:45 +0100 | |
|---|---|---|
| committer | 2022-07-22 01:11:32 +0100 | |
| commit | 458da8a94877677f086f06cdeecf959ec4283a33 (patch) | |
| tree | 583166d77602ad90a0d552f37de8729ad80fd6c1 /src/audio_core/audio_manager.cpp | |
| parent | Merge pull request #8598 from Link4565/recv-dontwait (diff) | |
| download | yuzu-458da8a94877677f086f06cdeecf959ec4283a33.tar.gz yuzu-458da8a94877677f086f06cdeecf959ec4283a33.tar.xz yuzu-458da8a94877677f086f06cdeecf959ec4283a33.zip | |
Project Andio
Diffstat (limited to 'src/audio_core/audio_manager.cpp')
| -rw-r--r-- | src/audio_core/audio_manager.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/audio_core/audio_manager.cpp b/src/audio_core/audio_manager.cpp new file mode 100644 index 000000000..2f1bba9c3 --- /dev/null +++ b/src/audio_core/audio_manager.cpp | |||
| @@ -0,0 +1,80 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "audio_core/audio_in_manager.h" | ||
| 5 | #include "audio_core/audio_manager.h" | ||
| 6 | #include "audio_core/audio_out_manager.h" | ||
| 7 | #include "core/core.h" | ||
| 8 | |||
| 9 | namespace AudioCore { | ||
| 10 | |||
| 11 | AudioManager::AudioManager(Core::System& system_) : system{system_} { | ||
| 12 | thread = std::jthread([this]() { ThreadFunc(); }); | ||
| 13 | } | ||
| 14 | |||
| 15 | void AudioManager::Shutdown() { | ||
| 16 | running = false; | ||
| 17 | events.SetAudioEvent(Event::Type::Max, true); | ||
| 18 | thread.join(); | ||
| 19 | } | ||
| 20 | |||
| 21 | Result AudioManager::SetOutManager(BufferEventFunc buffer_func) { | ||
| 22 | if (!running) { | ||
| 23 | return Service::Audio::ERR_OPERATION_FAILED; | ||
| 24 | } | ||
| 25 | |||
| 26 | std::scoped_lock l{lock}; | ||
| 27 | |||
| 28 | const auto index{events.GetManagerIndex(Event::Type::AudioOutManager)}; | ||
| 29 | if (buffer_events[index] == nullptr) { | ||
| 30 | buffer_events[index] = buffer_func; | ||
| 31 | needs_update = true; | ||
| 32 | events.SetAudioEvent(Event::Type::AudioOutManager, true); | ||
| 33 | } | ||
| 34 | return ResultSuccess; | ||
| 35 | } | ||
| 36 | |||
| 37 | Result AudioManager::SetInManager(BufferEventFunc buffer_func) { | ||
| 38 | if (!running) { | ||
| 39 | return Service::Audio::ERR_OPERATION_FAILED; | ||
| 40 | } | ||
| 41 | |||
| 42 | std::scoped_lock l{lock}; | ||
| 43 | |||
| 44 | const auto index{events.GetManagerIndex(Event::Type::AudioInManager)}; | ||
| 45 | if (buffer_events[index] == nullptr) { | ||
| 46 | buffer_events[index] = buffer_func; | ||
| 47 | needs_update = true; | ||
| 48 | events.SetAudioEvent(Event::Type::AudioInManager, true); | ||
| 49 | } | ||
| 50 | return ResultSuccess; | ||
| 51 | } | ||
| 52 | |||
| 53 | void AudioManager::SetEvent(const Event::Type type, const bool signalled) { | ||
| 54 | events.SetAudioEvent(type, signalled); | ||
| 55 | } | ||
| 56 | |||
| 57 | void AudioManager::ThreadFunc() { | ||
| 58 | std::unique_lock l{events.GetAudioEventLock()}; | ||
| 59 | events.ClearEvents(); | ||
| 60 | running = true; | ||
| 61 | |||
| 62 | while (running) { | ||
| 63 | auto timed_out{events.Wait(l, std::chrono::seconds(2))}; | ||
| 64 | |||
| 65 | if (events.CheckAudioEventSet(Event::Type::Max)) { | ||
| 66 | break; | ||
| 67 | } | ||
| 68 | |||
| 69 | for (size_t i = 0; i < buffer_events.size(); i++) { | ||
| 70 | if (events.CheckAudioEventSet(Event::Type(i)) || timed_out) { | ||
| 71 | if (buffer_events[i]) { | ||
| 72 | buffer_events[i](); | ||
| 73 | } | ||
| 74 | } | ||
| 75 | events.SetAudioEvent(Event::Type(i), false); | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 | } // namespace AudioCore | ||