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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/**
* la boucle principale déclenchée par l'appel thread.start() de la méthode
* startPlayback()
*
* Etat == STOPPED => Fin du thread et libérer les ressources audio
* Etat == PLAYING => Le flux audio est envoyé vers la sortie
* Etat == PAUSED => Attendre un nouvel état
*/
public void run()
{
// pour pouvoir rentrer dans la boucle, nBytesRead est passé à 1
int nBytesRead = 1;
// un tableau de 16000 octets
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
// bloquer le flux pendant la lecture
synchronized (this.audioInputStream)
// synchronized (this.sortieSon)
{
// la boucle play/pause
// tant que le son n'est pas arrêté et qu'il y a des octets lus
while ((nBytesRead != -1) && (this.etat != LecteurEvent.STOPPED)
&& (this.etat != LecteurEvent.UNKNOWN))
{
// si on est en pause, on ne fait rien mais le thread n'est pas
// arrêté
if (this.etat == LecteurEvent.PLAYING)
{
// Play.
try
{
// On ne saute des octets qu'avant une lecture. Donc
// quand on veut sauter N octets
// on place N dans nbBytesSkip et on les saute juste
// avant de lire la suite.
if (this.nbByteSkip > 0)
{
this.audioInputStream.skip(this.nbByteSkip);
this.nbByteSkip = 0;
}
// read(T[], x, N) avec T[], un tableau d'octet, x et N
// des entiers.
// On lit un maximum de N octets qui sont stockés dans
// le tableau.
// T[x] stocke le premier octet lu.
nBytesRead = this.audioInputStream.read(abData, 0,
abData.length);
if (nBytesRead >= 0)
{
// on écrit les octets sur la sortie son
this.sortieSon.write(abData, 0, nBytesRead);
// on informe les listeners
Iterator<LecteurListener> it = this.listeners
.iterator();
while (it.hasNext())
{
LecteurListener listener = (LecteurListener) it
.next();
if (this.audioInputStream instanceof PropertiesContainer)
{
Map<?,?> proprietes = ((PropertiesContainer) this.audioInputStream)
.properties();
long x = (Long) proprietes
.get("mp3.position.microseconds");
// uniquement pour indiquer la progression
// du lecteur)
listener.progress(x);
}
else
throw new LecteurException(
"impossible d'obtenir la progression de la lecture");
}
}
}
catch (IOException e)
{
// si une exception est levée, on arrête le lecteur
this.etat = LecteurEvent.STOPPED;
// et on prévient les listeners
notifyEvent(LecteurEvent.STOPPED);
e.printStackTrace();
}
catch (LecteurException e)
{
e.printStackTrace();
}
}
else
{
// Pause, on attend une seconde
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{}
}
}
// Libérer les ressources car la lecture est finie
if (this.sortieSon != null)
{
this.sortieSon.drain();
this.sortieSon.stop();
this.sortieSon.close();
this.sortieSon = null;
}
// Notification of "End Of Media"
if (nBytesRead == -1)
{
closeStream();
this.etat = LecteurEvent.EOM;
notifyEvent(LecteurEvent.EOM);
}
// fermeture du flux
}
this.etat = LecteurEvent.STOPPED;
// informer de l'arrêt
notifyEvent(LecteurEvent.STOPPED);
} |
Partager