summaryrefslogtreecommitdiffstats
path: root/src/audio_core/audio_renderer.cpp
diff options
context:
space:
mode:
authorKelebek1 <eeeedddccc@hotmail.co.uk>2021-06-27 00:04:40 +0200
committerKelebek1 <eeeedddccc@hotmail.co.uk>2021-07-01 07:01:01 +0200
commitb455043e45737345fe73d118947db1684bd248ea (patch)
treec05414e81eff4b012bd1b33076fb60da16aace54 /src/audio_core/audio_renderer.cpp
parentDecouple audio processing and run at variable rate (diff)
downloadyuzu-b455043e45737345fe73d118947db1684bd248ea.tar
yuzu-b455043e45737345fe73d118947db1684bd248ea.tar.gz
yuzu-b455043e45737345fe73d118947db1684bd248ea.tar.bz2
yuzu-b455043e45737345fe73d118947db1684bd248ea.tar.lz
yuzu-b455043e45737345fe73d118947db1684bd248ea.tar.xz
yuzu-b455043e45737345fe73d118947db1684bd248ea.tar.zst
yuzu-b455043e45737345fe73d118947db1684bd248ea.zip
Diffstat (limited to 'src/audio_core/audio_renderer.cpp')
-rw-r--r--src/audio_core/audio_renderer.cpp130
1 files changed, 63 insertions, 67 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp
index 0757cd804..ccd5ca6cc 100644
--- a/src/audio_core/audio_renderer.cpp
+++ b/src/audio_core/audio_renderer.cpp
@@ -129,87 +129,85 @@ Stream::State AudioRenderer::GetStreamState() const {
ResultCode AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params,
std::vector<u8>& output_params) {
- {
- std::scoped_lock lock{mutex};
- InfoUpdater info_updater{input_params, output_params, behavior_info};
+ std::scoped_lock lock{mutex};
+ InfoUpdater info_updater{input_params, output_params, behavior_info};
- if (!info_updater.UpdateBehaviorInfo(behavior_info)) {
- LOG_ERROR(Audio, "Failed to update behavior info input parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.UpdateBehaviorInfo(behavior_info)) {
+ LOG_ERROR(Audio, "Failed to update behavior info input parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- if (!info_updater.UpdateMemoryPools(memory_pool_info)) {
- LOG_ERROR(Audio, "Failed to update memory pool parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.UpdateMemoryPools(memory_pool_info)) {
+ LOG_ERROR(Audio, "Failed to update memory pool parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- if (!info_updater.UpdateVoiceChannelResources(voice_context)) {
- LOG_ERROR(Audio, "Failed to update voice channel resource parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.UpdateVoiceChannelResources(voice_context)) {
+ LOG_ERROR(Audio, "Failed to update voice channel resource parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- if (!info_updater.UpdateVoices(voice_context, memory_pool_info, 0)) {
- LOG_ERROR(Audio, "Failed to update voice parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.UpdateVoices(voice_context, memory_pool_info, 0)) {
+ LOG_ERROR(Audio, "Failed to update voice parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- // TODO(ogniK): Deal with stopped audio renderer but updates still taking place
- if (!info_updater.UpdateEffects(effect_context, true)) {
- LOG_ERROR(Audio, "Failed to update effect parameters");
+ // TODO(ogniK): Deal with stopped audio renderer but updates still taking place
+ if (!info_updater.UpdateEffects(effect_context, true)) {
+ LOG_ERROR(Audio, "Failed to update effect parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
+
+ if (behavior_info.IsSplitterSupported()) {
+ if (!info_updater.UpdateSplitterInfo(splitter_context)) {
+ LOG_ERROR(Audio, "Failed to update splitter parameters");
return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
}
+ }
- if (behavior_info.IsSplitterSupported()) {
- if (!info_updater.UpdateSplitterInfo(splitter_context)) {
- LOG_ERROR(Audio, "Failed to update splitter parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
- }
+ const auto mix_result = info_updater.UpdateMixes(mix_context, worker_params.mix_buffer_count,
+ splitter_context, effect_context);
- const auto mix_result = info_updater.UpdateMixes(
- mix_context, worker_params.mix_buffer_count, splitter_context, effect_context);
+ if (mix_result.IsError()) {
+ LOG_ERROR(Audio, "Failed to update mix parameters");
+ return mix_result;
+ }
- if (mix_result.IsError()) {
- LOG_ERROR(Audio, "Failed to update mix parameters");
- return mix_result;
- }
+ // TODO(ogniK): Sinks
+ if (!info_updater.UpdateSinks(sink_context)) {
+ LOG_ERROR(Audio, "Failed to update sink parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- // TODO(ogniK): Sinks
- if (!info_updater.UpdateSinks(sink_context)) {
- LOG_ERROR(Audio, "Failed to update sink parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ // TODO(ogniK): Performance buffer
+ if (!info_updater.UpdatePerformanceBuffer()) {
+ LOG_ERROR(Audio, "Failed to update performance buffer parameters");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- // TODO(ogniK): Performance buffer
- if (!info_updater.UpdatePerformanceBuffer()) {
- LOG_ERROR(Audio, "Failed to update performance buffer parameters");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.UpdateErrorInfo(behavior_info)) {
+ LOG_ERROR(Audio, "Failed to update error info");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- if (!info_updater.UpdateErrorInfo(behavior_info)) {
- LOG_ERROR(Audio, "Failed to update error info");
+ if (behavior_info.IsElapsedFrameCountSupported()) {
+ if (!info_updater.UpdateRendererInfo(elapsed_frame_count)) {
+ LOG_ERROR(Audio, "Failed to update renderer info");
return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
}
+ }
+ // TODO(ogniK): Statistics
- if (behavior_info.IsElapsedFrameCountSupported()) {
- if (!info_updater.UpdateRendererInfo(elapsed_frame_count)) {
- LOG_ERROR(Audio, "Failed to update renderer info");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
- }
- // TODO(ogniK): Statistics
-
- if (!info_updater.WriteOutputHeader()) {
- LOG_ERROR(Audio, "Failed to write output header");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.WriteOutputHeader()) {
+ LOG_ERROR(Audio, "Failed to write output header");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
+ }
- // TODO(ogniK): Check when all sections are implemented
+ // TODO(ogniK): Check when all sections are implemented
- if (!info_updater.CheckConsumedSize()) {
- LOG_ERROR(Audio, "Audio buffers were not consumed!");
- return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
- }
+ if (!info_updater.CheckConsumedSize()) {
+ LOG_ERROR(Audio, "Audio buffers were not consumed!");
+ return AudioCommon::Audren::ERR_INVALID_PARAMETERS;
}
return ResultSuccess;
}
@@ -234,10 +232,8 @@ void AudioRenderer::QueueMixedBuffer(Buffer::Tag tag) {
command_generator.PostCommand();
// Base sample size
std::size_t BUFFER_SIZE{worker_params.sample_count};
- // Samples
- std::vector<s16> buffer(BUFFER_SIZE * stream->GetNumChannels());
- // Make sure to clear our samples
- std::memset(buffer.data(), 0, buffer.size() * sizeof(s16));
+ // Samples, making sure to clear
+ std::vector<s16> buffer(BUFFER_SIZE * stream->GetNumChannels(), 0);
if (sink_context.InUse()) {
const auto stream_channel_count = stream->GetNumChannels();