Overview
Ryujinx’s audio subsystem emulates the Nintendo Switch audio hardware and provides multi-backend audio output. The architecture separates audio rendering (processing) from output (playback):Dual-layer design: Renderer system processes audio commands, output system handles device playback
Audio Manager
The top-level audio manager fromsrc/Ryujinx.Audio/AudioManager.cs:
- Event-driven: Callbacks triggered by audio hardware
- Lock-free updates: Minimal contention between audio and game threads
- Separate input/output: Independent pipelines for recording and playback
Audio Renderer System
The core audio processing system fromsrc/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs:
Audio Rendering Pipeline
1
Voice Processing
Voice Context manages individual audio sources:Operations:
- Decode audio samples (PCM, ADPCM, Opus)
- Apply per-voice effects (filters, pitch shift)
- Volume control and panning
2
Effect Processing
Effect Context applies audio effects:Example - Reverb:
3
Mixing
Mix Context combines audio sources:Mixing stages:
- Voice → Mix (individual sources to submixes)
- Mix → Mix (submix hierarchy)
- Mix → Final (master output)
4
Sink Output
Sink Context routes to output devices:
Command Generation
Audio processing is command-driven:Audio Output System
Handles physical audio device output:Buffer Management
- Buffer States
- Buffer Structure
States:
- Queued: Waiting for playback
- Playing: Currently outputting
- Released: Completed, ready for reuse
Backend Abstraction
Multiple audio backends supported:SDL3 Backend
Preferred backend using SDL3 audio:- Low latency
- Cross-platform
- Modern API
- Automatic resampling
OpenAL Backend
Alternative using OpenAL Soft:- Wide compatibility
- 3D audio support
- Effects processing (EFX extension)
SoundIO Backend
Legacy backend:Sample Format Conversion
Convert between internal float format and device formats:Audio Codecs
Supported audio formats:- PCM
- ADPCM
- Opus
Synchronization & Timing
Audio-Video Sync
Buffer Underrun Handling
Performance Characteristics
Latency
Typical values:
- SDL3: 20-40ms
- OpenAL: 30-60ms
- SoundIO: 25-50ms
CPU Usage
Rendering:
- 0.5-2% per audio stream
- Scales with voice count
- Effect processing varies
- Less than 0.5% overhead
Memory
Buffers:
- ~2-10 MB per game
- Mix buffers: 1-5 MB
- Effect state: Less than 1 MB
Configuration Options
Debugging Tools
Audio Dumps
Dump audio streams to WAV:
Performance Stats
Monitor processing time:
Device Info
Log device capabilities:
Dummy Backend
Test without audio:
Related Topics
HLE Services
Audio renderer service implementation
Performance Tuning
Optimizing audio performance
Troubleshooting
Resolving audio issues
Input System
Audio capture for microphone
Source Code Reference
src/Ryujinx.Audio/AudioManager.cs:9- Audio managersrc/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs:27- Render systemsrc/Ryujinx.Audio/Output/AudioOutputSystem.cs- Output systemsrc/Ryujinx.Audio.Backends.SDL3/- SDL3 backendsrc/Ryujinx.Audio.Backends.OpenAL/- OpenAL backendsrc/Ryujinx.Audio/Renderer/Dsp/Command/- Audio commands