mirror of
https://git.eden-emu.dev/archive/citron
synced 2026-04-03 18:08:29 -04:00
Complete SDK15 audio implementation with native float biquads. Fixes TotK 1.4.2 and BotW 1.8.2 boot loops. - Add REV15 float biquad filter support - Implement VoiceInParameterV2 (0x188 bytes) - Add SplitterDestinationV2b with biquad filters - Fix HID sampling number (double state value) - Add AudioSnoopManager and AudioSystemManager - Implement FinalOutputRecorder system - Add FFT and loudness calculator (ITU-R BS.1770) - Add full Limiter effect Resolves boot loops and controller detection in SDK20 games. Signed-off-by: Zephyron <zephyron@citron-emu.org>
101 lines
2.7 KiB
C++
101 lines
2.7 KiB
C++
// SPDX-FileCopyrightText: Copyright 2025 Citron Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <mutex>
|
|
#include <span>
|
|
|
|
#include "common/common_types.h"
|
|
#include "core/hle/result.h"
|
|
|
|
namespace Core {
|
|
class System;
|
|
}
|
|
|
|
namespace AudioCore {
|
|
|
|
/**
|
|
* Manages DSP statistics and performance monitoring.
|
|
*/
|
|
class AudioSnoopManager {
|
|
public:
|
|
struct DspStatistics {
|
|
/* 0x00 */ u64 total_cycles;
|
|
/* 0x08 */ u64 active_cycles;
|
|
/* 0x10 */ u32 voice_drop_count;
|
|
/* 0x14 */ u32 command_drop_count;
|
|
/* 0x18 */ u32 buffer_underrun_count;
|
|
/* 0x1C */ u32 buffer_overrun_count;
|
|
/* 0x20 */ f32 cpu_usage_percent;
|
|
/* 0x24 */ f32 dsp_usage_percent;
|
|
};
|
|
static_assert(sizeof(DspStatistics) == 0x28, "DspStatistics has the wrong size!");
|
|
|
|
struct AppletStateSummary {
|
|
/* 0x00 */ u64 applet_resource_user_id;
|
|
/* 0x08 */ u32 audio_in_active_count;
|
|
/* 0x0C */ u32 audio_out_active_count;
|
|
/* 0x10 */ u32 audio_renderer_active_count;
|
|
/* 0x14 */ u32 final_output_recorder_active_count;
|
|
/* 0x18 */ u32 total_active_count;
|
|
/* 0x1C */ u32 reserved;
|
|
};
|
|
static_assert(sizeof(AppletStateSummary) == 0x20, "AppletStateSummary has the wrong size!");
|
|
|
|
explicit AudioSnoopManager(Core::System& system);
|
|
~AudioSnoopManager();
|
|
|
|
/**
|
|
* Get DSP statistics.
|
|
*
|
|
* @param statistics - Output statistics structure.
|
|
* @return Result code.
|
|
*/
|
|
Result GetDspStatistics(DspStatistics& statistics);
|
|
|
|
/**
|
|
* Set DSP statistics parameter.
|
|
*
|
|
* @param enabled - Enable or disable statistics gathering.
|
|
* @return Result code.
|
|
*/
|
|
Result SetDspStatisticsParameter(bool enabled);
|
|
|
|
/**
|
|
* Get DSP statistics parameter.
|
|
*
|
|
* @param enabled - Output enabled state.
|
|
* @return Result code.
|
|
*/
|
|
Result GetDspStatisticsParameter(bool& enabled);
|
|
|
|
/**
|
|
* Get applet state summaries.
|
|
*
|
|
* @param summaries - Output array of summaries.
|
|
* @param count - Output count of summaries.
|
|
* @return Result code.
|
|
*/
|
|
Result GetAppletStateSummaries(std::span<AppletStateSummary> summaries, u32& count);
|
|
|
|
/**
|
|
* Update statistics (called periodically by the audio system).
|
|
*
|
|
* @param cycles_elapsed - Number of CPU cycles elapsed.
|
|
* @param active_voices - Number of active voices.
|
|
* @param dropped_commands - Number of dropped commands.
|
|
*/
|
|
void UpdateStatistics(u64 cycles_elapsed, u32 active_voices, u32 dropped_commands);
|
|
|
|
private:
|
|
Core::System& system;
|
|
std::mutex mutex;
|
|
|
|
DspStatistics statistics{};
|
|
bool statistics_enabled{false};
|
|
};
|
|
|
|
} // namespace AudioCore
|