mirror of
https://git.eden-emu.dev/archive/citron
synced 2026-03-29 12:59:37 -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>
138 lines
3.2 KiB
C++
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
|