ATTENTION : ceci est la documentation d'une version antérieure de SFML ; la documentation de la dernière version officielle est accessible via le menu principal

Tutoriel - Module audio - Capturer des données audio

Introduction

Ce tutoriel va vous montrer comment capturer facilement des données audio en provenance de votre microphone, et leur appliquer des traitements personnalisés, comme par exemple les sauver dans un tampon sonore, ou les envoyer directement sur le réseau.

Créer un enregistreur personnalisé

La classe qui définit l'interface de capture dans la SFML est sf::SoundRecorder. Etant donné qu'elle ne sait pas quoi faire des échantillons audio capturés (et elle n'a pas à le savoir), ce n'est qu'une classe de base pour votre propres enregistreurs persos. sf::SoundRecorder vous fournit les échantillons enregistrés, tout ce que vous avez ensuite à faire est... ce que vous voulez : les envoyer via le réseau, les copier dans un tampon sonore, etc.

class MyCustomSoundRecorder : public sf::SoundRecorder
{
    virtual bool ProcessSamples(const sf::Int16* Samples, std::size_t SamplesCount)
    {
        ...

        return true;
    }
};

ProcessSamples est la seule fonction que vous avez à redéfinir. Elle sera appelée à chaque fois que l'enregistreur aura capturé suffisamment d'échantillons audio, donc pas mal de fois pendant la capture.
Samples est un pointeur vers les échantillons nouvellement capturés, et SamplesCount est le nombre d'échantillons. La valeur de retour est un booléen, qui doit être true si vous voulez continuer la capture, ou false si vous souhaitez la stopper (en cas d'erreur par exemple).

Il est également possible d'utiliser la classe sf::SoundRecorder directement, en lui passant un pointeur sur fonction plutôt que d'en dériver pour traiter les échantillons capturés. Ceci-dit, cette méthode n'est fournie que pour des cas particuliers et pour assurer une compatibilité avec d'autres langages ; utiliser une classe dérivée sera bien plus flexible et élégant.

bool ProcessSamples(const sf::Int16* Samples, std::size_t SamplesCount, void* UserData)
{
    ...

    return true;
}

void* UserData = ...;
sf::SoundRecorder Recorder(&ProcessSamples, UserData);

Utilisation

L'interface de sf::SoundRecorder est assez simple. Tout d'abord, vous devez vérifier que votre système supporte bien la capture audio. Cela peut être fait via la fonction statique CanCapture :

if (!sf::SoundRecorder::CanCapture())
{
    // N'essayez même pas d'utiliser la capture audio...
}

Pour bien faire, vous devriez le vérifier avant chaque utilisation de sf::SoundRecorder.

Puis, pour démarrer la capture appelez Start, et pour la stopper appelez Stop.

MyCustomSoundRecorder Recorder;

Recorder.Start(96000);

// On attend un peu...

Recorder.Stop();

Lorsque vous appelez Start, vous pouvez passer en paramètre le taux d'échantillonnage qui sera utilisé pour la capture. En l'absence de paramètre, c'est 44100 sera utilisé (qualité CD). Si vous avze besoin de récupérer ce taux d'échantillonnage plus tard, vous pouvez appeler la fonction GetSampleRate.

unsigned int SampleRate = Recorder.GetSampleRate();

Enregistrer des données dans un tampon sonore

L'utilisation la plus fréquente est probablement de sauvegarder les données audio dans un tampon sonore, de manière à pouvoir les sauvegarder dans un fichier ou encore les lire immédiatement. La SFML possède une spécialisation de sf::SoundRecorder prédéfinie pour cela : sf::SoundBufferRecorder. Elle copie les échantillons audio capturés dans un sf::SoundBuffer, que vous pouvez récupérer via la fonction GetBuffer :

sf::SoundBufferRecorder Recorder;

Recorder.Start();

// On attend un peu...

Recorder.Stop();

sf::SoundBuffer Buffer = Recorder.GetBuffer();

Multi-threading

Pour les mêmes raisons que sf::SoundStream, sf::SoundRecorder exécute la capture dans un nouveau thread, ainsi le thread principal n'est pas bloqué. Ainsi, une fois de plus, vous devez faire attention aux éventuels problèmes de synchronisation qui peuvent survenir si vous partagez des données entre les deux threads.
Pour des explications plus détaillées, vous pouvez jeter un oeil, si ce n'est déjà fait, au tutoriel sur les flux.

Conclusion

Vous en avez fini avec le module audio. Vous pouvez maintenant jouer des sons et des musiques, effectuer des lectures en continue à partir de n'importe quelle source, et enregistrer des sons à partir de votre microphone.
Vous pouvez maintenant commencer à écrire votre propre programme audio, ou sauter vers le module réseau.

Téléchargez le code source :