Audio¶
Système audio pour les effets sonores, la musique et le chat vocal.
Vue d'Ensemble¶
Le système audio est composé de deux classes principales:
| Classe | Fichier | Usage |
|---|---|---|
AudioManager |
audio/AudioManager.hpp |
Musique et effets sonores |
VoiceChatManager |
audio/VoiceChatManager.hpp |
Chat vocal |
AudioManager¶
Gestionnaire audio pour les effets sonores et la musique (singleton).
Synopsis¶
#include "audio/AudioManager.hpp"
auto& audio = audio::AudioManager::getInstance();
audio.init();
// Load and play
audio.loadMusic("bgm", "assets/audio/background.ogg");
audio.loadSound("shoot", "assets/audio/shoot.wav");
audio.playMusic("bgm");
audio.playSound("shoot");
Déclaration¶
namespace audio {
class AudioManager {
public:
static AudioManager& getInstance();
// Lifecycle
bool init();
void shutdown();
bool isInitialized() const;
// Music
bool loadMusic(const std::string& key, const std::string& filepath);
void playMusic(const std::string& key, int loops = -1);
void stopMusic();
void pauseMusic();
void resumeMusic();
bool isMusicPlaying() const;
// Sound effects
bool loadSound(const std::string& key, const std::string& filepath);
int playSound(const std::string& key, int loops = 0);
// Volume (0-100)
void setMusicVolume(int volume);
void setSoundVolume(int volume);
void setMasterVolume(int volume);
int getMusicVolume() const;
int getSoundVolume() const;
// Mute
void setMuted(bool muted);
bool isMuted() const;
// Cleanup
void unloadAll();
private:
AudioManager() = default;
~AudioManager();
bool _initialized = false;
bool _muted = false;
int _musicVolume = 70; // 0-100
int _soundVolume = 80; // 0-100
int _masterVolume = 100; // 0-100
std::unordered_map<std::string, Mix_Music*> _music;
std::unordered_map<std::string, Mix_Chunk*> _sounds;
};
} // namespace audio
Volumes¶
Les volumes sont des entiers de 0 à 100 (pas des floats).
audio.setMasterVolume(100); // 100%
audio.setMusicVolume(70); // 70%
audio.setSoundVolume(80); // 80%
// Volume effectif = master * category / 100
int effectiveMusic = _masterVolume * _musicVolume / 100;
VoiceChatManager¶
Gestionnaire de chat vocal (singleton séparé).
Synopsis¶
#include "audio/VoiceChatManager.hpp"
auto& voice = VoiceChatManager::getInstance();
voice.init();
voice.connect("localhost", 4126);
voice.joinVoiceChannel(sessionToken, roomCode);
// Push-to-Talk
if (keyPressed) voice.startTalking();
if (keyReleased) voice.stopTalking();
Configuration Voice¶
| Paramètre | Valeur | Description |
|---|---|---|
| Port | 4126 | Port UDP voice |
| Codec | Opus | Codec audio VoIP |
| Sample Rate | 48000 Hz | Fréquence d'échantillonnage |
| Frame Size | 960 samples | 20ms @ 48kHz |
| Bitrate | 32 kbps | Qualité/bande passante |
| Channels | 1 (mono) | Suffisant pour la voix |
Modes Voice¶
enum class VoiceMode {
PushToTalk, // PTT - touche maintenue
VoiceActivity, // VAD - détection automatique
Disabled // Désactivé
};
voice.setVoiceMode(VoiceMode::PushToTalk);
voice.setVADThreshold(0.02f); // Sensibilité VAD
Périphériques Audio¶
// Lister les périphériques
auto inputs = voice.getInputDevices();
auto outputs = voice.getOutputDevices();
// Sélectionner un périphérique
voice.setPreferredInputDevice("Microphone USB");
voice.setPreferredOutputDevice("Casque Gaming");
// Appliquer et réinitialiser
voice.applyAudioDevices(inputName, outputName);
Architecture Audio¶
flowchart TB
subgraph Client
AM[AudioManager]
VM[VoiceChatManager]
end
subgraph Backend
SDL[SDL_mixer]
PA[PortAudio]
Opus[Opus Codec]
end
subgraph Server
VS[VoiceUDPServer<br/>Port 4126]
end
AM --> SDL
VM --> PA
VM --> Opus
VM <--> VS
style AM fill:#7c3aed,color:#fff
style VM fill:#ea580c,color:#fff
Flux Voice Chat¶
sequenceDiagram
participant User
participant Voice as VoiceChatManager
participant PA as PortAudio
participant Opus
participant Server as VoiceUDPServer
User->>Voice: init()
Voice->>PA: Pa_Initialize()
Voice->>Opus: opus_encoder_create()
User->>Voice: connect("host", 4126)
Voice->>Server: UDP connect
User->>Voice: joinVoiceChannel(token, room)
Voice->>Server: VoiceJoin
Server-->>Voice: VoiceJoinAck
loop Push-to-Talk Active
PA->>Voice: Audio samples
Voice->>Opus: Encode
Opus-->>Voice: Opus frame
Voice->>Server: VoiceFrame
Server->>Voice: VoiceFrame (autres joueurs)
Voice->>Opus: Decode
Opus-->>Voice: PCM samples
Voice->>PA: Play audio
end
Fichiers Audio¶
Formats Supportés¶
| Format | Extension | Usage |
|---|---|---|
| OGG Vorbis | .ogg |
Musique |
| WAV | .wav |
Effets sonores |
| FLAC | .flac |
Musique HQ |
| MP3 | .mp3 |
Musique |
Assets Audio¶
Les fichiers audio sont dans assets/audio/:
assets/audio/
├── music/
│ ├── menu.ogg
│ └── game.ogg
└── sfx/
├── shoot.wav
├── explosion.wav
└── hit.wav
Thread Safety¶
| Classe | Thread Model |
|---|---|
AudioManager |
Main thread only |
VoiceChatManager |
Internal audio thread |
Le VoiceChatManager utilise un thread PortAudio pour la capture et la lecture audio. Les appels aux méthodes publiques sont thread-safe.