SFML - Mettre en pause un enregistrement audio

Résolu/Fermé
MemeTech Messages postés 88 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 7 janvier 2021 - 3 oct. 2019 à 21:39
MemeTech Messages postés 88 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 7 janvier 2021 - 10 nov. 2019 à 18:49
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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
4 oct. 2019 à 07:46
'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
MemeTech Messages postés 88 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 7 janvier 2021 1
4 oct. 2019 à 15:37
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
MemeTech Messages postés 88 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 7 janvier 2021 1
10 nov. 2019 à 16:22
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
MemeTech Messages postés 88 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 7 janvier 2021 1
10 nov. 2019 à 18:49
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