summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/audio_renderer.cpp40
-rw-r--r--src/audio_core/audio_renderer.h51
2 files changed, 52 insertions, 39 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp
index ed3b7defc..83b75e61f 100644
--- a/src/audio_core/audio_renderer.cpp
+++ b/src/audio_core/audio_renderer.cpp
@@ -3,9 +3,12 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "audio_core/algorithm/interpolate.h" 5#include "audio_core/algorithm/interpolate.h"
6#include "audio_core/audio_out.h"
6#include "audio_core/audio_renderer.h" 7#include "audio_core/audio_renderer.h"
8#include "audio_core/codec.h"
7#include "common/assert.h" 9#include "common/assert.h"
8#include "common/logging/log.h" 10#include "common/logging/log.h"
11#include "core/hle/kernel/event.h"
9#include "core/memory.h" 12#include "core/memory.h"
10 13
11namespace AudioCore { 14namespace AudioCore {
@@ -13,6 +16,41 @@ namespace AudioCore {
13constexpr u32 STREAM_SAMPLE_RATE{48000}; 16constexpr u32 STREAM_SAMPLE_RATE{48000};
14constexpr u32 STREAM_NUM_CHANNELS{2}; 17constexpr u32 STREAM_NUM_CHANNELS{2};
15 18
19class AudioRenderer::VoiceState {
20public:
21 bool IsPlaying() const {
22 return is_in_use && info.play_state == PlayState::Started;
23 }
24
25 const VoiceOutStatus& GetOutStatus() const {
26 return out_status;
27 }
28
29 const VoiceInfo& GetInfo() const {
30 return info;
31 }
32
33 VoiceInfo& Info() {
34 return info;
35 }
36
37 void SetWaveIndex(std::size_t index);
38 std::vector<s16> DequeueSamples(std::size_t sample_count);
39 void UpdateState();
40 void RefreshBuffer();
41
42private:
43 bool is_in_use{};
44 bool is_refresh_pending{};
45 std::size_t wave_index{};
46 std::size_t offset{};
47 Codec::ADPCMState adpcm_state{};
48 InterpolationState interp_state{};
49 std::vector<s16> samples;
50 VoiceOutStatus out_status{};
51 VoiceInfo info{};
52};
53
16AudioRenderer::AudioRenderer(AudioRendererParameter params, 54AudioRenderer::AudioRenderer(AudioRendererParameter params,
17 Kernel::SharedPtr<Kernel::Event> buffer_event) 55 Kernel::SharedPtr<Kernel::Event> buffer_event)
18 : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count) { 56 : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count) {
@@ -27,6 +65,8 @@ AudioRenderer::AudioRenderer(AudioRendererParameter params,
27 QueueMixedBuffer(2); 65 QueueMixedBuffer(2);
28} 66}
29 67
68AudioRenderer::~AudioRenderer() = default;
69
30u32 AudioRenderer::GetSampleRate() const { 70u32 AudioRenderer::GetSampleRate() const {
31 return worker_params.sample_rate; 71 return worker_params.sample_rate;
32} 72}
diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h
index c8d2cd188..2c4f5ab75 100644
--- a/src/audio_core/audio_renderer.h
+++ b/src/audio_core/audio_renderer.h
@@ -8,16 +8,20 @@
8#include <memory> 8#include <memory>
9#include <vector> 9#include <vector>
10 10
11#include "audio_core/algorithm/interpolate.h"
12#include "audio_core/audio_out.h"
13#include "audio_core/codec.h"
14#include "audio_core/stream.h" 11#include "audio_core/stream.h"
12#include "common/common_funcs.h"
15#include "common/common_types.h" 13#include "common/common_types.h"
16#include "common/swap.h" 14#include "common/swap.h"
17#include "core/hle/kernel/event.h" 15#include "core/hle/kernel/object.h"
16
17namespace Kernel {
18class Event;
19}
18 20
19namespace AudioCore { 21namespace AudioCore {
20 22
23class AudioOut;
24
21enum class PlayState : u8 { 25enum class PlayState : u8 {
22 Started = 0, 26 Started = 0,
23 Stopped = 1, 27 Stopped = 1,
@@ -158,6 +162,8 @@ static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has wrong size
158class AudioRenderer { 162class AudioRenderer {
159public: 163public:
160 AudioRenderer(AudioRendererParameter params, Kernel::SharedPtr<Kernel::Event> buffer_event); 164 AudioRenderer(AudioRendererParameter params, Kernel::SharedPtr<Kernel::Event> buffer_event);
165 ~AudioRenderer();
166
161 std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params); 167 std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
162 void QueueMixedBuffer(Buffer::Tag tag); 168 void QueueMixedBuffer(Buffer::Tag tag);
163 void ReleaseAndQueueBuffers(); 169 void ReleaseAndQueueBuffers();
@@ -166,45 +172,12 @@ public:
166 u32 GetMixBufferCount() const; 172 u32 GetMixBufferCount() const;
167 173
168private: 174private:
169 class VoiceState { 175 class VoiceState;
170 public:
171 bool IsPlaying() const {
172 return is_in_use && info.play_state == PlayState::Started;
173 }
174
175 const VoiceOutStatus& GetOutStatus() const {
176 return out_status;
177 }
178
179 const VoiceInfo& GetInfo() const {
180 return info;
181 }
182
183 VoiceInfo& Info() {
184 return info;
185 }
186
187 void SetWaveIndex(std::size_t index);
188 std::vector<s16> DequeueSamples(std::size_t sample_count);
189 void UpdateState();
190 void RefreshBuffer();
191
192 private:
193 bool is_in_use{};
194 bool is_refresh_pending{};
195 std::size_t wave_index{};
196 std::size_t offset{};
197 Codec::ADPCMState adpcm_state{};
198 InterpolationState interp_state{};
199 std::vector<s16> samples;
200 VoiceOutStatus out_status{};
201 VoiceInfo info{};
202 };
203 176
204 AudioRendererParameter worker_params; 177 AudioRendererParameter worker_params;
205 Kernel::SharedPtr<Kernel::Event> buffer_event; 178 Kernel::SharedPtr<Kernel::Event> buffer_event;
206 std::vector<VoiceState> voices; 179 std::vector<VoiceState> voices;
207 std::unique_ptr<AudioCore::AudioOut> audio_out; 180 std::unique_ptr<AudioOut> audio_out;
208 AudioCore::StreamPtr stream; 181 AudioCore::StreamPtr stream;
209}; 182};
210 183