Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

java Audio

2 réponses
Avatar
tatane
Bonour,

Avant sur un jre 1.4 javais crée une classe audio qui fonctionnait très
bien. A présent avec java 1.5,

java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)

Cette classe fonctionne mais mais juste avec un seul objet et pour une
seule lecture d'un fichier audio. J'aimerai savoir, j'ai recherché sans
avoir trouvé comment faire pour quelle fontionne correctement.

Le message d'érreur :
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported.

Qui me semble n'avoir pas de rapport avec mon sousis.

J'utilise GNU/Debian Linux i686 Etch, je n'ai pas fait l'essai sur un
autre OS.

Merci.

Le code :

* Created on 8 févr. 2004

package audio;

import java.net.URL;

/**
* PlayWave est une classe qui permet de jouer des fichiers audio.
*
* @author Stéphane Joly.
* @version version beta1.0.1
* GPL Code
*/
public class PlayWave {

private String bruit_;

private Clip co_;

private double volume_;

private String REPDATAS = "";

/**
* Constructeur implicite.
*
*/
public PlayWave() {

} // Fin du constructeur par défaut.

/**
* Constructeur avec passage d'un chemin vers le fichier audio.
*
* @param chemin
* du fichier audio.
*/
public PlayWave(String son) {

this(son, 1D);

} // Fin du constructeur PlayWave(String son).

/**
* Constructeur avec passage d'un chemin vers le fichier audio est ainsi que
* le volume entre 0.00 et 1.00
*
* @param son
* @param volume
*/
public PlayWave(String son, double volume) {

this.bruit_ = REPDATAS + son;
this.volume_ = volume;
this.init();

} // Fin du constructeur PlayWave(String son, double volume).

/**
* Méthode pour affecter un son.
*
* @param son
* chemin vers le fichier audio.
*/
public void setWave(String son) {

this.setWave(son, 1D);

} // Fin de la méthode playWave(String son).

/**
* Méthode avec passage d'un chemin vers le fichier audio est ainsi que le
* volume entre 0.00 et 1.00
*
* @param son
* @param volume
*/
public void setWave(String son, double volume) {

this.bruit_ = REPDATAS + son;
this.volume_ = volume;
this.init();

} // Fin de la méthode playWave(String son, double volume).

/**
* Methode d'initialisation de la classe PlayWave.
*
*/
private void init() {

try {

URL url = getClass().getResource(this.bruit_);
AudioInputStream is = AudioSystem.getAudioInputStream(url);
AudioFormat format = is.getFormat();

DataLine.Info info = new DataLine.Info(Clip.class, is.getFormat(),
((int) is.getFrameLength() * format.getFrameSize()));

this.co_ = (Clip) AudioSystem.getLine(info);
this.co_.open(is);
is.close();

} catch (Exception exception) {

System.err.println("Pb de lecture du fichier: " + bruit_ + " "
+ exception);

}

// this.setVolume(this.volume_);

} // Fin de la méthode d'initialisation init().

/**
* Methode pour revenir au début du fichier audio.
*
* @return rien du tout.
*/
public void vaAuDebut() {

this.co_.setFramePosition(0);

} // Fin de la méthode vaAuDebut().

/**
* Methode pour lire le fichier audio.
*
*/
public boolean play() {

if (this.volume_ == 0) {

return false;

} else {

if (!this.co_.isRunning()) {

this.vaAuDebut();
this.co_.start();

}

return true;

}

} // Fin de la méthode boolean play().

/**
* Methode pour tuer le thread son.
*
*/
public void stop() {

try {

while (!this.co_.isRunning()) {

this.co_.close();

}

} catch (Exception exception) {

System.err.println("Problème de fermeture du fichier Audio: "
+ this.bruit_ + " " + exception);

}

System.gc();

} // Fin de la méthode stop().

/**
* Méthode pour régler le volume du fichier audio.
*
* @param volume
*/
public void setVolume(double volume) {

// Set Volume
this.volume_ = volume;
FloatControl gainControl = (FloatControl) this.co_
.getControl(FloatControl.Type.MASTER_GAIN);
double gain = volume; // number between 0 and 1 (loudest)
float dB = (float) (Math.log(gain) / Math.log(10.0) * 20.0);
gainControl.setValue(dB);

} // Fin de la méthode void setVolume(double volume).

// Méthode de test.
public static void main(String[] args) {

PlayWave test1 = new PlayWave("/datas/sons/onLine.wav", 0.3D);
PlayWave test2 = new PlayWave("/datas/sons/offLine.wav", 0.3D);
// test1.setVolume(1D);// 1 decibel
// test1.play();

} // Fin de la méthode de test.

} // Fin dela la classe PlayWa

2 réponses

Avatar
Olivier Girant
tatane wrote:
Bonour,

Avant sur un jre 1.4 javais crée une classe audio qui fonctionnait très
bien. A présent avec java 1.5,

java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)

Cette classe fonctionne mais mais juste avec un seul objet et pour une
seule lecture d'un fichier audio. J'aimerai savoir, j'ai recherché sans
avoir trouvé comment faire pour quelle fontionne correctement.

Le message d'érreur :
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported.

Qui me semble n'avoir pas de rapport avec mon sousis.

J'utilise GNU/Debian Linux i686 Etch, je n'ai pas fait l'essai sur un
autre OS.


Bonjour,

Je ne connais pas les subtiles différences entre java 1.4 et java 1.5 au
niveau audio, on dirait que java 1.5 supporte moins de format audio.
Essaie de convertir tes fichiers audio dans un format plus "commun" par
exemple 16 bits, mono, little-endian mais 24 KHz ou 32 ou 44.1 ou 48.
Audacity sous Linux sait très bien faire ce rééchantillonnage.

oliv

Avatar
tatane
Bonjour Oliver,

Que je suis bête :)
J'avais bien sûr fait l'essai avec Audacity, c'est pour cela que j'avais
noté que le problème ne venait pas de là. En fait, je viens de remarquer
que java utilise oss et non alsa (y a peut être un truc à changer). Comme
oss n'etait pas actif sur la machine ou les tests étaient effectués bien
que le son soit opérationnel, j'avais ce genre de comportement.

Merci tout de même d'avoir donné une réponse.

Stéphane.