Files
citron/src/audio_core/audio_snoop_manager.h
Zephyron 56dba09e0c feat: REV15 audio renderer + HID fix (v0.8.0)
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>
2025-10-11 14:10:08 +10:00

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