public class Music extends Thread { private String fileName; private final int EXTERNAL_BUFFER_SIZE = 524288; public Music(String wavFile) { this.fileName = wavFile; } @SuppressWarnings("unused")//to suppress warnings relative to unused code public void run() { File soundFile = new File(fileName); // 播放音乐的文件名 if (!soundFile.exists()) { System.err.println("Wave file not found:" + fileName); return; } while (true) { // 设置循环播放 AudioInputStream audioInputStream = null; // 创建音频输入流对象 try { audioInputStream = AudioSystem.getAudioInputStream(soundFile); // 创建音频对象 } catch (UnsupportedAudioFileException e1) { e1.printStackTrace(); return; } catch (IOException e1) { e1.printStackTrace(); return; } AudioFormat format = audioInputStream.getFormat(); // 音频格式 SourceDataLine auline = null; // 源数据线 DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try { auline = (SourceDataLine) AudioSystem.getLine(info); auline.open(format); } catch (LineUnavailableException e) { e.printStackTrace(); return; } catch (Exception e) { e.printStackTrace(); return; } if (auline.isControlSupported(FloatControl.Type.PAN)) { FloatControl pan = (FloatControl) auline.getControl(FloatControl.Type.PAN); } auline.start(); int nBytesRead = 0; byte[] abData = new byte[EXTERNAL_BUFFER_SIZE]; try { while (nBytesRead != -1) { nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead >= 0) auline.write(abData, 0, nBytesRead); } } catch (IOException e) { e.printStackTrace(); return; } finally { auline.drain(); // auline.close(); } } } }请帮我梳理这段代码的逻辑
时间: 2023-06-05 14:07:04 浏览: 111
详谈PHP中public,private,protected,abstract等关键字的用法
这段代码定义了一个名为Music的类,它继承了Thread类,实现了音乐播放的功能。其中,类的成员变量fileName表示音乐文件的名称,EXTERNAL_BUFFER_SIZE表示字节数组的长度。在该类中,包含一个构造方法来初始化fileName的值。run()方法被重写,主要用于循环播放音乐。在该方法中,首先判断音乐文件是否存在,若不存在,则打印错误信息然后结束循环;音频输入流对象被创建,然后获取音频格式信息并创建一个源数据线;控制类型支持浮点控制类型则设置音频信号的平衡;打开源数据线,启动线程并读取音频文件的字节数据,写入到源数据线中进行播放。在try语句块最后,调用auline.drain() 来清空所有数据而不关闭源数据线。
阅读全文