25669bb667
Reviewed-by: kizune, serb, aivanov
200 lines
7.4 KiB
Java
200 lines
7.4 KiB
Java
/*
|
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
import java.util.List;
|
|
|
|
import javax.sound.sampled.AudioFormat;
|
|
import javax.sound.sampled.AudioSystem;
|
|
import javax.sound.sampled.Clip;
|
|
import javax.sound.sampled.DataLine;
|
|
import javax.sound.sampled.Line;
|
|
import javax.sound.sampled.Mixer;
|
|
import javax.sound.sampled.Port;
|
|
import javax.sound.sampled.SourceDataLine;
|
|
import javax.sound.sampled.TargetDataLine;
|
|
import javax.sound.sampled.spi.MixerProvider;
|
|
|
|
import com.sun.media.sound.JDK13Services;
|
|
|
|
/**
|
|
* @test
|
|
* @key sound
|
|
* @bug 4776511
|
|
* @summary RFE: Setting the default MixerProvider. Test the retrieving of lines
|
|
* with defaut mixer properties.
|
|
* @modules java.desktop/com.sun.media.sound
|
|
*/
|
|
public class DefaultMixers {
|
|
|
|
private static final String ERROR_PROVIDER_CLASS_NAME = "abc";
|
|
private static final String ERROR_INSTANCE_NAME = "def";
|
|
|
|
private static final Class[] lineClasses = {
|
|
SourceDataLine.class,
|
|
TargetDataLine.class,
|
|
Clip.class,
|
|
Port.class,
|
|
};
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
boolean allOk = true;
|
|
Mixer.Info[] infos;
|
|
|
|
out("Testing Mixers retrieved via AudioSystem");
|
|
infos = AudioSystem.getMixerInfo();
|
|
allOk &= testMixers(infos, null);
|
|
|
|
out("Testing MixerProviders");
|
|
List providers = JDK13Services.getProviders(MixerProvider.class);
|
|
for (int i = 0; i < providers.size(); i++) {
|
|
MixerProvider provider = (MixerProvider) providers.get(i);
|
|
infos = provider.getMixerInfo();
|
|
allOk &= testMixers(infos, provider.getClass().getName());
|
|
}
|
|
|
|
if (! allOk) {
|
|
throw new Exception("Test failed");
|
|
} else {
|
|
out("Test passed");
|
|
}
|
|
}
|
|
|
|
private static boolean testMixers(Mixer.Info[] infos,
|
|
String providerClassName) {
|
|
boolean allOk = true;
|
|
|
|
for (int i = 0; i < infos.length; i++) {
|
|
Mixer mixer = null;
|
|
try {
|
|
mixer = AudioSystem.getMixer(infos[i]);
|
|
} catch (NullPointerException e) {
|
|
out("Exception thrown; Test NOT failed.");
|
|
e.printStackTrace();
|
|
}
|
|
for (int j = 0; j < lineClasses.length; j++) {
|
|
if (mixer.isLineSupported(new Line.Info(lineClasses[j]))) {
|
|
allOk &= testMixer(mixer, lineClasses[j],
|
|
providerClassName);
|
|
}
|
|
}
|
|
}
|
|
return allOk;
|
|
}
|
|
|
|
private static boolean testMixer(Mixer mixer, Class lineType,
|
|
String providerClassName) {
|
|
boolean allOk = true;
|
|
String instanceName = mixer.getMixerInfo().getName();
|
|
|
|
// no error
|
|
allOk &= testMixer(mixer, lineType,
|
|
providerClassName, instanceName);
|
|
|
|
// erroneous provider class name, correct instance name
|
|
allOk &= testMixer(mixer, lineType,
|
|
ERROR_PROVIDER_CLASS_NAME, instanceName);
|
|
|
|
// erroneous provider class name, no instance name
|
|
allOk &= testMixer(mixer, lineType,
|
|
ERROR_PROVIDER_CLASS_NAME, "");
|
|
|
|
// erroneous provider class name, erroneous instance name
|
|
allOk &= testMixer(mixer, lineType,
|
|
ERROR_PROVIDER_CLASS_NAME, ERROR_INSTANCE_NAME);
|
|
|
|
return allOk;
|
|
}
|
|
|
|
private static boolean testMixer(Mixer mixer, Class lineType,
|
|
String providerClassName,
|
|
String instanceName) {
|
|
boolean allOk = true;
|
|
|
|
try {
|
|
String propertyValue = (providerClassName != null) ? providerClassName: "" ;
|
|
propertyValue += "#" + instanceName;
|
|
out("property value: " + propertyValue);
|
|
System.setProperty(lineType.getName(), propertyValue);
|
|
Line line = null;
|
|
Line.Info info = null;
|
|
Line.Info[] infos;
|
|
AudioFormat format = null;
|
|
if (lineType == SourceDataLine.class || lineType == Clip.class) {
|
|
infos = mixer.getSourceLineInfo();
|
|
format = getFirstLinearFormat(infos);
|
|
info = new DataLine.Info(lineType, format);
|
|
} else if (lineType == TargetDataLine.class) {
|
|
infos = mixer.getTargetLineInfo();
|
|
format = getFirstLinearFormat(infos);
|
|
info = new DataLine.Info(lineType, format);
|
|
} else if (lineType == Port.class) {
|
|
/* Actually, a Ports Mixer commonly has source infos
|
|
as well as target infos. We ignore this here, since we
|
|
just need a random one. */
|
|
infos = mixer.getSourceLineInfo();
|
|
for (int i = 0; i < infos.length; i++) {
|
|
if (infos[i] instanceof Port.Info) {
|
|
info = infos[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
out("Line.Info: " + info);
|
|
line = AudioSystem.getLine(info);
|
|
out("line: " + line);
|
|
if (! lineType.isInstance(line)) {
|
|
out("type " + lineType + " failed: class should be '" +
|
|
lineType + "' but is '" + line.getClass() + "'!");
|
|
allOk = false;
|
|
}
|
|
} catch (Exception e) {
|
|
out("Exception thrown; Test NOT failed.");
|
|
e.printStackTrace();
|
|
}
|
|
return allOk;
|
|
}
|
|
|
|
private static AudioFormat getFirstLinearFormat(Line.Info[] infos) {
|
|
for (int i = 0; i < infos.length; i++) {
|
|
if (infos[i] instanceof DataLine.Info) {
|
|
AudioFormat[] formats = ((DataLine.Info) infos[i]).getFormats();
|
|
for (int j = 0; j < formats.length; j++) {
|
|
AudioFormat.Encoding encoding = formats[j].getEncoding();
|
|
int sampleSizeInBits = formats[j].getSampleSizeInBits();
|
|
if (encoding.equals(AudioFormat.Encoding.PCM_SIGNED) &&
|
|
sampleSizeInBits == 16 ||
|
|
encoding.equals(AudioFormat.Encoding.PCM_UNSIGNED) &&
|
|
sampleSizeInBits == 16) {
|
|
return formats[j];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static void out(String message) {
|
|
System.out.println(message);
|
|
}
|
|
}
|