Files
citron/src/audio_core/audio_system_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

138 lines
3.2 KiB
C++

// SPDX-FileCopyrightText: Copyright 2025 Citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <array>
#include <mutex>
#include "common/common_types.h"
#include "core/hle/result.h"
namespace Core {
class System;
}
namespace AudioCore {
/**
* Manages audio system state for applets including suspend/resume and volume control.
*/
class AudioSystemManager {
public:
explicit AudioSystemManager(Core::System& system);
~AudioSystemManager();
/**
* Register an applet resource user ID.
*
* @param applet_resource_user_id - Applet resource user ID to register.
* @return Result code.
*/
Result RegisterAppletResourceUserId(u64 applet_resource_user_id);
/**
* Unregister an applet resource user ID.
*
* @param applet_resource_user_id - Applet resource user ID to unregister.
* @return Result code.
*/
Result UnregisterAppletResourceUserId(u64 applet_resource_user_id);
/**
* Request audio suspension.
*
* @param applet_resource_user_id - Applet resource user ID.
* @return Result code.
*/
Result RequestSuspendAudio(u64 applet_resource_user_id);
/**
* Request audio resumption.
*
* @param applet_resource_user_id - Applet resource user ID.
* @return Result code.
*/
Result RequestResumeAudio(u64 applet_resource_user_id);
/**
* Get audio input process master volume.
*
* @param volume - Output volume value.
* @return Result code.
*/
Result GetAudioInputProcessMasterVolume(f32& volume);
/**
* Set audio input process master volume.
*
* @param volume - Volume value to set.
* @return Result code.
*/
Result SetAudioInputProcessMasterVolume(f32 volume);
/**
* Get audio output process master volume.
*
* @param volume - Output volume value.
* @return Result code.
*/
Result GetAudioOutputProcessMasterVolume(f32& volume);
/**
* Set audio output process master volume.
*
* @param volume - Volume value to set.
* @return Result code.
*/
Result SetAudioOutputProcessMasterVolume(f32 volume);
/**
* Get audio output process record volume.
*
* @param volume - Output volume value.
* @return Result code.
*/
Result GetAudioOutputProcessRecordVolume(f32& volume);
/**
* Set audio output process record volume.
*
* @param volume - Volume value to set.
* @return Result code.
*/
Result SetAudioOutputProcessRecordVolume(f32 volume);
/**
* Request audio suspension for debugging.
*
* @return Result code.
*/
Result RequestSuspendAudioForDebug();
/**
* Request audio resumption for debugging.
*
* @return Result code.
*/
Result RequestResumeAudioForDebug();
private:
static constexpr size_t MaxAppletResourceUserIds = 8;
Core::System& system;
std::mutex mutex;
std::array<u64, MaxAppletResourceUserIds> registered_ids{};
size_t registered_count{0};
f32 input_master_volume{1.0f};
f32 output_master_volume{1.0f};
f32 output_record_volume{1.0f};
bool audio_suspended{false};
bool debug_suspended{false};
};
} // namespace AudioCore