Bonjour,
Je suis entrain de faire un lecteur/éditeur audio pour mon projet de fin d'année.
Pour pouvoir intérargir avec l'interface graphique tout en lisant un son, j'ai ajouté un thread en suivant la méthode décrite ici et grâce à l'aide de yan ici. Mon thread fonctionne bien dans le sens où je peux accéder à l'interface graphique pendant la lecture mais maintenant mon son est hachuré.
Yan m'a envoyé vers ce lien, mais c'est pour les sons ogg. J'ai regardé si je pouvais pas trouver quelque chose pour les sons wav mais sans succès.
PlayerThread.h
PlayerThread.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #ifndef PLAYERTHREAD_H #define PLAYERTHREAD_H #include <QThread> #include <al.h> #include <alc.h> #include "PlayerAL.h" class PlayerThread : public QThread{ Q_OBJECT private : PlayerAL player; protected: void run(); public: void loadBuffer(const std::string &); void changeVolume(ALfloat); void changeBalance(int); void setCurrentBuffer(int); bool isPlaying(); signals: void previousBuffer(); void play(); void pause(); void stop(); void nextBuffer(); }; #endif // PLAYERTHREAD_H
Player.cpp (partie de la lecture)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include "PlayerThread.h" using namespace std; void PlayerThread::run(){ connect(this,SIGNAL(previousBuffer()),&player,SLOT(previousBuffer())); connect(this,SIGNAL(play()),&player,SLOT(play())); connect(this,SIGNAL(pause()),&player,SLOT(pause())); connect(this,SIGNAL(stop()),&player,SLOT(stop())); connect(this,SIGNAL(nextBuffer()),&player,SLOT(nextBuffer())); exec(); } void PlayerThread::loadBuffer(const string & path){ player.loadBuffer(path); } void PlayerThread::changeVolume(ALfloat value){ player.changeVolume(value); } void PlayerThread::changeBalance(int value){ player.changeBalance(value); } void PlayerThread::setCurrentBuffer(int index){ player.setCurrentBuffer(index); } bool PlayerThread::isPlaying(){ return player.isPlaying(); }
Ici j'ai une liste de buffers qui représente les sons ouverts, je lie le buffer courant (celui sélectionné par l'utilisateur) à la source puis je le lis et je le retire de la source pour éviter d'avoir une playlist.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void PlayerAL::play(){ if(!buffers.empty()){ alSourcei(source,AL_BUFFER,buffers[currentBuffer]); alSourcePlay(source); playing=true; alSourceUnqueueBuffers(source,1,&buffers[currentBuffer]); playing=false; } }
Merci d'avance
Olivier
Partager