質問編集履歴

2

タイトルの一部を変更しました。(「メモリ解放したい」→「closeしたい」)

2021/01/04 14:36

投稿

pami
pami

スコア4

test CHANGED
@@ -1 +1 @@
1
- 使い終えたjavax.sound.sampled.Clipを自動でメモリ解放したい。
1
+ 使い終えたjavax.sound.sampled.Clipを自動でcloseしたい。
test CHANGED
File without changes

1

MusicPlayerクラスを呼び出すMusicPlayerManagerクラスのコードを追記しました。また、助言を受けて試したことの結果を追記しました。

2021/01/04 14:36

投稿

pami
pami

スコア4

test CHANGED
File without changes
test CHANGED
@@ -186,7 +186,149 @@
186
186
 
187
187
 
188
188
 
189
- MusicPlayerのインスタンスは他のクラスで生成され、のクラスのArrayListに格納・保持されています。
189
+ MusicPlayerのインスタンスはMusicPlayerManagerクラスで生成され、のクラスのArrayListに格納・保持されています。
190
+
191
+
192
+
193
+ MusicPlayerManager.java
194
+
195
+ ```Java
196
+
197
+ import java.util.ArrayList;
198
+
199
+ import java.util.Queue;
200
+
201
+ import java.util.ArrayDeque;
202
+
203
+ import javax.sound.sampled.Clip;
204
+
205
+
206
+
207
+ public class MusicPlayerManager {
208
+
209
+
210
+
211
+ private static ArrayList<String> filePathList;
212
+
213
+ private static ArrayList<MusicPlayer> musicPlayers;
214
+
215
+ private static RhythmManager rhythmManager;
216
+
217
+
218
+
219
+ // 何番にPlay指示が出たかを一時保管し、リズムに合わせて処理するためのバッファ
220
+
221
+ private static Queue<Integer> orderBuffer;
222
+
223
+
224
+
225
+ public MusicPlayerManager() {
226
+
227
+
228
+
229
+ filePathList = new ArrayList<String>();
230
+
231
+ musicPlayers = new ArrayList<MusicPlayer>();
232
+
233
+ rhythmManager = new RhythmManager(150);
234
+
235
+ orderBuffer = new ArrayDeque<>();
236
+
237
+ }
238
+
239
+
240
+
241
+ public MusicPlayerManager(String[] filePath) {
242
+
243
+
244
+
245
+ this();
246
+
247
+ for(String filePath_ : filePath) {
248
+
249
+ filePathList.add(filePath_);
250
+
251
+ }
252
+
253
+ }
254
+
255
+
256
+
257
+ public MusicPlayerManager(ArrayList<String> filePath) {
258
+
259
+
260
+
261
+ this();
262
+
263
+ for(String filePath_ : filePath) {
264
+
265
+ filePathList.add(filePath_);
266
+
267
+ }
268
+
269
+ }
270
+
271
+
272
+
273
+ public void Play(int fileNum) {
274
+
275
+
276
+
277
+ // 処理待機バッファ内のfileNumの重複を避ける
278
+
279
+ if(!orderBuffer.contains(fileNum))
280
+
281
+ orderBuffer.add(fileNum);
282
+
283
+ }
284
+
285
+
286
+
287
+ public void AddFile(String filePath) {
288
+
289
+
290
+
291
+ filePathList.add(filePath);
292
+
293
+ }
294
+
295
+
296
+
297
+ public int GetFileTotalNum() {
298
+
299
+
300
+
301
+ return filePathList.size();
302
+
303
+ }
304
+
305
+
306
+
307
+ // RhythmManagerに呼び出されるメソッド
308
+
309
+ // リズムに合わせて一定間隔で呼び出される
310
+
311
+ public static void PlayAllInOrderBuffer()
312
+
313
+ {
314
+
315
+ // キューの先頭を取得し削除しながらループする
316
+
317
+ while(orderBuffer.peek() != null)
318
+
319
+ {
320
+
321
+ int buf = orderBuffer.poll();
322
+
323
+ musicPlayers.add(new MusicPlayer(filePathList.get(buf)));
324
+
325
+ }
326
+
327
+ }
328
+
329
+ }
330
+
331
+ ```
190
332
 
191
333
 
192
334
 
@@ -198,6 +340,92 @@
198
340
 
199
341
  - javax.swing.TimerとActionListenerを用いて同様のプログラムを作成しましたが、動作は大差ありませんでした。
200
342
 
343
+ - m-oguraさんの助言を受け、try-with-resourcesを用いてMusicPlayer.javaを下のように修正しましたが、タスクマネージャーでOpenJDK Platform binaryアプリ(起動中のアプリ)のメモリを監視したところ、音が鳴るたびにメモリ量は増え続けており、ストリームはclose出来ていないようでした。
344
+
345
+ ```Java
346
+
347
+ import java.io.File;
348
+
349
+ import javax.sound.sampled.AudioFormat;
350
+
351
+ import javax.sound.sampled.AudioInputStream;
352
+
353
+ import javax.sound.sampled.AudioSystem;
354
+
355
+ import javax.sound.sampled.DataLine;
356
+
357
+ import javax.sound.sampled.Clip;
358
+
359
+
360
+
361
+ // Exceptions
362
+
363
+ import java.io.IOException;
364
+
365
+ import javax.sound.sampled.LineUnavailableException;
366
+
367
+ import javax.sound.sampled.UnsupportedAudioFileException;
368
+
369
+
370
+
371
+ public class MusicPlayer
372
+
373
+ {
374
+
375
+ public MusicPlayer(String filePath)
376
+
377
+ {
378
+
379
+ LoadClipPlayer(filePath);
380
+
381
+ }
382
+
383
+
384
+
385
+ private static void LoadClipPlayer(String filePath) {
386
+
387
+
388
+
389
+ try(AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filePath));)
390
+
391
+ {
392
+
393
+ AudioFormat format = stream.getFormat();
394
+
395
+ DataLine.Info dataLine = new DataLine.Info(Clip.class, format);
396
+
397
+ Clip clip = (Clip)AudioSystem.getLine(dataLine);
398
+
399
+ clip.open(stream);
400
+
401
+ clip.start();
402
+
403
+ }
404
+
405
+ catch(UnsupportedAudioFileException e) {
406
+
407
+ e.printStackTrace();
408
+
409
+ }
410
+
411
+ catch(LineUnavailableException e) {
412
+
413
+ e.printStackTrace();
414
+
415
+ }
416
+
417
+ catch(IOException e) {
418
+
419
+ e.printStackTrace();
420
+
421
+ }
422
+
423
+ }
424
+
425
+ }
426
+
427
+ ```
428
+
201
429
 
202
430
 
203
431
  ### 補足情報(FW/ツールのバージョンなど)