summaryrefslogtreecommitdiff
path: root/src/audio_core/audio_manager.cpp
diff options
context:
space:
mode:
authorGravatar Kelebek12022-07-16 23:48:45 +0100
committerGravatar Kelebek12022-07-22 01:11:32 +0100
commit458da8a94877677f086f06cdeecf959ec4283a33 (patch)
tree583166d77602ad90a0d552f37de8729ad80fd6c1 /src/audio_core/audio_manager.cpp
parentMerge pull request #8598 from Link4565/recv-dontwait (diff)
downloadyuzu-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.cpp80
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
9namespace AudioCore {
10
11AudioManager::AudioManager(Core::System& system_) : system{system_} {
12 thread = std::jthread([this]() { ThreadFunc(); });
13}
14
15void AudioManager::Shutdown() {
16 running = false;
17 events.SetAudioEvent(Event::Type::Max, true);
18 thread.join();
19}
20
21Result 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
37Result 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
53void AudioManager::SetEvent(const Event::Type type, const bool signalled) {
54 events.SetAudioEvent(type, signalled);
55}
56
57void 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