Skip to main content

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 from src/Ryujinx.Audio/AudioManager.cs:
Key features:
  • 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 from src/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:
  1. Voice → Mix (individual sources to submixes)
  2. Mix → Mix (submix hierarchy)
  3. Mix → Final (master output)
4

Sink Output

Sink Context routes to output devices:

Command Generation

Audio processing is command-driven:
Command list execution:

Audio Output System

Handles physical audio device output:

Buffer Management

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:
Features:
  • Low latency
  • Cross-platform
  • Modern API
  • Automatic resampling

OpenAL Backend

Alternative using OpenAL Soft:
Features:
  • 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:
Formats: 8-bit, 16-bit, 24-bit, 32-bit, float

Synchronization & Timing

Audio-Video Sync

Buffer Underrun Handling

Performance Characteristics

Latency

Typical values:
  • SDL3: 20-40ms
  • OpenAL: 30-60ms
  • SoundIO: 25-50ms
Configurable buffer size

CPU Usage

Rendering:
  • 0.5-2% per audio stream
  • Scales with voice count
  • Effect processing varies
Output:
  • Less than 0.5% overhead

Memory

Buffers:
  • ~2-10 MB per game
  • Mix buffers: 1-5 MB
  • Effect state: Less than 1 MB
Codec state minimal

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:

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 manager
  • src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs:27 - Render system
  • src/Ryujinx.Audio/Output/AudioOutputSystem.cs - Output system
  • src/Ryujinx.Audio.Backends.SDL3/ - SDL3 backend
  • src/Ryujinx.Audio.Backends.OpenAL/ - OpenAL backend
  • src/Ryujinx.Audio/Renderer/Dsp/Command/ - Audio commands