Bonjour a tous,
j'ai un gros probleme que je ne sais comment résoudre.
J'ai une class java qui me permet de gerer la lecture d'un son. Cette class fonctionne trés bien sous windows, mais ne fonctionne pas du tout sous linux.
Voici sont code:
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
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 package Polyominos; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.BooleanControl; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Mixer; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; import javax.swing.ImageIcon; /** * Class qui va permettre la lecture de la musique * @author XXXXXXXXXX * */ public class Sound implements Runnable { /** * Variable contenant le son a jouer */ private SourceDataLine line; /** * Variable contenant le flux audio d'entree */ private AudioInputStream fluxAudio; /** * variable contenant le format audio du flux d'entree */ private AudioFormat audioFormat; /** * boolean permettant l'arret de la lecture */ private boolean stop = false; /** * Objet contenant les different reglage de son possible (sourdine, reverb, etc ...) */ private Mixer mixer=null; /** * Controlleur de sourdine */ private BooleanControl mute; /** * Controlleur de balance */ private FloatControl balanceControl; /** * Objet permettant la mise a jour de l'IHM */ private Gestion g; /** * Constructeur du lecteur de la musique */ public Sound() { // on place le boolean d'arret a false stop = false; try { // recuperation d'un flux audio a partir du fichier wav contenu dans // le classPath fluxAudio = AudioSystem.getAudioInputStream(getClass() .getClassLoader().getResourceAsStream( "resources/tetris.wav")); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //Recherche du mixer logiciel Java Sound Audio Engine for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) { if (mixerInfo.getName().compareTo("Java Sound Audio Engine") == 0) { mixer = AudioSystem.getMixer(mixerInfo); break; } } //ici mixer == null sous linux, donc, la suite du code plante... // recuperation du format audio du flux audioFormat = fluxAudio.getFormat(); // permet de pouvoir definir des actions sur le flux // (demarre/pause/arret) DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); try { // on recupere la ligne de sortie son que nous voulons line = (SourceDataLine) mixer.getLine(info); } catch (LineUnavailableException e) { e.printStackTrace(); } //Recuperation du controlleur de sourdine if (line.isControlSupported(BooleanControl.Type.MUTE)) { mute = (BooleanControl) line .getControl(BooleanControl.Type.MUTE); } //recuperation du controlleur de balance if (line.isControlSupported(FloatControl.Type.PAN)) { balanceControl = (FloatControl) line.getControl(FloatControl.Type.PAN); } } /** * Methode permettant de lancer la lecture de la musique */ public void run() { //lancement de la lecture lecture(); //une fois la lecture termine on replace les bouton dans les etats initiaux resetAffichage(); } /** * Fonction qui passe l'objet de l'IHM pour les mise a jour * @param g Objet de l'ihm */ public void setGestion(Gestion g){ this.g=g; } /** * Fonction qui retourne le controleur de balance * @return le controleur de balance */ public FloatControl getBalanceControl() { return balanceControl; } /** * Methode permettant de couper la lecture du son */ public void stop() { stop = true; } public Mixer getMixer(){ return mixer; } /** * Fonction qui retourne le controleur de sourdine * @return le controleur de sourdine */ public BooleanControl getMute() { return mute; } /** * Fonction qui replace l'IHM aux etats initiaux */ private void resetAffichage(){ g.play.setEnabled(true); g.stop.setEnabled(false); g.balance.setValue(0); g.balance.setEnabled(false); g.mute.setIcon(new ImageIcon(getClass().getResource("/resources/son.png"))); g.mute.setEnabled(false); g.isMute=false; } /** * Methode effectuant la lecture du son */ private void lecture() { // Ouverture de la source du son a jouer try { line.open(audioFormat); } catch (LineUnavailableException e) { e.printStackTrace(); } // redirection du flux son vers la carte son line.start(); // lecture du stream audio (lecture d'inputStream standard) try { byte bytes[] = new byte[1024]; int bytesRead = 0; while (((bytesRead = fluxAudio.read(bytes, 0, bytes.length)) != -1) && !stop) { line.write(bytes, 0, bytesRead); } } catch (IOException io) { io.printStackTrace(); } // on ferme la source du son line.close(); } }
Le probleme ce situe dans le constructeur au niveau de la récupération d'un mixer.
Avez vous une idée pour résoudre ce problème trés gênant ?
Je vous remercie d'avance pour votre aide![]()
Partager