SFML - Mettre en pause un enregistrement audio

Résolu
MemeTech Messages postés 90 Statut Membre -  
MemeTech Messages postés 90 Statut Membre -
Bonjour !
Tout est dans le titre, je souhaite proposer à l'utilisateur de mon enregistreur audio de mettre en pause l'enregistrement et de le reprendre quand il le souhaite.

La doc ne semble pas proposer de fonction pause () à la classe sf::SoundBufferRecorder, peut être il y a-t-il une autre solution ?

Merci d'avance !

4 réponses

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut,
    la pause n'est pas souvent une fonctionnalité dispo sur les APIs d'enregistrement, donc rien d'exceptionnel de la part de la SFML.

    Une solution (parmi d'autres) consiste à arrêter l'enregistrement (
    stop()
    ) quand on veut mettre en pause, et garder les buffers résultat quelque part (mémoire, disque, ...) tant qu'on arrête pas complètement l'enregistrement. Quand on a fini, on prend les buffers et les combine (en sortant les données des buffers avec
    SoundBuffer::getSamples
    , les copiant dans un conteneur tel que
    std::vector<Int16>
    , et les rechargeant avec
    SoundBuffer::loadFromSamples
    ).

    Sinon j'ai rapidement regardé le code des classes d'enregistrement de la SFML et, bien que pas testé, il me semble que l'on peut faire start/stop plusieurs fois sur un même
    SoundBufferRecorder
    , permettant de mettre en pause. Ce n'est documenté nulle part, ceci dit, donc à vérifier.
    1
  2. MemeTech Messages postés 90 Statut Membre 1
     
    Merci pour m'avoir aidé si vite !

    Pour mettre en pause avec start () / stop (), j ai déjà essayé, ça ne fonctionne pas.

    En revanche, j'imagine que les std::vector doivent fonctionner, mais je ne sais pas comment faire, je ne connais pas le fonctionnement de ces échantillons audio.

    Pourriez-vous m'éclairer à ce sujet ?
    0
  3. MemeTech Messages postés 90 Statut Membre 1
     
    Up !

    Voilà plusieurs jours que je galère avec ces tableaux de samples et je commence à sécher...

    J'ai fait une fonction pause () appelée quand l'utilisateur veut suspendre son enregistrement qui ajoute au un tableau d'échantillons l'enregistrement juste arrêté.
    Souci, Code::Blocks me dit :
    error: invalid conversion from 'const Int16*' {aka 'const short int*'} to 'sf::Int16*' {aka 'short int*'} [-fpermissive]|

    Voilà un petit extrait de mon code :

    
    void MRecorder::pause ()
    {
        sBackground.setTexture (tPaused);  // Change l'image de fond de l'appli
    
        recorder.stop ();  // Arrête l'enregistreur (logique...  :-D)
    
    
        Int16* nextRecording = recorder.getBuffer ().getSamples ();  // Initialise le buffer
    
        unsigned long int const MAX_INDEX = recorder.getBuffer ().getSampleCount ();  // Le nombre de samples dans le dernier enregistrement
    
    
        for (unsigned int i = 0 ; i != MAX_INDEX ; i++)  // Boucle qui ajoute à recording le dernier enregistrement
            recording.push_back (nextRecording[i]);
    }
    
    


    Merci pour votre aide !
    0
  4. MemeTech Messages postés 90 Statut Membre 1
     
    En fait, il suffisait de déclarer nextRecording en const, je ne comprend pas bien pourquoi, mais ça a fonctionné.
    Donc, ça y est, mon enregistreur audio peut se mettre en pause !

    Sujet résolu, merci encore ElementW !
    0