Atitit java播放 wav MIXER 混响器编程 目录 1.1. MIXER 混响器编程 1 1.2. 得到系统中一共有多少个混音器设备: 1 1.3. 接口摘要 1 1.4. 调节音量

Atitit java播放 wav  MIXER 混响器编程

 

目录

1.1. MIXER 混响器编程 1

1.2. 得到系统中一共有多少个混音器设备: 1

1.3. 接口摘要 1

1.4. 调节音量 2

1.5. Code /bookmarksHtmlEverythingIndexPrj/src/apkg/soundPlay.java 3

 

 

    1. MIXER 混响器编程

2013年10月14日 17:17:24 fakine 阅读数:3632

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fakine/article/details/12711779

    1. 得到系统中一共有多少个混音器设备:


(在一般的系统中只有一块声卡,所以返回的值应该为1;我的系统中装有一块PIC创新声卡,一块主板载C-media声卡,还安装了Totalrecorder软件,所以返回值是3)
int devnum=::mixerGetNumDevs();

 

    1. 接口摘要

Clip

Clip 接口表示特殊种类的数据行,该数据行的音频数据可以在回放前加载,而不是实时流出。

DataLine

DataLine 将与介质相关的功能添加到其超接口 Line

Line

Line 接口表示单声道或多声道音频供给。

LineListener

可以注册实现 LineListener 接口的类的实例来接收行状态更改时发生的事件。

Mixer

混频器是一个具有一行或多行的音频设备。

Port

端口是往返于音频输入或输出线与音频设备之间的简单线路。

SourceDataLine

源数据行是可以写入数据的数据行。

TargetDataLine

目标数据行是可以从中读取音频数据的某种类型的 DataLine

 

 

    1. 调节音量
  1.     sline.open();                  
  2.         FloatControl volctrl=(FloatControl)sline.getControl(FloatControl.Type.MASTER_GAIN);   
  3. volctrl.setValue(newVal);// newVal - the value of volume slider  

 也就是说,必须开始播放,得到了播放的DataLine以后才可以得到Control信息.

我这么做了,的到

Master Gain with current value: 0.0 dB (range: -80.0 - 6.0206)

不太懂dB是怎么算的,反正默认值为0,也就是说,向正(增大音量)只能移动6个单位.对于一个JSlider来说,实在太小距离了.

 

 

混音与Java(不带混合机

 

    1. Code /bookmarksHtmlEverythingIndexPrj/src/apkg/soundPlay.java

private static void playwav(String file) throws  Exception {

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(file));

AudioFormat audioFormat= audioInputStream.getFormat();

 

DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);

SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem

.getLine(info);

 

//AudioFormat audioFormat2= new AudioFormat( 70000, 16, 2, true, false);

sourceDataLine.open(audioFormat); //this audioformat can overwrite last  DataLine.Info.audioFormat

 

 

 

 

sourceDataLine.start();

 

int cnt;

// 读取数据到缓存数据

byte[] tempBuffer = new byte[10000] ;

while ((cnt = audioInputStream.read(tempBuffer, 0, tempBuffer.length)) != -1) {

if (cnt > 0) {

// 播放缓存数据

sourceDataLine.write(tempBuffer, 0, cnt);

}

}

// Block等待临时数据被输出为空

sourceDataLine.drain();

sourceDataLine.close();

 

}

 

API) - IT屋-程序员软件开发技术分享社区.html

原文地址:https://www.cnblogs.com/attilax/p/15197261.html