[英]How to change Master Volume with Java?
我正在嘗試編寫一個小程序,以便更改給定設備的主卷。 目前它看起來像這樣
import java.util.*;
import javax.sound.sampled.*;
public class VolumeControl {
public static void main(String[] args) throws Exception {
Mixer mixer = findMixer(args[0]);
changeVolume(mixer, Integer.valueOf(args[1]));
}
private static Mixer findMixer(String name) {
Mixer.Info mixerInfo = Arrays.stream(AudioSystem.getMixerInfo())
.filter(info -> name.equals(info.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(String.format("no mixer with the name '%s' found", name)));
return AudioSystem.getMixer(mixerInfo);
}
private static void changeVolume(Mixer mixer, int level) throws LineUnavailableException {
for(Line.Info info : mixer.getSourceLineInfo()) {
try(Line line = mixer.getLine(info)) {
if (!line.isOpen()) line.open();
FloatControl control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
control.setValue(limit(control.getMinimum(), control.getMaximum(), (float) level));
}
}
}
private static float limit(float min, float max, float level) {
return Math.min(max, Math.max(min, level));
}
}
當我用我的設備名編譯並運行它時,我總是得到以下異常
Exception in thread "main" java.lang.IllegalArgumentException: illegal call to open() in interface Clip
at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(Unknown Source)
at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
at VolumeControl.changeVolume(VolumeControl.java:23)
at VolumeControl.main(VolumeControl.java:9)
我做錯了嗎? 我在互聯網上搜索了這個錯誤,但沒有找到任何有用的東西。
我怎樣才能擺脫這個例外和/或理解這實際意味着什么?
我已經更新了我的代碼。 現在看起來像這樣
import java.util.*;
import javax.sound.sampled.*;
public class VolumeControl {
public static void main(String[] args) throws Exception {
Mixer mixer = findMixer(args[0]));
changeVolume(mixer, Integer.valueOf(args[1]));
}
private static Mixer findMixer(String name) {
Mixer.Info mixerInfo = Arrays.stream(AudioSystem.getMixerInfo())
.filter(info -> name.equals(info.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(String.format("no mixer with the name '%s' found", name)));
return AudioSystem.getMixer(mixerInfo);
}
private static void changeVolume(Mixer mixer, int level) throws LineUnavailableException {
for(Line.Info info : mixer.getSourceLineInfo()) {
Line line = mixer.getLine(info);
boolean shouldOpen = !(line.isOpen() || line instanceof Clip);
try {
if (shouldOpen) line.open();
FloatControl control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
control.setValue(limit(control.getMinimum(), control.getMaximum(), (float) level));
} finally {
if (shouldOpen) {
line.close();
}
}
}
}
private static float limit(float min, float max, float level) {
return Math.min(max, Math.max(min, level));
}
}
現在我沒有得到任何例外,但主音量無論如何都不會改變。
我也嘗試使用mixer.getTargetLineInfo(),但音量也沒有改變。
我在Windows Vista中看到了一個新的聲音架構,所以我嘗試創建一個exe文件並在Windows XP兼容模式下運行它,結果相同。
經過一些研究,我發現這個課程 - 正如預期的那樣 - 也沒有用。 當getMasterOutputLine()方法返回null時,它給了我一個null的主卷。
我沒有膠水下一步做什么:(也許你們中的任何人都可以給我一些提示甚至是SSCCE。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.