mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-04 05:00:31 +00:00
Merge
This commit is contained in:
commit
5f47e09d2a
@ -74,8 +74,13 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
this.fGraphicsStatesInt = this.fGraphicsStates.asIntBuffer();
|
||||
this.fGraphicsStatesFloat = this.fGraphicsStates.asFloatBuffer();
|
||||
this.fGraphicsStatesLong = this.fGraphicsStates.asLongBuffer();
|
||||
this.fGraphicsStatesObject = new Object[6]; // clip coordinates + clip types + texture paint image + stroke dash
|
||||
// array + font + font paint
|
||||
this.fGraphicsStatesObject = new Object[8]; // clip coordinates +
|
||||
// clip types +
|
||||
// texture paint image +
|
||||
// stroke dash array +
|
||||
// font + font paint +
|
||||
// linear/radial gradient color +
|
||||
// linear/radial gradient fractions
|
||||
|
||||
// NOTE: All access to the DrawingQueue comes through this OSXSurfaceData instance. Therefore
|
||||
// every instance method of OSXSurfaceData that accesses the fDrawingQueue is synchronized.
|
||||
@ -292,10 +297,10 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
@Native static final int kHintsFractionalMetricsIndex = 46;
|
||||
@Native static final int kHintsRenderingIndex = 47;
|
||||
@Native static final int kHintsInterpolationIndex = 48;
|
||||
// live resizing info
|
||||
@Native static final int kCanDrawDuringLiveResizeIndex = 49;
|
||||
//gradient info
|
||||
@Native static final int kRadiusIndex = 49;
|
||||
|
||||
@Native static final int kSizeOfParameters = kCanDrawDuringLiveResizeIndex + 1;
|
||||
@Native static final int kSizeOfParameters = kRadiusIndex + 1;
|
||||
|
||||
// for objectParameters
|
||||
@Native static final int kClipCoordinatesIndex = 0;
|
||||
@ -304,6 +309,8 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
@Native static final int kStrokeDashArrayIndex = 3;
|
||||
@Native static final int kFontIndex = 4;
|
||||
@Native static final int kFontPaintIndex = 5;
|
||||
@Native static final int kColorArrayIndex = 6;
|
||||
@Native static final int kFractionsArrayIndex = 7;
|
||||
|
||||
// possible state changes
|
||||
@Native static final int kBoundsChangedBit = 1 << 0;
|
||||
@ -329,6 +336,8 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
@Native static final int kColorSystem = 1;
|
||||
@Native static final int kColorGradient = 2;
|
||||
@Native static final int kColorTexture = 3;
|
||||
@Native static final int kColorLinearGradient = 4;
|
||||
@Native static final int kColorRadialGradient = 5;
|
||||
|
||||
// possible gradient color states
|
||||
@Native static final int kColorNonCyclic = 0;
|
||||
@ -522,6 +531,28 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
int lastPaintIndex = 0;
|
||||
BufferedImage texturePaintImage = null;
|
||||
|
||||
void setGradientViaRasterPath(SunGraphics2D sg2d) {
|
||||
if ((this.fGraphicsStatesInt.get(kColorStateIndex) != kColorTexture) || (lastPaint != sg2d.paint) || ((this.fChangeFlag & kBoundsChangedBit) != 0)) {
|
||||
PaintContext context = sg2d.paint.createContext(sg2d.getDeviceColorModel(), userBounds, userBounds, sIdentityMatrix, sg2d.getRenderingHints());
|
||||
WritableRaster raster = (WritableRaster) (context.getRaster(userBounds.x, userBounds.y, userBounds.width, userBounds.height));
|
||||
ColorModel cm = context.getColorModel();
|
||||
texturePaintImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
|
||||
|
||||
this.fGraphicsStatesInt.put(kColorStateIndex, kColorTexture);
|
||||
this.fGraphicsStatesInt.put(kColorWidthIndex, texturePaintImage.getWidth());
|
||||
this.fGraphicsStatesInt.put(kColorHeightIndex, texturePaintImage.getHeight());
|
||||
this.fGraphicsStatesFloat.put(kColortxIndex, (float) userBounds.getX());
|
||||
this.fGraphicsStatesFloat.put(kColortyIndex, (float) userBounds.getY());
|
||||
this.fGraphicsStatesFloat.put(kColorsxIndex, 1.0f);
|
||||
this.fGraphicsStatesFloat.put(kColorsyIndex, 1.0f);
|
||||
this.fGraphicsStatesObject[kTextureImageIndex] = OSXOffScreenSurfaceData.createNewSurface(texturePaintImage);
|
||||
|
||||
this.fChangeFlag = (this.fChangeFlag | kColorChangedBit);
|
||||
} else {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
}
|
||||
|
||||
void setupPaint(SunGraphics2D sg2d, int x, int y, int w, int h) {
|
||||
if (sg2d.paint instanceof SystemColor) {
|
||||
SystemColor color = (SystemColor) sg2d.paint;
|
||||
@ -567,6 +598,75 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
} else {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
} else if (sg2d.paint instanceof LinearGradientPaint) {
|
||||
LinearGradientPaint color = (LinearGradientPaint) sg2d.paint;
|
||||
if (color.getCycleMethod() == LinearGradientPaint.CycleMethod.NO_CYCLE) {
|
||||
if ((this.fGraphicsStatesInt.get(kColorStateIndex) != kColorLinearGradient) || (lastPaint != sg2d.paint)) {
|
||||
|
||||
this.fGraphicsStatesInt.put(kColorStateIndex, kColorLinearGradient);
|
||||
int numColor = color.getColors().length;
|
||||
int colorArray[] = new int[numColor];
|
||||
for (int i = 0; i < numColor; i++) {
|
||||
colorArray[i] = color.getColors()[i].getRGB();
|
||||
}
|
||||
this.fGraphicsStatesObject[kColorArrayIndex] = colorArray;
|
||||
|
||||
int numFractions = color.getFractions().length;
|
||||
float fractionArray[] = new float[numFractions];
|
||||
for (int i = 0; i < numFractions; i++) {
|
||||
fractionArray[i] = color.getFractions()[i];
|
||||
}
|
||||
this.fGraphicsStatesObject[kFractionsArrayIndex] = color.getFractions();
|
||||
|
||||
Point2D p = color.getStartPoint();
|
||||
this.fGraphicsStatesFloat.put(kColorx1Index, (float) p.getX());
|
||||
this.fGraphicsStatesFloat.put(kColory1Index, (float) p.getY());
|
||||
p = color.getEndPoint();
|
||||
this.fGraphicsStatesFloat.put(kColorx2Index, (float) p.getX());
|
||||
this.fGraphicsStatesFloat.put(kColory2Index, (float) p.getY());
|
||||
|
||||
this.fChangeFlag = (this.fChangeFlag | kColorChangedBit);
|
||||
} else {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
} else {
|
||||
setGradientViaRasterPath(sg2d);
|
||||
}
|
||||
} else if (sg2d.paint instanceof RadialGradientPaint) {
|
||||
RadialGradientPaint color = (RadialGradientPaint) sg2d.paint;
|
||||
if (color.getCycleMethod() == RadialGradientPaint.CycleMethod.NO_CYCLE) {
|
||||
if ((this.fGraphicsStatesInt.get(kColorStateIndex) != kColorRadialGradient) || (lastPaint != sg2d.paint)) {
|
||||
|
||||
this.fGraphicsStatesInt.put(kColorStateIndex, kColorRadialGradient);
|
||||
int numColor = color.getColors().length;
|
||||
int colorArray[] = new int[numColor];
|
||||
for (int i = 0; i < numColor; i++) {
|
||||
colorArray[i] = color.getColors()[i].getRGB();
|
||||
}
|
||||
this.fGraphicsStatesObject[kColorArrayIndex] = colorArray;
|
||||
|
||||
int numStops = color.getFractions().length;
|
||||
float stopsArray[] = new float[numStops];
|
||||
for (int i = 0; i < numStops; i++) {
|
||||
stopsArray[i] = color.getFractions()[i];
|
||||
}
|
||||
this.fGraphicsStatesObject[kFractionsArrayIndex] = color.getFractions();
|
||||
|
||||
Point2D p = color.getFocusPoint();
|
||||
this.fGraphicsStatesFloat.put(kColorx1Index, (float) p.getX());
|
||||
this.fGraphicsStatesFloat.put(kColory1Index, (float) p.getY());
|
||||
p = color.getCenterPoint();
|
||||
this.fGraphicsStatesFloat.put(kColorx2Index, (float) p.getX());
|
||||
this.fGraphicsStatesFloat.put(kColory2Index, (float) p.getY());
|
||||
this.fGraphicsStatesFloat.put(kRadiusIndex, color.getRadius());
|
||||
|
||||
this.fChangeFlag = (this.fChangeFlag | kColorChangedBit);
|
||||
} else {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
} else {
|
||||
setGradientViaRasterPath(sg2d);
|
||||
}
|
||||
} else if (sg2d.paint instanceof TexturePaint) {
|
||||
if ((this.fGraphicsStatesInt.get(kColorStateIndex) != kColorTexture) || (lastPaint != sg2d.paint)) {
|
||||
TexturePaint color = (TexturePaint) sg2d.paint;
|
||||
@ -587,27 +687,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
} else {
|
||||
if ((this.fGraphicsStatesInt.get(kColorStateIndex) != kColorTexture) || (lastPaint != sg2d.paint) || ((this.fChangeFlag & kBoundsChangedBit) != 0)) {
|
||||
PaintContext context = sg2d.paint.createContext(sg2d.getDeviceColorModel(), userBounds, userBounds, sIdentityMatrix, sg2d.getRenderingHints());
|
||||
WritableRaster raster = (WritableRaster) (context.getRaster(userBounds.x, userBounds.y, userBounds.width, userBounds.height));
|
||||
ColorModel cm = context.getColorModel();
|
||||
texturePaintImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
|
||||
|
||||
this.fGraphicsStatesInt.put(kColorStateIndex, kColorTexture);
|
||||
this.fGraphicsStatesInt.put(kColorWidthIndex, texturePaintImage.getWidth());
|
||||
this.fGraphicsStatesInt.put(kColorHeightIndex, texturePaintImage.getHeight());
|
||||
this.fGraphicsStatesFloat.put(kColortxIndex, (float) userBounds.getX());
|
||||
this.fGraphicsStatesFloat.put(kColortyIndex, (float) userBounds.getY());
|
||||
this.fGraphicsStatesFloat.put(kColorsxIndex, 1.0f);
|
||||
this.fGraphicsStatesFloat.put(kColorsyIndex, 1.0f);
|
||||
this.fGraphicsStatesObject[kTextureImageIndex] = sun.awt.image.BufImgSurfaceData.createData(texturePaintImage);
|
||||
|
||||
context.dispose();
|
||||
|
||||
this.fChangeFlag = (this.fChangeFlag | kColorChangedBit);
|
||||
} else {
|
||||
this.fChangeFlag = (this.fChangeFlag & kColorNotChangedBit);
|
||||
}
|
||||
setGradientViaRasterPath(sg2d);
|
||||
}
|
||||
lastPaint = sg2d.paint;
|
||||
}
|
||||
|
||||
@ -178,12 +178,6 @@ public final class CPrinterJob extends RasterPrinterJob {
|
||||
return;
|
||||
}
|
||||
|
||||
// See if this has an NSPrintInfo in it.
|
||||
NSPrintInfo nsPrintInfo = (NSPrintInfo)attributes.get(NSPrintInfo.class);
|
||||
if (nsPrintInfo != null) {
|
||||
fNSPrintInfo = nsPrintInfo.getValue();
|
||||
}
|
||||
|
||||
PageRanges pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
|
||||
if (isSupportedValue(pageRangesAttr, attributes)) {
|
||||
SunPageSelection rangeSelect = (SunPageSelection)attributes.get(SunPageSelection.class);
|
||||
@ -563,8 +557,11 @@ public final class CPrinterJob extends RasterPrinterJob {
|
||||
|
||||
@Override
|
||||
protected void finalize() {
|
||||
if (fNSPrintInfo != -1) {
|
||||
dispose(fNSPrintInfo);
|
||||
synchronized (fNSPrintInfoLock) {
|
||||
if (fNSPrintInfo != -1) {
|
||||
dispose(fNSPrintInfo);
|
||||
}
|
||||
fNSPrintInfo = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2014, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package sun.lwawt.macosx;
|
||||
|
||||
|
||||
import java.io.*;
|
||||
import javax.print.attribute.*;
|
||||
|
||||
@SuppressWarnings("serial") // JDK implementation class
|
||||
public final class NSPrintInfo implements PrintJobAttribute, PrintRequestAttribute, Serializable, Cloneable {
|
||||
|
||||
private long fNSPrintInfo;
|
||||
|
||||
public NSPrintInfo(long nsPrintInfo) {
|
||||
fNSPrintInfo = nsPrintInfo;
|
||||
}
|
||||
|
||||
public long getValue() {
|
||||
return fNSPrintInfo;
|
||||
}
|
||||
|
||||
public boolean equals(Object object) {
|
||||
return (object != null && object instanceof NSPrintInfo && fNSPrintInfo == ((NSPrintInfo)object).fNSPrintInfo);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return (int)fNSPrintInfo;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + fNSPrintInfo;
|
||||
}
|
||||
|
||||
public Class<? extends Attribute> getCategory() {
|
||||
return NSPrintInfo.class;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "nsPrintInfo";
|
||||
}
|
||||
}
|
||||
@ -44,6 +44,8 @@ enum SDRenderType
|
||||
SD_Fill,
|
||||
SD_EOFill,
|
||||
SD_Shade,
|
||||
SD_LinearGradient,
|
||||
SD_RadialGradient,
|
||||
SD_Pattern,
|
||||
SD_Image,
|
||||
SD_Text,
|
||||
@ -65,6 +67,17 @@ struct _stateShadingInfo
|
||||
};
|
||||
typedef struct _stateShadingInfo StateShadingInfo;
|
||||
|
||||
struct _stateGradientInfo
|
||||
{
|
||||
CGPoint start;
|
||||
CGPoint end;
|
||||
CGFloat radius;
|
||||
CGFloat* colordata;
|
||||
CGFloat* fractionsdata;
|
||||
jint fractionsLength;
|
||||
};
|
||||
typedef struct _stateGradientInfo StateGradientInfo;
|
||||
|
||||
struct _statePatternInfo
|
||||
{
|
||||
CGFloat tx;
|
||||
@ -122,6 +135,7 @@ struct _QuartzSDOps
|
||||
// its callees.
|
||||
|
||||
StateShadingInfo* shadingInfo; // tracks shading and its parameters
|
||||
StateGradientInfo* gradientInfo; // tracks gradient and its parameters
|
||||
StatePatternInfo* patternInfo; // tracks pattern and its parameters
|
||||
StateGraphicsInfo graphicsStateInfo; // tracks other graphics state
|
||||
|
||||
|
||||
@ -268,9 +268,105 @@ PRINT(" gradientPaintReleaseFunction")
|
||||
free(info);
|
||||
}
|
||||
|
||||
static inline void contextQuartzLinearGradientPath(QuartzSDOps* qsdo)
|
||||
{
|
||||
|
||||
PRINT(" contextQuartzLinearGradientPath");
|
||||
|
||||
CGContextRef cgRef = qsdo->cgRef;
|
||||
StateGradientInfo *gradientInfo = qsdo->gradientInfo;
|
||||
|
||||
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
|
||||
size_t num_locations = gradientInfo->fractionsLength;
|
||||
CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations);
|
||||
int i = 0;
|
||||
size_t component_size = num_locations * 4;
|
||||
CGFloat components[component_size];
|
||||
CGGradientRef gradient = NULL;
|
||||
|
||||
for (int i = 0; i < num_locations; i++) {
|
||||
locations[i] = gradientInfo->fractionsdata[i];
|
||||
//fprintf(stderr, "locations[%d] %f\n", i, locations[i]);
|
||||
}
|
||||
for (i = 0; i < component_size; i++) {
|
||||
components[i] = gradientInfo->colordata[i];
|
||||
//fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n",
|
||||
// i, components[i], i, gradientInfo->colordata[i]);
|
||||
}
|
||||
CGContextSaveGState(cgRef);
|
||||
gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations);
|
||||
//fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n",
|
||||
// gradientInfo->start.x, gradientInfo->start.y);
|
||||
//fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n",
|
||||
// gradientInfo->end.x, gradientInfo->end.y);
|
||||
if (qsdo->isEvenOddFill) {
|
||||
CGContextEOClip(cgRef);
|
||||
} else {
|
||||
CGContextClip(cgRef);
|
||||
}
|
||||
CGContextDrawLinearGradient(cgRef, gradient, gradientInfo->start, gradientInfo->end, kCGGradientDrawsAfterEndLocation);
|
||||
|
||||
CGContextRestoreGState(cgRef);
|
||||
CGColorSpaceRelease(colorspace);
|
||||
CGGradientRelease(gradient);
|
||||
free(locations);
|
||||
free(gradientInfo->colordata);
|
||||
free(gradientInfo->fractionsdata);
|
||||
}
|
||||
|
||||
static inline void contextQuartzRadialGradientPath(QuartzSDOps* qsdo)
|
||||
{
|
||||
|
||||
PRINT(" contextQuartzRadialGradientPath");
|
||||
|
||||
CGContextRef cgRef = qsdo->cgRef;
|
||||
StateGradientInfo *gradientInfo = qsdo->gradientInfo;
|
||||
|
||||
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
|
||||
size_t num_locations = gradientInfo->fractionsLength;
|
||||
CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations);
|
||||
int i = 0;
|
||||
size_t component_size = num_locations * 4;
|
||||
CGFloat components[component_size];
|
||||
CGGradientRef gradient = NULL;
|
||||
CGFloat startRadius = gradientInfo->radius;
|
||||
CGFloat endRadius = gradientInfo->radius;
|
||||
|
||||
for (int i = 0; i < num_locations; i++) {
|
||||
locations[i] = gradientInfo->fractionsdata[i];
|
||||
//fprintf(stderr, "locations[%d] %f\n", i, locations[i]);
|
||||
}
|
||||
for (i = 0; i < component_size; i++) {
|
||||
components[i] = gradientInfo->colordata[i];
|
||||
//fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n",
|
||||
// i, components[i], i, gradientInfo->colordata[i]);
|
||||
}
|
||||
CGContextSaveGState(cgRef);
|
||||
gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations);
|
||||
//fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n",
|
||||
// gradientInfo->start.x, gradientInfo->start.y);
|
||||
//fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n",
|
||||
// gradientInfo->end.x, gradientInfo->end.y);
|
||||
if (qsdo->isEvenOddFill) {
|
||||
CGContextEOClip(cgRef);
|
||||
} else {
|
||||
CGContextClip(cgRef);
|
||||
}
|
||||
//fprintf(stderr, "gradientInfo->startRadius %f, gradientInfo->endRadius %f\n",startRadius,endRadius);
|
||||
CGContextDrawRadialGradient(cgRef, gradient, gradientInfo->start, 0, gradientInfo->end, endRadius, kCGGradientDrawsAfterEndLocation);
|
||||
|
||||
CGContextRestoreGState(cgRef);
|
||||
CGColorSpaceRelease(colorspace);
|
||||
CGGradientRelease(gradient);
|
||||
free(locations);
|
||||
free(gradientInfo->colordata);
|
||||
free(gradientInfo->fractionsdata);
|
||||
}
|
||||
|
||||
static inline void contextGradientPath(QuartzSDOps* qsdo)
|
||||
{
|
||||
PRINT(" ContextGradientPath")
|
||||
|
||||
CGContextRef cgRef = qsdo->cgRef;
|
||||
StateShadingInfo* shadingInfo = qsdo->shadingInfo;
|
||||
|
||||
@ -827,6 +923,81 @@ PRINT(" SetUpCGContext")
|
||||
qsdo->renderType = renderType;
|
||||
}
|
||||
|
||||
void setupGradient(JNIEnv *env, QuartzSDOps* qsdo, jfloat* javaFloatGraphicsStates)
|
||||
{
|
||||
static const CGFloat kColorConversionMultiplier = 1.0f/255.0f;
|
||||
qsdo->gradientInfo = (StateGradientInfo*)malloc(sizeof(StateGradientInfo));
|
||||
if (qsdo->gradientInfo == NULL)
|
||||
{
|
||||
[JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory for gradient paint"];
|
||||
}
|
||||
|
||||
qsdo->graphicsStateInfo.simpleStroke = NO;
|
||||
qsdo->graphicsStateInfo.simpleColor = NO;
|
||||
|
||||
qsdo->gradientInfo->start.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx1Index];
|
||||
qsdo->gradientInfo->start.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory1Index];
|
||||
qsdo->gradientInfo->end.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx2Index];
|
||||
qsdo->gradientInfo->end.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory2Index];
|
||||
|
||||
jobject colorArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kColorArrayIndex));
|
||||
if (colorArray != NULL)
|
||||
{
|
||||
jint length = (*env)->GetArrayLength(env, colorArray);
|
||||
//fprintf(stderr, "length %d\n", length);
|
||||
|
||||
jint* jcolorData = (jint*)(*env)->GetPrimitiveArrayCritical(env, colorArray, NULL);
|
||||
CGFloat* colors= (CGFloat*)calloc(0, sizeof(CGFloat)*length);
|
||||
if (jcolorData != NULL)
|
||||
{
|
||||
jint i;
|
||||
for (i=0; i<length; i++)
|
||||
{
|
||||
colors[i] = (CGFloat)jcolorData[i];
|
||||
}
|
||||
}
|
||||
(*env)->ReleasePrimitiveArrayCritical(env, colorArray, jcolorData, 0);
|
||||
qsdo->gradientInfo->colordata = (CGFloat*)calloc(0, sizeof(CGFloat)*4*length);
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
jint c1 = colors[i];
|
||||
//fprintf(stderr, "c1 %x\n", c1);
|
||||
qsdo->gradientInfo->colordata[i*4] = ((c1>>16)&0xff)*kColorConversionMultiplier;
|
||||
//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4, qsdo->gradientInfo->colordata[i*4]);
|
||||
|
||||
qsdo->gradientInfo->colordata[i*4+1] = ((c1>>8)&0xff)*kColorConversionMultiplier;
|
||||
//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+1, qsdo->gradientInfo->colordata[i*4+1]);
|
||||
|
||||
qsdo->gradientInfo->colordata[i*4+2] = ((c1>>0)&0xff)*kColorConversionMultiplier;
|
||||
//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+2, qsdo->gradientInfo->colordata[i*4+2]);
|
||||
|
||||
qsdo->gradientInfo->colordata[i*4+3] = ((c1>>24)&0xff)*kColorConversionMultiplier;
|
||||
//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+3, qsdo->gradientInfo->colordata[i*4+3]);
|
||||
}
|
||||
free(colors);
|
||||
}
|
||||
jobject fractionsArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kFractionsArrayIndex));
|
||||
if (fractionsArray != NULL)
|
||||
{
|
||||
jint length = (*env)->GetArrayLength(env, fractionsArray);
|
||||
//fprintf(stderr, "fractions length %d\n", length);
|
||||
qsdo->gradientInfo->fractionsLength = length;
|
||||
|
||||
jfloat* jfractionsData = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL);
|
||||
if (jfractionsData != NULL)
|
||||
{
|
||||
qsdo->gradientInfo->fractionsdata = (CGFloat *)malloc(sizeof(CGFloat) *length);
|
||||
jint i;
|
||||
for (i=0; i<length; i++)
|
||||
{
|
||||
qsdo->gradientInfo->fractionsdata[i] = jfractionsData[i];
|
||||
//fprintf(stderr, "jfrationsData[%d] %f, qsdo->gradientInfo->fractionsdata[%d] = %f\n", i, jfractionsData[i], i, qsdo->gradientInfo->fractionsdata[i]);
|
||||
}
|
||||
(*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, jfractionsData, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType)
|
||||
{
|
||||
CGContextRef cgRef = qsdo->cgRef;
|
||||
@ -898,6 +1069,21 @@ SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType)
|
||||
|
||||
break;
|
||||
}
|
||||
case sun_java2d_OSXSurfaceData_kColorLinearGradient:
|
||||
{
|
||||
renderType = SD_LinearGradient;
|
||||
setupGradient(env, qsdo, javaFloatGraphicsStates);
|
||||
break;
|
||||
}
|
||||
|
||||
case sun_java2d_OSXSurfaceData_kColorRadialGradient:
|
||||
{
|
||||
renderType = SD_RadialGradient;
|
||||
setupGradient(env, qsdo, javaFloatGraphicsStates);
|
||||
qsdo->gradientInfo->radius = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kRadiusIndex];
|
||||
break;
|
||||
}
|
||||
|
||||
case sun_java2d_OSXSurfaceData_kColorTexture:
|
||||
{
|
||||
qsdo->patternInfo = (StatePatternInfo*)malloc(sizeof(StatePatternInfo));
|
||||
@ -1076,11 +1262,24 @@ PRINT(" CompleteCGContext")
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_LinearGradient:
|
||||
if (CGContextIsPathEmpty(qsdo->cgRef) == 0)
|
||||
{
|
||||
contextQuartzLinearGradientPath(qsdo);
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_RadialGradient:
|
||||
if (CGContextIsPathEmpty(qsdo->cgRef) == 0)
|
||||
{
|
||||
contextQuartzRadialGradientPath(qsdo);
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_Pattern:
|
||||
if (CGContextIsPathEmpty(qsdo->cgRef) == 0)
|
||||
{
|
||||
//TODO:BG
|
||||
//contextTexturePath(env, qsdo);
|
||||
contextTexturePath(env, qsdo);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1111,4 +1310,8 @@ PRINT(" CompleteCGContext")
|
||||
gradientPaintReleaseFunction(qsdo->shadingInfo);
|
||||
qsdo->shadingInfo = NULL;
|
||||
}
|
||||
if (qsdo->gradientInfo != NULL) {
|
||||
gradientPaintReleaseFunction(qsdo->gradientInfo);
|
||||
qsdo->gradientInfo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 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
|
||||
@ -58,6 +58,25 @@ image format plug-ins:
|
||||
<th> </th> <th>Reading</th> <th>Writing</th>
|
||||
<th>Notes</th> <th>Metadata</th>
|
||||
</tr>
|
||||
<!-- BMP plugin -->
|
||||
<tr>
|
||||
<td><a href="https://msdn.microsoft.com/en-us/library/dd183391.aspx">BMP</a></td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>none</td>
|
||||
<td align='center'><a href='metadata/doc-files/bmp_metadata.html'>
|
||||
BMP metadata format</a></td>
|
||||
</tr>
|
||||
<!-- GIF plugin -->
|
||||
<tr>
|
||||
<td><a href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt">GIF</a></td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'><a href="#gif_plugin_notes">
|
||||
GIF plug-in notes</a></td>
|
||||
<td align='center'><a href='metadata/doc-files/gif_metadata.html'>
|
||||
GIF metadata format</a></td>
|
||||
</tr>
|
||||
<!-- JPEG plugin -->
|
||||
<tr>
|
||||
<td> <a href="http://www.jpeg.org">JPEG</a></td>
|
||||
@ -76,14 +95,15 @@ image format plug-ins:
|
||||
<td align='center'><a href='metadata/doc-files/png_metadata.html'>
|
||||
PNG metadata format</a></td>
|
||||
</tr>
|
||||
<!-- BMP plugin -->
|
||||
<!-- TIFF plugin -->
|
||||
<tr>
|
||||
<td>BMP</td>
|
||||
<td><a href="https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf">TIFF</a></td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>none</td>
|
||||
<td align='center'><a href='metadata/doc-files/bmp_metadata.html'>
|
||||
BMP metadata format</a></td>
|
||||
<td align='center'><a href='metadata/doc-files/tiff_metadata.html#Reading'>
|
||||
TIFF plug-in notes</td>
|
||||
<td align='center'><a href='metadata/doc-files/tiff_metadata.html#StreamMetadata'>
|
||||
TIFF metadata format</a></td>
|
||||
</tr>
|
||||
<!-- WBMP plugin -->
|
||||
<tr>
|
||||
@ -94,16 +114,6 @@ image format plug-ins:
|
||||
<td align='center'><a href='metadata/doc-files/wbmp_metadata.html'>
|
||||
WBMP metadata format</a></td>
|
||||
</tr>
|
||||
<!-- GIF plugin -->
|
||||
<tr>
|
||||
<td><a href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt">GIF</a></td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'>yes</td>
|
||||
<td align='center'><a href="#gif_plugin_notes">
|
||||
GIF plug-in notes</a></td>
|
||||
<td align='center'><a href='metadata/doc-files/gif_metadata.html'>
|
||||
GIF metadata format</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<BR>
|
||||
|
||||
@ -55,9 +55,7 @@ public final class ExifGPSTagSet extends TIFFTagSet {
|
||||
*
|
||||
* @see #TAG_GPS_VERSION_ID
|
||||
*/
|
||||
public static final String GPS_VERSION_2_2 =
|
||||
new String(new byte[] { '2', '2', '0', '0' },
|
||||
StandardCharsets.US_ASCII);
|
||||
public static final String GPS_VERSION_2_2 = "2200";
|
||||
|
||||
/**
|
||||
* A tag indicating the North or South latitude (type ASCII, count = 2).
|
||||
|
||||
@ -71,9 +71,7 @@ public final class ExifTIFFTagSet extends TIFFTagSet {
|
||||
*
|
||||
* @see #TAG_EXIF_VERSION
|
||||
*/
|
||||
public static final String EXIF_VERSION_2_1 =
|
||||
new String(new byte[] { '0', '2', '1', '0' },
|
||||
StandardCharsets.US_ASCII);
|
||||
public static final String EXIF_VERSION_2_1 = "0210";
|
||||
|
||||
/**
|
||||
* A value to be used with the "ExifVersion" tag to indicate Exif version
|
||||
@ -82,9 +80,7 @@ public final class ExifTIFFTagSet extends TIFFTagSet {
|
||||
*
|
||||
* @see #TAG_EXIF_VERSION
|
||||
*/
|
||||
public static final String EXIF_VERSION_2_2 =
|
||||
new String(new byte[] { '0', '2', '2', '0' },
|
||||
StandardCharsets.US_ASCII);
|
||||
public static final String EXIF_VERSION_2_2 = "0220";
|
||||
|
||||
/**
|
||||
* A tag indicating the FlashPix version number (type UNDEFINED,
|
||||
|
||||
@ -261,7 +261,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* @see TIFFDirectory
|
||||
* @see TIFFTag
|
||||
*/
|
||||
public class TIFFField implements Cloneable {
|
||||
public final class TIFFField implements Cloneable {
|
||||
|
||||
private static final String[] typeNames = {
|
||||
null,
|
||||
|
||||
@ -48,7 +48,7 @@ import javax.imageio.ImageReadParam;
|
||||
*
|
||||
* @since 9
|
||||
*/
|
||||
public class TIFFImageReadParam extends ImageReadParam {
|
||||
public final class TIFFImageReadParam extends ImageReadParam {
|
||||
|
||||
private List<TIFFTagSet> allowedTagSets = new ArrayList<TIFFTagSet>(4);
|
||||
|
||||
|
||||
@ -320,28 +320,6 @@ public class JRootPane extends JComponent implements Accessible {
|
||||
* a UI-specific action like pressing the <b>Enter</b> key occurs.
|
||||
*/
|
||||
protected JButton defaultButton;
|
||||
/**
|
||||
* As of Java 2 platform v1.3 this unusable field is no longer used.
|
||||
* To override the default button you should replace the <code>Action</code>
|
||||
* in the <code>JRootPane</code>'s <code>ActionMap</code>. Please refer to
|
||||
* the key bindings specification for further details.
|
||||
*
|
||||
* @deprecated As of Java 2 platform v1.3.
|
||||
* @see #defaultButton
|
||||
*/
|
||||
@Deprecated
|
||||
protected DefaultAction defaultPressAction;
|
||||
/**
|
||||
* As of Java 2 platform v1.3 this unusable field is no longer used.
|
||||
* To override the default button you should replace the <code>Action</code>
|
||||
* in the <code>JRootPane</code>'s <code>ActionMap</code>. Please refer to
|
||||
* the key bindings specification for further details.
|
||||
*
|
||||
* @deprecated As of Java 2 platform v1.3.
|
||||
* @see #defaultButton
|
||||
*/
|
||||
@Deprecated
|
||||
protected DefaultAction defaultReleaseAction;
|
||||
|
||||
/**
|
||||
* Whether or not true double buffering should be used. This is typically
|
||||
@ -829,35 +807,6 @@ public class JRootPane extends JComponent implements Accessible {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
static class DefaultAction extends AbstractAction {
|
||||
JButton owner;
|
||||
JRootPane root;
|
||||
boolean press;
|
||||
DefaultAction(JRootPane root, boolean press) {
|
||||
this.root = root;
|
||||
this.press = press;
|
||||
}
|
||||
public void setOwner(JButton owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (owner != null && SwingUtilities.getRootPane(owner) == root) {
|
||||
ButtonModel model = owner.getModel();
|
||||
if (press) {
|
||||
model.setArmed(true);
|
||||
model.setPressed(true);
|
||||
} else {
|
||||
model.setPressed(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
public boolean isEnabled() {
|
||||
return owner.getModel().isEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Overridden to enforce the position of the glass component as
|
||||
* the zero child.
|
||||
|
||||
@ -739,7 +739,7 @@ public class MetalBorders {
|
||||
/**
|
||||
* The instance of {@code MetalBumps}.
|
||||
*/
|
||||
protected MetalBumps bumps = new MetalBumps( 10, 10,
|
||||
private MetalBumps bumps = new MetalBumps( 10, 10,
|
||||
MetalLookAndFeel.getControlHighlight(),
|
||||
MetalLookAndFeel.getControlDarkShadow(),
|
||||
UIManager.getColor("ToolBar.background"));
|
||||
|
||||
@ -923,7 +923,7 @@ public class MetalFileChooserUI extends BasicFileChooserUI {
|
||||
* @param fc a {@code JFileChooser}
|
||||
* @return a new instance of {@code DirectoryComboBoxRenderer}
|
||||
*/
|
||||
protected DirectoryComboBoxRenderer createDirectoryComboBoxRenderer(JFileChooser fc) {
|
||||
private DefaultListCellRenderer createDirectoryComboBoxRenderer(JFileChooser fc) {
|
||||
return new DirectoryComboBoxRenderer();
|
||||
}
|
||||
|
||||
|
||||
@ -62,7 +62,7 @@ public class MetalScrollBarUI extends BasicScrollBarUI
|
||||
/**
|
||||
* The metal bumps.
|
||||
*/
|
||||
protected MetalBumps bumps;
|
||||
private MetalBumps bumps;
|
||||
|
||||
/**
|
||||
* The increase button.
|
||||
|
||||
@ -30,6 +30,9 @@ import java.awt.Image;
|
||||
import java.awt.Toolkit;
|
||||
import java.io.*;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.LinkOption;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
@ -243,7 +246,8 @@ public abstract class ShellFolder extends File {
|
||||
if (file instanceof ShellFolder) {
|
||||
return (ShellFolder)file;
|
||||
}
|
||||
if (!file.exists()) {
|
||||
|
||||
if (!Files.exists(file.toPath(), LinkOption.NOFOLLOW_LINKS)) {
|
||||
throw new FileNotFoundException();
|
||||
}
|
||||
return shellFolderManager.createShellFolder(file);
|
||||
|
||||
@ -36,8 +36,8 @@ class NullFontScaler extends FontScaler {
|
||||
boolean supportsCJK, int filesize) {}
|
||||
|
||||
StrikeMetrics getFontMetrics(long pScalerContext) {
|
||||
return new StrikeMetrics(0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
|
||||
0xf0,0xf0,0xf0,0xf0);
|
||||
return new StrikeMetrics(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
float getGlyphAdvance(long pScalerContext, int glyphCode) {
|
||||
@ -71,7 +71,7 @@ class NullFontScaler extends FontScaler {
|
||||
return getNullScalerContext();
|
||||
}
|
||||
|
||||
void invalidateScalerContext(long ppScalerContext) {
|
||||
void invalidateScalerContext(long pScalerContext) {
|
||||
//nothing to do
|
||||
}
|
||||
|
||||
|
||||
@ -219,6 +219,38 @@ public class GTKKeybindings {
|
||||
"KP_UP", "selectPrevious"
|
||||
|
||||
}),
|
||||
"Desktop.ancestorInputMap",
|
||||
new UIDefaults.LazyInputMap(new Object[] {
|
||||
"ctrl F5", "restore",
|
||||
"ctrl F4", "close",
|
||||
"ctrl F7", "move",
|
||||
"ctrl F8", "resize",
|
||||
"RIGHT", "right",
|
||||
"KP_RIGHT", "right",
|
||||
"shift RIGHT", "shrinkRight",
|
||||
"shift KP_RIGHT", "shrinkRight",
|
||||
"LEFT", "left",
|
||||
"KP_LEFT", "left",
|
||||
"shift LEFT", "shrinkLeft",
|
||||
"shift KP_LEFT", "shrinkLeft",
|
||||
"UP", "up",
|
||||
"KP_UP", "up",
|
||||
"shift UP", "shrinkUp",
|
||||
"shift KP_UP", "shrinkUp",
|
||||
"DOWN", "down",
|
||||
"KP_DOWN", "down",
|
||||
"shift DOWN", "shrinkDown",
|
||||
"shift KP_DOWN", "shrinkDown",
|
||||
"ESCAPE", "escape",
|
||||
"ctrl F9", "minimize",
|
||||
"ctrl F10", "maximize",
|
||||
"ctrl F6", "selectNextFrame",
|
||||
"ctrl TAB", "selectNextFrame",
|
||||
"ctrl alt F6", "selectNextFrame",
|
||||
"shift ctrl alt F6", "selectPreviousFrame",
|
||||
"ctrl F12", "navigateNext",
|
||||
"shift ctrl F12", "navigatePrevious"
|
||||
}),
|
||||
"EditorPane.focusInputMap", multilineInputMap,
|
||||
"FileChooser.ancestorInputMap",
|
||||
new UIDefaults.LazyInputMap(new Object[]{
|
||||
|
||||
@ -217,6 +217,13 @@ sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java 8161232 macosx-a
|
||||
############################################################################
|
||||
|
||||
# jdk_sound
|
||||
javax/sound/sampled/DirectAudio/bug6372428.java 8055097 generic-all
|
||||
javax/sound/sampled/Clip/bug5070081.java 8055097 generic-all
|
||||
javax/sound/sampled/DataLine/LongFramePosition.java 8055097 generic-all
|
||||
|
||||
javax/sound/sampled/Clip/Drain/ClipDrain.java 7062792 generic-all
|
||||
|
||||
javax/sound/sampled/Mixers/DisabledAssertionCrash.java 7067310 generic-all
|
||||
|
||||
############################################################################
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
*/
|
||||
|
||||
/* @test
|
||||
@bug 8017487
|
||||
@bug 8017487 8167988
|
||||
@summary filechooser in Windows-Libraries folder: columns are mixed up
|
||||
@author Semyon Sadetsky
|
||||
@modules java.desktop/sun.awt.shell
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 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
|
||||
@ -23,8 +23,8 @@
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 6565779
|
||||
@library ../../../regtesthelpers
|
||||
@bug 6565779 8168292
|
||||
@library ../../regtesthelpers
|
||||
@compile DragEventSource.java
|
||||
@summary Exception if source of some event is TrayIcon
|
||||
@author Andrei Dmitriev: area=awt.tray
|
||||
@ -38,9 +38,19 @@
|
||||
* instance as source.
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import java.awt.Button;
|
||||
import java.awt.Dialog;
|
||||
import java.awt.FileDialog;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Image;
|
||||
import java.awt.Panel;
|
||||
import java.awt.SystemTray;
|
||||
import java.awt.TextArea;
|
||||
import java.awt.TrayIcon;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public class DragEventSource
|
||||
{
|
||||
@ -81,11 +91,10 @@ public class DragEventSource
|
||||
|
||||
String[] instructions =
|
||||
{
|
||||
"Use see a Frame with a button in it.",
|
||||
"Press the button. FileDialog should appear.",
|
||||
"Drag the mouse from the Tray icon to FileDialog ",
|
||||
"using left mouse button.",
|
||||
"If exception happens, the test fails.",
|
||||
"Click 'Open file dialog' button. FileDialog should appear.",
|
||||
"Using left mouse button,",
|
||||
"Drag the mouse from the Tray icon to FileDialog.",
|
||||
"If exception is thrown, the test fails.",
|
||||
"Otherwise, pass."
|
||||
};
|
||||
|
||||
|
||||
@ -21,12 +21,19 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @bug 8166897
|
||||
/* @test
|
||||
@key headful
|
||||
@bug 8166897
|
||||
@summary Some font overlap in the Optionpane dialog.
|
||||
@run main ChangeWindowResizabiltyTest
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dialog;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Panel;
|
||||
import java.awt.Robot;
|
||||
|
||||
public class ChangeWindowResizabiltyTest {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
@ -0,0 +1,233 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*/
|
||||
/*
|
||||
* @test
|
||||
* @bug 8162796
|
||||
* @summary Verifies if LinearGradientPaint is printed in osx
|
||||
* @run main/manual LinearGradientPrintingTest
|
||||
*/
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.LinearGradientPaint;
|
||||
import java.awt.Shape;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.print.PageFormat;
|
||||
import java.awt.print.Printable;
|
||||
import java.awt.print.PrinterException;
|
||||
import java.awt.print.PrinterJob;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
public class LinearGradientPrintingTest extends Component implements Printable {
|
||||
private static Thread mainThread;
|
||||
private static boolean testPassed;
|
||||
private static boolean testGeneratedInterrupt;
|
||||
private static JFrame f = null;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//createUI();
|
||||
doTest(LinearGradientPrintingTest::createUI);
|
||||
}
|
||||
});
|
||||
mainThread = Thread.currentThread();
|
||||
try {
|
||||
Thread.sleep(120000);
|
||||
} catch (InterruptedException e) {
|
||||
if (!testPassed && testGeneratedInterrupt) {
|
||||
throw new RuntimeException("LinearGradientPaint did not print");
|
||||
}
|
||||
}
|
||||
if (!testGeneratedInterrupt) {
|
||||
throw new RuntimeException("user has not executed the test");
|
||||
}
|
||||
}
|
||||
|
||||
public static void createUI() {
|
||||
f = new JFrame("LinearGradient Printing Test");
|
||||
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
||||
final LinearGradientPrintingTest gpt = new LinearGradientPrintingTest();
|
||||
Container c = f.getContentPane();
|
||||
c.add(BorderLayout.CENTER, gpt);
|
||||
|
||||
final JButton print = new JButton("Print");
|
||||
print.addActionListener(new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
PrinterJob job = PrinterJob.getPrinterJob();
|
||||
job.setPrintable(gpt);
|
||||
final boolean doPrint = job.printDialog();
|
||||
if (doPrint) {
|
||||
try {
|
||||
job.print();
|
||||
} catch (PrinterException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
c.add(print, BorderLayout.SOUTH);
|
||||
|
||||
f.pack();
|
||||
f.setVisible(true);
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
return new Dimension(500,500);
|
||||
}
|
||||
|
||||
public void paint(Graphics g) {
|
||||
doPaint((Graphics2D)g);
|
||||
}
|
||||
|
||||
public int print( Graphics graphics, PageFormat format, int index ) {
|
||||
Graphics2D g2d = (Graphics2D)graphics;
|
||||
g2d.translate(format.getImageableX(), format.getImageableY());
|
||||
doPaint(g2d);
|
||||
return index == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;
|
||||
}
|
||||
|
||||
static final float DIM = 100;
|
||||
public void doPaint(Graphics2D g2d) {
|
||||
|
||||
g2d.translate(DIM*0.2, DIM*0.2);
|
||||
Shape s = new Rectangle2D.Float(0, 0, DIM*2, DIM*2);
|
||||
Point2D.Double p1 = new Point2D.Double(0.0, 0.0);
|
||||
Point2D.Double p2 = new Point2D.Double(DIM/2.0, DIM/2.0);
|
||||
|
||||
// LinearGradientPaint
|
||||
//g2d.translate(DIM*2.2, 0);
|
||||
Color colors[] = { Color.red, Color.blue} ;
|
||||
float fractions[] = { 0.0f, 1.0f };
|
||||
|
||||
LinearGradientPaint lgp =
|
||||
new LinearGradientPaint(p1, p2, fractions, colors,
|
||||
LinearGradientPaint.CycleMethod.NO_CYCLE);
|
||||
g2d.setPaint(lgp);
|
||||
g2d.fill(s);
|
||||
|
||||
g2d.translate(DIM*2.2, 0);
|
||||
Color colors1[] = { Color.red, Color.blue, Color.green, Color.white} ;
|
||||
float fractions1[] = { 0.0f, 0.3f, 0.6f, 1.0f };
|
||||
|
||||
LinearGradientPaint lgp1 =
|
||||
new LinearGradientPaint(p1, p2, fractions1, colors1,
|
||||
LinearGradientPaint.CycleMethod.REFLECT);
|
||||
g2d.setPaint(lgp1);
|
||||
g2d.fill(s);
|
||||
|
||||
g2d.translate(-DIM*2.2, DIM*2.2);
|
||||
Color colors2[] = { Color.red, Color.blue, Color.green, Color.white} ;
|
||||
float fractions2[] = { 0.0f, 0.3f, 0.6f, 1.0f };
|
||||
|
||||
LinearGradientPaint lgp2 =
|
||||
new LinearGradientPaint(p1, p2, fractions2, colors2,
|
||||
LinearGradientPaint.CycleMethod.REPEAT);
|
||||
g2d.setPaint(lgp2);
|
||||
g2d.fill(s);
|
||||
}
|
||||
|
||||
public static synchronized void pass() {
|
||||
testPassed = true;
|
||||
testGeneratedInterrupt = true;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
|
||||
public static synchronized void fail() {
|
||||
testPassed = false;
|
||||
testGeneratedInterrupt = true;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
|
||||
private static void doTest(Runnable action) {
|
||||
String description
|
||||
= " A LinearGradientPaint graphics will be shown on console.\n"
|
||||
+ " The same graphics is sent to printer.\n"
|
||||
+ " Please verify if LinearGradientPaint shading is printed.\n"
|
||||
+ " If none is printed, press FAIL else press PASS";
|
||||
|
||||
final JDialog dialog = new JDialog();
|
||||
dialog.setTitle("printSelectionTest");
|
||||
JTextArea textArea = new JTextArea(description);
|
||||
textArea.setEditable(false);
|
||||
final JButton testButton = new JButton("Start Test");
|
||||
final JButton passButton = new JButton("PASS");
|
||||
passButton.setEnabled(false);
|
||||
passButton.addActionListener((e) -> {
|
||||
f.dispose();
|
||||
dialog.dispose();
|
||||
pass();
|
||||
});
|
||||
final JButton failButton = new JButton("FAIL");
|
||||
failButton.setEnabled(false);
|
||||
failButton.addActionListener((e) -> {
|
||||
f.dispose();
|
||||
dialog.dispose();
|
||||
fail();
|
||||
});
|
||||
testButton.addActionListener((e) -> {
|
||||
testButton.setEnabled(false);
|
||||
action.run();
|
||||
passButton.setEnabled(true);
|
||||
failButton.setEnabled(true);
|
||||
});
|
||||
JPanel mainPanel = new JPanel(new BorderLayout());
|
||||
mainPanel.add(textArea, BorderLayout.CENTER);
|
||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||
buttonPanel.add(testButton);
|
||||
buttonPanel.add(passButton);
|
||||
buttonPanel.add(failButton);
|
||||
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||||
dialog.add(mainPanel);
|
||||
|
||||
dialog.pack();
|
||||
dialog.setVisible(true);
|
||||
dialog.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
System.out.println("main dialog closing");
|
||||
testGeneratedInterrupt = false;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,234 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*/
|
||||
/*
|
||||
* @test
|
||||
* @bug 8162796
|
||||
* @summary Verifies if RadialGradientPaint is printed in osx
|
||||
* @run main/manual RadialGradientPrintingTest
|
||||
*/
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RadialGradientPaint;
|
||||
import java.awt.Shape;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.print.PageFormat;
|
||||
import java.awt.print.Printable;
|
||||
import static java.awt.print.Printable.NO_SUCH_PAGE;
|
||||
import static java.awt.print.Printable.PAGE_EXISTS;
|
||||
import java.awt.print.PrinterException;
|
||||
import java.awt.print.PrinterJob;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
public class RadialGradientPrintingTest extends Component implements Printable {
|
||||
private static Thread mainThread;
|
||||
private static boolean testPassed;
|
||||
private static boolean testGeneratedInterrupt;
|
||||
private static JFrame f = null;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//createUI();
|
||||
doTest(RadialGradientPrintingTest::createUI);
|
||||
}
|
||||
});
|
||||
mainThread = Thread.currentThread();
|
||||
try {
|
||||
Thread.sleep(120000);
|
||||
} catch (InterruptedException e) {
|
||||
if (!testPassed && testGeneratedInterrupt) {
|
||||
throw new RuntimeException("LinearGradientPaint did not print");
|
||||
}
|
||||
}
|
||||
if (!testGeneratedInterrupt) {
|
||||
throw new RuntimeException("user has not executed the test");
|
||||
}
|
||||
}
|
||||
|
||||
public static void createUI() {
|
||||
f = new JFrame("RadialGradient Printing Test");
|
||||
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
||||
final RadialGradientPrintingTest gpt = new RadialGradientPrintingTest();
|
||||
Container c = f.getContentPane();
|
||||
c.add(BorderLayout.CENTER, gpt);
|
||||
|
||||
final JButton print = new JButton("Print");
|
||||
print.addActionListener(new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
PrinterJob job = PrinterJob.getPrinterJob();
|
||||
job.setPrintable(gpt);
|
||||
final boolean doPrint = job.printDialog();
|
||||
if (doPrint) {
|
||||
try {
|
||||
job.print();
|
||||
} catch (PrinterException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
c.add(print, BorderLayout.SOUTH);
|
||||
|
||||
f.pack();
|
||||
f.setVisible(true);
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
return new Dimension(500,500);
|
||||
}
|
||||
|
||||
public void paint(Graphics g) {
|
||||
doPaint((Graphics2D)g);
|
||||
}
|
||||
|
||||
public int print( Graphics graphics, PageFormat format, int index ) {
|
||||
Graphics2D g2d = (Graphics2D)graphics;
|
||||
g2d.translate(format.getImageableX(), format.getImageableY());
|
||||
doPaint(g2d);
|
||||
return index == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;
|
||||
}
|
||||
|
||||
static final float DIM = 100;
|
||||
public void doPaint(Graphics2D g2d) {
|
||||
|
||||
g2d.translate(DIM*0.2, DIM*0.2);
|
||||
Shape s = new Rectangle2D.Float(0, 0, DIM*2, DIM*2);
|
||||
|
||||
// RadialGradientPaint
|
||||
Point2D centre = new Point2D.Float(DIM/2.0f, DIM/2.0f);
|
||||
float radius = DIM/2.0f;
|
||||
Point2D focus = new Point2D.Float(DIM/3.0f, DIM/3.0f);
|
||||
float stops[] = {0.0f, 1.0f};
|
||||
Color colors[] = { Color.red, Color.white} ;
|
||||
|
||||
RadialGradientPaint rgp =
|
||||
new RadialGradientPaint(centre, radius, focus, stops, colors,
|
||||
RadialGradientPaint.CycleMethod.NO_CYCLE);
|
||||
g2d.setPaint(rgp);
|
||||
g2d.fill(s);
|
||||
|
||||
g2d.translate(DIM*2.2, 0);
|
||||
Color colors1[] = { Color.red, Color.blue, Color.green} ;
|
||||
float stops1[] = {0.0f, 0.5f, 1.0f};
|
||||
RadialGradientPaint rgp1 =
|
||||
new RadialGradientPaint(centre, radius, focus, stops1, colors1,
|
||||
RadialGradientPaint.CycleMethod.REFLECT);
|
||||
g2d.setPaint(rgp1);
|
||||
g2d.fill(s);
|
||||
|
||||
g2d.translate(-DIM*2.2, DIM*2.2);
|
||||
Color colors2[] = { Color.red, Color.blue, Color.green, Color.white} ;
|
||||
float stops2[] = {0.0f, 0.3f, 0.6f, 1.0f};
|
||||
RadialGradientPaint rgp2 =
|
||||
new RadialGradientPaint(centre, radius, focus, stops2, colors2,
|
||||
RadialGradientPaint.CycleMethod.REPEAT);
|
||||
g2d.setPaint(rgp2);
|
||||
g2d.fill(s);
|
||||
|
||||
}
|
||||
|
||||
public static synchronized void pass() {
|
||||
testPassed = true;
|
||||
testGeneratedInterrupt = true;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
|
||||
public static synchronized void fail() {
|
||||
testPassed = false;
|
||||
testGeneratedInterrupt = true;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
|
||||
private static void doTest(Runnable action) {
|
||||
String description
|
||||
= " A RadialGradientPaint graphics will be shown on console.\n"
|
||||
+ " The same graphics is sent to printer.\n"
|
||||
+ " Please verify if RadialGradientPaint shading is printed.\n"
|
||||
+ " If none is printed, press FAIL else press PASS";
|
||||
|
||||
final JDialog dialog = new JDialog();
|
||||
dialog.setTitle("printSelectionTest");
|
||||
JTextArea textArea = new JTextArea(description);
|
||||
textArea.setEditable(false);
|
||||
final JButton testButton = new JButton("Start Test");
|
||||
final JButton passButton = new JButton("PASS");
|
||||
passButton.setEnabled(false);
|
||||
passButton.addActionListener((e) -> {
|
||||
f.dispose();
|
||||
dialog.dispose();
|
||||
pass();
|
||||
});
|
||||
final JButton failButton = new JButton("FAIL");
|
||||
failButton.setEnabled(false);
|
||||
failButton.addActionListener((e) -> {
|
||||
f.dispose();
|
||||
dialog.dispose();
|
||||
fail();
|
||||
});
|
||||
testButton.addActionListener((e) -> {
|
||||
testButton.setEnabled(false);
|
||||
action.run();
|
||||
passButton.setEnabled(true);
|
||||
failButton.setEnabled(true);
|
||||
});
|
||||
JPanel mainPanel = new JPanel(new BorderLayout());
|
||||
mainPanel.add(textArea, BorderLayout.CENTER);
|
||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||
buttonPanel.add(testButton);
|
||||
buttonPanel.add(passButton);
|
||||
buttonPanel.add(failButton);
|
||||
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||||
dialog.add(mainPanel);
|
||||
|
||||
dialog.pack();
|
||||
dialog.setVisible(true);
|
||||
dialog.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
System.out.println("main dialog closing");
|
||||
testGeneratedInterrupt = false;
|
||||
mainThread.interrupt();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
184
jdk/test/javax/sound/midi/Devices/ClosedReceiver.java
Normal file
184
jdk/test/javax/sound/midi/Devices/ClosedReceiver.java
Normal file
@ -0,0 +1,184 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4616517
|
||||
* @summary Receiver.send() does not work properly
|
||||
*/
|
||||
public class ClosedReceiver {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("#4616517: Receiver.send() does not work properly");
|
||||
if (!isMidiInstalled()) {
|
||||
out("Soundcard does not exist or sound drivers not installed!");
|
||||
out("This test requires sound drivers for execution.");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean passed = true;
|
||||
|
||||
passed &= testReceiverSend();
|
||||
passed &= testClosedReceivers();
|
||||
if (passed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute Receiver.send() and expect that there is no exception.
|
||||
*/
|
||||
private static boolean testReceiverSend() {
|
||||
boolean result = true;
|
||||
|
||||
Receiver receiver;
|
||||
ShortMessage shMsg = new ShortMessage();
|
||||
|
||||
try {
|
||||
receiver = MidiSystem.getReceiver();
|
||||
shMsg.setMessage(ShortMessage.NOTE_ON, 0,60, 93);
|
||||
try {
|
||||
receiver.send( shMsg, -1 );
|
||||
} catch(IllegalStateException ilEx) {
|
||||
ilEx.printStackTrace(System.out);
|
||||
out("IllegalStateException was thrown incorrectly!");
|
||||
result = false;
|
||||
}
|
||||
receiver.close();
|
||||
} catch(MidiUnavailableException e) {
|
||||
out("Midi unavailable, cannot test.");
|
||||
} catch(InvalidMidiDataException ine) {
|
||||
out("InvalidMidiDataException, cannot test.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static boolean testClosedReceivers() {
|
||||
boolean result = true;
|
||||
Receiver receiver;
|
||||
Synthesizer synt = null;
|
||||
|
||||
// test Synthesizer's Receiver
|
||||
try {
|
||||
synt = MidiSystem.getSynthesizer();
|
||||
synt.open();
|
||||
} catch(MidiUnavailableException e) {
|
||||
out("Midi unavailable, cannot test.");
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
receiver = synt.getReceiver();
|
||||
} catch (MidiUnavailableException e) {
|
||||
out("unable to get Receiver from synthesizer, cannot test.");
|
||||
return result;
|
||||
}
|
||||
result &= testClosedReceiver(receiver);
|
||||
synt.close();
|
||||
|
||||
// test all MidiDevices' Receivers
|
||||
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
if (device.getMaxReceivers() != 0) {
|
||||
receiver = device.getReceiver();
|
||||
result &= testClosedReceiver(receiver);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
out(e);
|
||||
out("cannot test.");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute send() on a closed Receivers and expect IllegalStateException.
|
||||
*/
|
||||
private static boolean testClosedReceiver(Receiver receiver) {
|
||||
boolean result = true;
|
||||
out("testing Receiver: " + receiver);
|
||||
ShortMessage shMsg = new ShortMessage();
|
||||
try {
|
||||
shMsg.setMessage(ShortMessage.NOTE_ON, 0,60, 93);
|
||||
} catch(InvalidMidiDataException e) {
|
||||
out(e);
|
||||
out("unable to construct ShortMessage, cannot test.");
|
||||
return result;
|
||||
}
|
||||
|
||||
// begin of test
|
||||
receiver.close();
|
||||
try {
|
||||
receiver.send( shMsg, -1 );
|
||||
out("IllegalStateException was not thrown "
|
||||
+ "on Receiver.send()!");
|
||||
result = false;
|
||||
} catch(IllegalStateException e) {
|
||||
out("IllegalStateException was thrown. Ok.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void out(Throwable t) {
|
||||
t.printStackTrace(System.out);
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one MIDI (port) device is correctly installed on
|
||||
* the system.
|
||||
*/
|
||||
private static boolean isMidiInstalled() {
|
||||
boolean result = false;
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
result = !(device instanceof Sequencer)
|
||||
&& !(device instanceof Synthesizer);
|
||||
} catch (Exception e1) {
|
||||
System.err.println(e1);
|
||||
}
|
||||
if (result)
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
404
jdk/test/javax/sound/midi/Devices/IOLoop.java
Normal file
404
jdk/test/javax/sound/midi/Devices/IOLoop.java
Normal file
@ -0,0 +1,404 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.io.ByteArrayOutputStream;
|
||||
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiMessage;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.SysexMessage;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4782924
|
||||
* @bug 4812168
|
||||
* @bug 4356787
|
||||
* @summary MIDI i/o. This is an interactive test! Start it and follow the
|
||||
* instructions.
|
||||
* @run main/manual IOLoop
|
||||
*/
|
||||
public class IOLoop {
|
||||
private static final int LONG_SYSEX_LENGTH = 2000;
|
||||
|
||||
private static Receiver receiver;
|
||||
private static Transmitter transmitter;
|
||||
private static MidiMessage receivedMessage;
|
||||
private static ByteArrayOutputStream baos;
|
||||
private static int expectedBytes;
|
||||
private static int receivedBytes;
|
||||
private static Object lock = new Object();
|
||||
private static long lastTimestamp;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
ShortMessage sMsg = new ShortMessage();
|
||||
SysexMessage syMsg = new SysexMessage();
|
||||
boolean isTestPassed = true;
|
||||
boolean sysExTestPassed = true;
|
||||
boolean isTestExecuted = true;
|
||||
|
||||
out("To run this test successfully, you need to have attached");
|
||||
out(" your MIDI out port with the MIDI in port.");
|
||||
|
||||
MidiDevice inDev = null;
|
||||
MidiDevice outDev = null;
|
||||
|
||||
// setup
|
||||
try {
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
|
||||
int devNum = Integer.decode(args[0]).intValue();
|
||||
out("-> opening Transmitter from "+infos[devNum]);
|
||||
inDev = MidiSystem.getMidiDevice(infos[devNum]);
|
||||
inDev.open();
|
||||
transmitter = inDev.getTransmitter();
|
||||
Receiver testReceiver = new TestReceiver();
|
||||
transmitter.setReceiver(testReceiver);
|
||||
|
||||
devNum = Integer.decode(args[1]).intValue();
|
||||
out("-> opening Receiver from "+infos[devNum]);
|
||||
outDev = MidiSystem.getMidiDevice(infos[devNum]);
|
||||
outDev.open();
|
||||
receiver = outDev.getReceiver();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println(e);
|
||||
System.out.println("Cannot test!");
|
||||
return;
|
||||
}
|
||||
|
||||
// test
|
||||
sMsg.setMessage(ShortMessage.NOTE_OFF | 0, 27, 100);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.NOTE_OFF | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.NOTE_OFF | 15, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.NOTE_ON | 4, 27, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.NOTE_ON | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.NOTE_ON | 15, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.POLY_PRESSURE | 11, 98, 99);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.POLY_PRESSURE | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.POLY_PRESSURE | 15, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CONTROL_CHANGE | 13, 1, 63);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CONTROL_CHANGE | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CONTROL_CHANGE | 15, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.PROGRAM_CHANGE | 2, 120, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.PROGRAM_CHANGE | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.PROGRAM_CHANGE | 15, 127, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CHANNEL_PRESSURE | 6, 30, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CHANNEL_PRESSURE | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CHANNEL_PRESSURE | 15, 127, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
|
||||
sMsg.setMessage(ShortMessage.PITCH_BEND | 6, 56, 4);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.PITCH_BEND | 0, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.PITCH_BEND | 15, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
|
||||
sMsg.setMessage(ShortMessage.MIDI_TIME_CODE, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.MIDI_TIME_CODE, 127, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_POSITION_POINTER, 1, 77);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_POSITION_POINTER, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_POSITION_POINTER, 127, 127);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_SELECT, 51, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_SELECT, 0, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SONG_SELECT, 127, 0);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.TUNE_REQUEST);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
|
||||
sMsg.setMessage(ShortMessage.TIMING_CLOCK);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.START);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.CONTINUE);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.STOP);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.ACTIVE_SENSING);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
sMsg.setMessage(ShortMessage.SYSTEM_RESET);
|
||||
isTestPassed &= testMessage(sMsg);
|
||||
|
||||
syMsg.setMessage(new byte[]{(byte) 0xF0, (byte) 0xF7}, 2);
|
||||
isTestPassed &= testMessage(syMsg);
|
||||
syMsg.setMessage(new byte[]{(byte) 0xF0, 0x01, (byte) 0xF7}, 3);
|
||||
isTestPassed &= testMessage(syMsg);
|
||||
syMsg.setMessage(new byte[]{(byte) 0xF0, 0x02, 0x03, (byte) 0xF7}, 4);
|
||||
isTestPassed &= testMessage(syMsg);
|
||||
syMsg.setMessage(new byte[]{(byte) 0xF0, 0x04, 0x05, 0x06, (byte) 0xF7}, 5);
|
||||
isTestPassed &= testMessage(syMsg);
|
||||
|
||||
if (isTestPassed) {
|
||||
byte[] sysexArray = new byte[LONG_SYSEX_LENGTH];
|
||||
sysexArray[0] = (byte) 0xF0;
|
||||
for (int i = 1; i < sysexArray.length; i++) {
|
||||
sysexArray[i] = (byte) (i % 0x80);
|
||||
}
|
||||
// syMsg.setMessage(new byte[]{(byte) 0xF7, (byte) ShortMessage.START}, 2);
|
||||
// sMsg.setMessage(ShortMessage.START);
|
||||
// isTestPassed &= testMessage(syMsg, sMsg, DEFAULT_SLEEP_INTERVALL);
|
||||
for (int trial = sysexArray.length; trial > 4; trial -= 1234) {
|
||||
sleep(500);
|
||||
sysexArray[trial - 1] = (byte) 0xF7;
|
||||
syMsg.setMessage(sysexArray, trial);
|
||||
sysExTestPassed &= testMessage(syMsg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// cleanup
|
||||
receiver.close();
|
||||
transmitter.close();
|
||||
inDev.close();
|
||||
outDev.close();
|
||||
|
||||
if (isTestExecuted) {
|
||||
if (isTestPassed && sysExTestPassed) {
|
||||
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
if (isTestPassed
|
||||
&& !sysExTestPassed
|
||||
&& (System.getProperty("os.name").startsWith("Windows"))) {
|
||||
out("Some Windows MIDI i/o drivers have a problem with larger ");
|
||||
out("sys ex messages. The failing sys ex cases are OK, therefore.");
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
out("Test NOT FAILED");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean testMessage(MidiMessage message) {
|
||||
receivedMessage = null;
|
||||
baos = new ByteArrayOutputStream();
|
||||
expectedBytes = message.getLength();
|
||||
receivedBytes = 0;
|
||||
System.out.print("Sending message " + getMessageString(message.getMessage())+"...");
|
||||
receiver.send(message, -1);
|
||||
/* sending 3 bytes can roughly be done in 1 millisecond,
|
||||
* so this estimate waits at max 3 times longer than the message takes,
|
||||
* plus a little offset to allow the MIDI subsystem some processing time
|
||||
*/
|
||||
int offset = 300; // standard offset 100 millis
|
||||
if (message instanceof SysexMessage) {
|
||||
// add a little processing time to sysex messages
|
||||
offset += 1000;
|
||||
}
|
||||
if (receivedBytes < expectedBytes) {
|
||||
sleep(expectedBytes + offset);
|
||||
}
|
||||
boolean equal;
|
||||
byte[] data = baos.toByteArray();
|
||||
if (data.length > 0) {
|
||||
equal = messagesEqual(message.getMessage(), data);
|
||||
} else {
|
||||
equal = messagesEqual(message, receivedMessage);
|
||||
if (receivedMessage != null) {
|
||||
data = receivedMessage.getMessage();
|
||||
} else {
|
||||
data = null;
|
||||
}
|
||||
}
|
||||
if (!equal) {
|
||||
if ((message.getStatus() & 0xF0) == ShortMessage.PITCH_BEND) {
|
||||
out("NOT failed (may expose a bug in ALSA)");
|
||||
equal = true;
|
||||
sleep(100);
|
||||
}
|
||||
if ((message.getStatus() == 0xF6) && (message.getLength() == 1)) {
|
||||
out("NOT failed (may expose an issue on Solaris)");
|
||||
equal = true;
|
||||
sleep(100);
|
||||
}
|
||||
else if ((message.getStatus()) == 0xF0 && message.getLength() < 4) {
|
||||
out("NOT failed (not a correct sys ex message)");
|
||||
equal = true;
|
||||
sleep(200);
|
||||
} else {
|
||||
out("FAILED:");
|
||||
out(" received as " + getMessageString(data));
|
||||
}
|
||||
} else {
|
||||
System.out.println("OK");
|
||||
}
|
||||
return equal;
|
||||
}
|
||||
|
||||
private static void sleep(int milliseconds) {
|
||||
synchronized(lock) {
|
||||
try {
|
||||
lock.wait(milliseconds);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String getMessageString(byte[] data) {
|
||||
String s;
|
||||
if (data == null) {
|
||||
s = "<null>";
|
||||
} else if (data.length == 0) {
|
||||
s = "0-sized array";
|
||||
} else {
|
||||
int status = data[0] & 0xFF;
|
||||
if (data.length <= 3) {
|
||||
if (status < 240) {
|
||||
s = "command 0x" + Integer.toHexString(status & 0xF0) + " channel " + (status & 0x0F);
|
||||
} else {
|
||||
s = "status 0x" + Integer.toHexString(status);
|
||||
}
|
||||
if (data.length > 1) {
|
||||
s += " data 0x" + Integer.toHexString(data[1] & 0xFF);
|
||||
if (data.length > 2) {
|
||||
s += " 0x" + Integer.toHexString(data[2] & 0xFF);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
s = "status " + Integer.toHexString(status)+" and length "+data.length+" bytes";
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private static boolean messagesEqual(MidiMessage m1, MidiMessage m2) {
|
||||
if (m1 == null || m2 == null) {
|
||||
return false;
|
||||
}
|
||||
if (m1.getLength() != m2.getLength()) {
|
||||
return false;
|
||||
}
|
||||
byte[] array1 = m1.getMessage();
|
||||
byte[] array2 = m2.getMessage();
|
||||
return messagesEqual(array1, array2);
|
||||
}
|
||||
|
||||
private static boolean messagesEqual(byte[] a1, byte[] a2) {
|
||||
if (a1.length != a2.length) return false;
|
||||
for (int i = 0; i < a1.length; i++) {
|
||||
if (a1[i] != a2[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void out(String s) {
|
||||
System.out.println(s);
|
||||
System.out.flush();
|
||||
}
|
||||
|
||||
private static String canIn(MidiDevice dev) {
|
||||
if (dev.getMaxTransmitters() != 0) {
|
||||
return "IN ";
|
||||
}
|
||||
return " ";
|
||||
}
|
||||
|
||||
private static String canOut(MidiDevice dev) {
|
||||
if (dev.getMaxReceivers() != 0) {
|
||||
return "OUT ";
|
||||
}
|
||||
return " ";
|
||||
}
|
||||
|
||||
|
||||
private static void checkTimestamp(long timestamp) {
|
||||
// out("checking timestamp...");
|
||||
if (timestamp < 1) {
|
||||
out("timestamp 0 or negative!");
|
||||
}
|
||||
if (timestamp < lastTimestamp) {
|
||||
out("timestamp not progressive!");
|
||||
}
|
||||
lastTimestamp = timestamp;
|
||||
}
|
||||
|
||||
private static class TestReceiver implements Receiver {
|
||||
public void send(MidiMessage message, long timestamp) {
|
||||
//System.out.print(""+message.getLength()+"..");
|
||||
checkTimestamp(timestamp);
|
||||
try {
|
||||
receivedMessage = message;
|
||||
if (message.getStatus() == 0xF0
|
||||
|| (message.getLength() > 3 && message.getStatus() != 0xF7)) {
|
||||
// sys ex message
|
||||
byte[] data = message.getMessage();
|
||||
baos.write(data);
|
||||
receivedBytes += data.length;
|
||||
}
|
||||
else if (message.getStatus() == 0xF7) {
|
||||
// sys ex cont'd message
|
||||
byte[] data = message.getMessage();
|
||||
// ignore the prepended 0xF7
|
||||
baos.write(data, 1, data.length-1);
|
||||
receivedBytes += (data.length - 1);
|
||||
} else {
|
||||
receivedBytes += message.getLength();
|
||||
}
|
||||
if (receivedBytes >= expectedBytes) {
|
||||
synchronized(lock) {
|
||||
lock.notify();
|
||||
}
|
||||
}
|
||||
System.out.print(""+receivedBytes+"..");
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
}
|
||||
}
|
||||
}
|
||||
187
jdk/test/javax/sound/midi/Devices/MidiDeviceGetReceivers.java
Normal file
187
jdk/test/javax/sound/midi/Devices/MidiDeviceGetReceivers.java
Normal file
@ -0,0 +1,187 @@
|
||||
/*
|
||||
* 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.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4931387
|
||||
* @summary Add methods to MidiDevice to get list of Transmitters and Receivers
|
||||
*/
|
||||
public class MidiDeviceGetReceivers {
|
||||
|
||||
private static boolean executed = false;
|
||||
private static boolean failed = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("unit test 4931387: Add methods to MidiDevice to get list of Transmitters and Receivers");
|
||||
doAllTests();
|
||||
if (executed) {
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
out("Test NOT failed.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void doAllTests() {
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
MidiDevice device = null;
|
||||
try {
|
||||
device = MidiSystem.getMidiDevice(infos[i]);
|
||||
doTest(device);
|
||||
} catch (MidiUnavailableException e) {
|
||||
out("Exception occured when retrieving device "+infos[i]+": "+e);
|
||||
}
|
||||
}
|
||||
if (infos.length == 0) {
|
||||
out("No MIDI devices exist or sound drivers not installed!");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean containsReceiver(MidiDevice dev, Receiver rec) {
|
||||
List<Receiver> recvs = dev.getReceivers();
|
||||
return recvs.contains(rec);
|
||||
}
|
||||
|
||||
private static boolean containsTransmitter(MidiDevice dev, Transmitter tra) {
|
||||
List<Transmitter> tras = dev.getTransmitters();
|
||||
return tras.contains(tra);
|
||||
}
|
||||
|
||||
private static void doTest(MidiDevice device) {
|
||||
boolean thisFailed = false;
|
||||
out1("Testing: " + device+"...");
|
||||
try {
|
||||
device.open();
|
||||
} catch (Exception e) {
|
||||
out2("device.open threw exception: "+e);
|
||||
out2("cannot test this device.");
|
||||
return;
|
||||
}
|
||||
if (device.getMaxReceivers() != 0) {
|
||||
// device offers receivers
|
||||
try {
|
||||
List<Receiver> origList = device.getReceivers();
|
||||
Receiver rec = device.getReceiver();
|
||||
if (!containsReceiver(device, rec)) {
|
||||
out2("Getting a receiver did not add it to device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
if (origList.contains(rec)) {
|
||||
out2("Original unmodifiable list was modified by adding a receiver!");
|
||||
thisFailed = true;
|
||||
}
|
||||
rec.close();
|
||||
if (containsReceiver(device, rec)) {
|
||||
out2("Closing a receiver did not remove it from device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
// add a new receiver so that the device.close will really test
|
||||
// that the receiver is removed
|
||||
rec = device.getReceiver();
|
||||
if (!containsReceiver(device, rec)) {
|
||||
out2("Getting a receiver again did not add it to device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
} catch (MidiUnavailableException e) {
|
||||
out2("Exception on getting Receiver: " + e);
|
||||
}
|
||||
}
|
||||
if (device.getMaxTransmitters() != 0) {
|
||||
// device offers transmitters
|
||||
try {
|
||||
List<Transmitter> origList = device.getTransmitters();
|
||||
Transmitter tra = device.getTransmitter();
|
||||
if (!containsTransmitter(device, tra)) {
|
||||
out2("Getting a transmitter did not add it to device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
if (origList.contains(tra)) {
|
||||
out2("Original unmodifiable list was modified by adding a transmitter!");
|
||||
thisFailed = true;
|
||||
}
|
||||
tra.close();
|
||||
if (containsTransmitter(device, tra)) {
|
||||
out2("Closing a transmitter did not remove it from device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
tra = device.getTransmitter();
|
||||
if (!containsTransmitter(device, tra)) {
|
||||
out2("Getting a transmitter again did not add it to device list!");
|
||||
thisFailed = true;
|
||||
}
|
||||
} catch (MidiUnavailableException e) {
|
||||
out("Exception on getting Transmitter: " + e);
|
||||
}
|
||||
}
|
||||
try {
|
||||
device.close();
|
||||
if (device.getTransmitters().size() > 0) {
|
||||
out2(" Device still has transmitters after close() was called!");
|
||||
thisFailed = true;
|
||||
}
|
||||
if (device.getReceivers().size() > 0) {
|
||||
out2(" Device still has receivers after close() was called!");
|
||||
thisFailed = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
out2("device.close threw exception: "+e);
|
||||
}
|
||||
if (!thisFailed) {
|
||||
out("OK");
|
||||
} else {
|
||||
failed = true;
|
||||
}
|
||||
executed = true;
|
||||
}
|
||||
|
||||
static boolean lfMissing = false;
|
||||
|
||||
private static void out(String message) {
|
||||
lfMissing = true;
|
||||
System.out.println(message);
|
||||
}
|
||||
|
||||
/* don't print LF at end */
|
||||
private static void out1(String message) {
|
||||
System.out.print(message);
|
||||
lfMissing = true;
|
||||
}
|
||||
|
||||
/* print at a new line, indented */
|
||||
private static void out2(String message) {
|
||||
if (lfMissing) {
|
||||
System.out.println();
|
||||
lfMissing = false;
|
||||
}
|
||||
System.out.println(" "+message);
|
||||
}
|
||||
}
|
||||
92
jdk/test/javax/sound/midi/Devices/MidiIO.java
Normal file
92
jdk/test/javax/sound/midi/Devices/MidiIO.java
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4356787
|
||||
* @summary MIDI device I/O is not working
|
||||
*/
|
||||
public class MidiIO {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("4356787: MIDI device I/O is not working (windows)");
|
||||
|
||||
if (System.getProperty("os.name").startsWith("Windows")) {
|
||||
boolean forInput=true;
|
||||
boolean forOutput=true;
|
||||
int outOnlyCount=0;
|
||||
int inOnlyCount=0;
|
||||
out(" available MIDI devices:");
|
||||
MidiDevice.Info[] aInfos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < aInfos.length; i++) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(aInfos[i]);
|
||||
boolean bAllowsInput = (device.getMaxTransmitters() != 0);
|
||||
boolean bAllowsOutput = (device.getMaxReceivers() != 0);
|
||||
if (bAllowsInput && !bAllowsOutput) {
|
||||
inOnlyCount++;
|
||||
}
|
||||
if (!bAllowsInput && bAllowsOutput) {
|
||||
outOnlyCount++;
|
||||
}
|
||||
if ((bAllowsInput && forInput) || (bAllowsOutput && forOutput)) {
|
||||
out(""+i+" "
|
||||
+(bAllowsInput?"IN ":" ")
|
||||
+(bAllowsOutput?"OUT ":" ")
|
||||
+aInfos[i].getName()+", "
|
||||
+aInfos[i].getVendor()+", "
|
||||
+aInfos[i].getVersion()+", "
|
||||
+aInfos[i].getDescription());
|
||||
}
|
||||
}
|
||||
catch (MidiUnavailableException e) {
|
||||
// device is obviously not available...
|
||||
}
|
||||
}
|
||||
if (aInfos.length == 0) {
|
||||
out("No devices available. Test should be run on systems with MIDI drivers installed.");
|
||||
} else {
|
||||
if (outOnlyCount>1) {
|
||||
if (inOnlyCount==0) {
|
||||
//throw new Exception("No input devices! test fails.");
|
||||
out("System provides out devices, but no input devices. This means either");
|
||||
out("a bug in Java Sound, or the drivers are not set up correctly.");
|
||||
}
|
||||
out("Test passed.");
|
||||
} else {
|
||||
out("no MIDI I/O installed. Test should be run on systems with MIDI drivers installed.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
out(" -- not on Windows. Test doesn't apply.");
|
||||
}
|
||||
}
|
||||
|
||||
static void out(String s) {
|
||||
System.out.println(s); System.out.flush();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4903786
|
||||
* @summary MIDI OUT does not implement getMicrosecondPosition() consistently
|
||||
*/
|
||||
public class MidiOutGetMicrosecondPositionBug {
|
||||
static int successfulTests = 0;
|
||||
|
||||
private static void testDevice(MidiDevice device) throws Exception {
|
||||
boolean timestampsAvailable = false;
|
||||
boolean timestampPrecisionOk = false;
|
||||
try {
|
||||
// expected behaviour if not opened?
|
||||
device.open();
|
||||
/* First, we're testing if timestamps are provided at all.
|
||||
Returning -1 (unsupported), while allowed by the API
|
||||
specification, is not sufficient to pass this test. */
|
||||
long timestamp = device.getMicrosecondPosition();
|
||||
timestampsAvailable = (timestamp != -1);
|
||||
|
||||
/* Then, we're testing the precision. Note that the system time
|
||||
is measured in milliseconds, while the device time is measured
|
||||
in microseconds. */
|
||||
|
||||
long systemTime1 = System.currentTimeMillis();
|
||||
long deviceTime1 = device.getMicrosecondPosition();
|
||||
// rest for 5 seconds
|
||||
Thread.sleep(5000);
|
||||
long systemTime2 = System.currentTimeMillis();
|
||||
long deviceTime2 = device.getMicrosecondPosition();
|
||||
|
||||
// now both period measurements are calculated in milliseconds.
|
||||
long systemDuration = systemTime2 - systemTime1;
|
||||
long deviceDuration = (deviceTime2 - deviceTime1) / 1000;
|
||||
long delta = Math.abs(systemDuration - deviceDuration);
|
||||
// a deviation of 0.5 seconds (= 500 ms) is allowed.
|
||||
timestampPrecisionOk = (delta <= 500);
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - " + t.toString());
|
||||
return;
|
||||
} finally {
|
||||
device.close();
|
||||
}
|
||||
if (! timestampsAvailable) {
|
||||
throw new Exception("timestamps are not supported");
|
||||
}
|
||||
if (! timestampPrecisionOk) {
|
||||
throw new Exception("device timer not precise enough");
|
||||
}
|
||||
successfulTests++;
|
||||
}
|
||||
|
||||
private static void doAll() throws Exception {
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i=0; i < infos.length; i++) {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
|
||||
if ((! (device instanceof Sequencer)) &&
|
||||
(! (device instanceof Synthesizer)) &&
|
||||
(device.getMaxReceivers() > 0 || device.getMaxReceivers() == -1)) {
|
||||
|
||||
System.out.println("--------------");
|
||||
System.out.println("Testing MIDI device: " + infos[i]);
|
||||
testDevice(device);
|
||||
}
|
||||
if (infos.length==0) {
|
||||
System.out.println("No MIDI devices available!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (!isMidiInstalled()) {
|
||||
return;
|
||||
}
|
||||
doAll();
|
||||
if (successfulTests==0) {
|
||||
System.out.println("Could not execute any of the tests. Test NOT failed.");
|
||||
} else {
|
||||
System.out.println("Test PASSED.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one MIDI (port) device is correctly installed on
|
||||
* the system.
|
||||
*/
|
||||
public static boolean isMidiInstalled() {
|
||||
boolean result = false;
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer);
|
||||
} catch (Exception e1) {
|
||||
System.err.println(e1);
|
||||
}
|
||||
if (result)
|
||||
break;
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
611
jdk/test/javax/sound/midi/Devices/OpenClose.java
Normal file
611
jdk/test/javax/sound/midi/Devices/OpenClose.java
Normal file
@ -0,0 +1,611 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4616517
|
||||
* @summary Receiver.send() does not work properly. Tests open/close behaviour
|
||||
* of MidiDevices. For this test, it is essential that the MidiDevice
|
||||
* picked from the list of devices (MidiSystem.getMidiDeviceInfo()) is
|
||||
* the same as the one used by
|
||||
* MidiSystem.getReceiver()/getTransmitter(). To achieve this, default
|
||||
* provider properties for Receivers/Transmitters are used.
|
||||
*/
|
||||
public class OpenClose {
|
||||
|
||||
private static boolean isTestExecuted;
|
||||
private static boolean isTestPassed;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean failed = false;
|
||||
out("#4616517: Receiver.send() does not work properly");
|
||||
if (!isMidiInstalled()) {
|
||||
out("Soundcard does not exist or sound drivers not installed!");
|
||||
out("This test requires sound drivers for execution.");
|
||||
return;
|
||||
}
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
MidiDevice outDevice = null;
|
||||
MidiDevice inDevice = null;
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
|
||||
if (! (device instanceof Synthesizer) &&
|
||||
! (device instanceof Sequencer)) {
|
||||
if (device.getMaxReceivers() != 0) {
|
||||
outDevice = device;
|
||||
}
|
||||
if (device.getMaxTransmitters() != 0) {
|
||||
inDevice = device;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (outDevice != null) {
|
||||
// set the default provider properties
|
||||
System.setProperty(Receiver.class.getName(),
|
||||
"#" + outDevice.getDeviceInfo().getName());
|
||||
}
|
||||
if (inDevice != null) {
|
||||
System.setProperty(Transmitter.class.getName(),
|
||||
"#" + inDevice.getDeviceInfo().getName());
|
||||
}
|
||||
out("Using MIDI OUT Device: " + outDevice);
|
||||
out("Using MIDI IN Device: " + inDevice);
|
||||
|
||||
isTestExecuted = false;
|
||||
if (outDevice != null) {
|
||||
isTestExecuted = true;
|
||||
TestHelper testHelper = new ReceiverTestHelper(outDevice);
|
||||
try {
|
||||
doTest("Receiver", testHelper);
|
||||
failed |= testHelper.hasFailed();
|
||||
} catch (Exception e) {
|
||||
out("Exception occured, cannot test!");
|
||||
isTestExecuted = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (inDevice != null) {
|
||||
isTestExecuted = true;
|
||||
TestHelper testHelper = new TransmitterTestHelper(inDevice);
|
||||
try {
|
||||
doTest("Transmitter", testHelper);
|
||||
failed |= testHelper.hasFailed();
|
||||
} catch (Exception e) {
|
||||
out("Exception occured, cannot test!");
|
||||
isTestExecuted = false;
|
||||
}
|
||||
}
|
||||
|
||||
isTestPassed = ! failed;
|
||||
|
||||
if (isTestExecuted) {
|
||||
if (isTestPassed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
} else {
|
||||
out("Test NOT FAILED");
|
||||
}
|
||||
}
|
||||
|
||||
private static void doTest(String type,
|
||||
TestHelper testHelper) throws Exception {
|
||||
/* Case 1:
|
||||
- MidiDevice.open()
|
||||
- MidiDevice.close()
|
||||
*/
|
||||
out("checking " + type + " case 1...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 2a:
|
||||
- MidiSystem.get[Receiver|Transmitter]()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 2a...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 2b:
|
||||
- MidiDevice.get[Receiver|Transmitter]()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 2b...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 3a:
|
||||
- MidiSystem.get[Receiver|Transmitter]()
|
||||
- MidiDevice.open()
|
||||
- MidiDevice.close()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 3a...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 3b:
|
||||
- MidiDevice.get[Receiver|Transmitter]()
|
||||
- MidiDevice.open()
|
||||
- MidiDevice.close()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 3b...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 4a:
|
||||
- MidiSystem.get[Receiver|Transmitter]()
|
||||
- MidiDevice.open()
|
||||
- [Receiver|Transmitter].close()
|
||||
- MidiDevice.close()
|
||||
*/
|
||||
out("checking " + type + " case 4a...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 4b:
|
||||
- MidiDevice.get[Receiver|Transmitter]()
|
||||
- MidiDevice.open()
|
||||
- [Receiver|Transmitter].close()
|
||||
- MidiDevice.close()
|
||||
*/
|
||||
out("checking " + type + " case 4b...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 5a:
|
||||
- MidiDevice.open()
|
||||
- MidiSystem.get[Receiver|Transmitter]()
|
||||
- MidiDevice.close()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 5a...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 5b:
|
||||
- MidiDevice.open()
|
||||
- MidiDevice.get[Receiver|Transmitter]()
|
||||
- MidiDevice.close()
|
||||
- [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case 5b...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 6a:
|
||||
- MidiDevice.open()
|
||||
- MidiSystem.get[Receiver|Transmitter]()
|
||||
- [Receiver|Transmitter].close()
|
||||
- MidiDevice.close()
|
||||
*/
|
||||
out("checking " + type + " case 6a...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 6b:
|
||||
- MidiDevice.open()
|
||||
- MidiDevice.get[Receiver|Transmitter]()
|
||||
- [Receiver|Transmitter].close()
|
||||
- MidiDevice.close()
|
||||
*/
|
||||
out("checking " + type + " case 6b...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.openDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 7:
|
||||
- MidiSystem.get[Receiver|Transmitter]() // 1
|
||||
- MidiDevice.get[Receiver|Transmitter]() // 2
|
||||
- [Receiver|Transmitter].close() // 2
|
||||
- [Receiver|Transmitter].close() // 1
|
||||
*/
|
||||
out("checking " + type + " case 7...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 8:
|
||||
- MidiSystem.get[Receiver|Transmitter]() // 1
|
||||
- MidiDevice.get[Receiver|Transmitter]() // 2
|
||||
- [Receiver|Transmitter].close() // 1
|
||||
- [Receiver|Transmitter].close() // 2
|
||||
*/
|
||||
out("checking " + type + " case 8...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 9:
|
||||
- MidiDevice.get[Receiver|Transmitter]() // 2
|
||||
- MidiSystem.get[Receiver|Transmitter]() // 1
|
||||
- [Receiver|Transmitter].close() // 2
|
||||
- [Receiver|Transmitter].close() // 1
|
||||
*/
|
||||
out("checking " + type + " case 9...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case 10:
|
||||
- MidiDevice.get[Receiver|Transmitter]() // 2
|
||||
- MidiSystem.get[Receiver|Transmitter]() // 1
|
||||
- [Receiver|Transmitter].close() // 1
|
||||
- [Receiver|Transmitter].close() // 2
|
||||
*/
|
||||
out("checking " + type + " case 10...");
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
|
||||
testHelper.closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
testHelper.closeObjectDevice();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
|
||||
/* Case N - 1:
|
||||
- 10 x MidiSystem.get[Receiver|Transmitter]()
|
||||
- 10 x [Receiver|Transmitter].close()
|
||||
*/
|
||||
out("checking " + type + " case N - 1...");
|
||||
TestHelper[] testHelpers = new TestHelper[10];
|
||||
for (int i = 0; i < 10; i++) {
|
||||
testHelpers[i] = (TestHelper) testHelper.clone();
|
||||
}
|
||||
testHelper.checkClosed();
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
testHelpers[i].fetchObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
testHelpers[i].closeObjectMidiSystem();
|
||||
testHelper.checkOpen();
|
||||
}
|
||||
|
||||
testHelpers[9].closeObjectMidiSystem();
|
||||
testHelper.checkClosed();
|
||||
|
||||
out("...OK");
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
|
||||
private static abstract class TestHelper implements Cloneable {
|
||||
private MidiDevice device;
|
||||
private boolean failed;
|
||||
|
||||
protected TestHelper(MidiDevice device) {
|
||||
this.device = device;
|
||||
failed = false;
|
||||
}
|
||||
|
||||
protected MidiDevice getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
public boolean hasFailed() {
|
||||
return failed;
|
||||
}
|
||||
|
||||
public void openDevice() throws MidiUnavailableException {
|
||||
getDevice().open();
|
||||
}
|
||||
|
||||
public void closeDevice() {
|
||||
getDevice().close();
|
||||
}
|
||||
|
||||
public void checkOpen(){
|
||||
checkOpen(getDevice(), true);
|
||||
}
|
||||
|
||||
public void checkClosed(){
|
||||
checkOpen(getDevice(), false);
|
||||
}
|
||||
|
||||
private void checkOpen(MidiDevice device, boolean desiredState) {
|
||||
if (device.isOpen() != desiredState) {
|
||||
out("device should be " +
|
||||
getStateString(desiredState) + ", but isn't!");
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private String getStateString(boolean state) {
|
||||
return state ? "open" : "closed";
|
||||
}
|
||||
|
||||
|
||||
public abstract void fetchObjectMidiSystem() throws MidiUnavailableException;
|
||||
public abstract void fetchObjectDevice() throws MidiUnavailableException;
|
||||
public abstract void closeObjectMidiSystem();
|
||||
public abstract void closeObjectDevice();
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ReceiverTestHelper extends TestHelper {
|
||||
private Receiver receiverMidiSystem;
|
||||
private Receiver receiverDevice;
|
||||
|
||||
public ReceiverTestHelper(MidiDevice device) {
|
||||
super(device);
|
||||
}
|
||||
|
||||
public void fetchObjectMidiSystem() throws MidiUnavailableException {
|
||||
receiverMidiSystem = MidiSystem.getReceiver();
|
||||
}
|
||||
|
||||
|
||||
public void fetchObjectDevice() throws MidiUnavailableException {
|
||||
receiverDevice = getDevice().getReceiver();
|
||||
}
|
||||
|
||||
|
||||
public void closeObjectMidiSystem() {
|
||||
receiverMidiSystem.close();
|
||||
}
|
||||
|
||||
|
||||
public void closeObjectDevice() {
|
||||
receiverDevice.close();
|
||||
}
|
||||
}
|
||||
|
||||
private static class TransmitterTestHelper extends TestHelper {
|
||||
private Transmitter transmitterMidiSystem;
|
||||
private Transmitter transmitterDevice;
|
||||
|
||||
public TransmitterTestHelper(MidiDevice device) {
|
||||
super(device);
|
||||
}
|
||||
|
||||
public void fetchObjectMidiSystem() throws MidiUnavailableException {
|
||||
transmitterMidiSystem = MidiSystem.getTransmitter();
|
||||
}
|
||||
|
||||
|
||||
public void fetchObjectDevice() throws MidiUnavailableException {
|
||||
transmitterDevice = getDevice().getTransmitter();
|
||||
}
|
||||
|
||||
|
||||
public void closeObjectMidiSystem() {
|
||||
transmitterMidiSystem.close();
|
||||
}
|
||||
|
||||
|
||||
public void closeObjectDevice() {
|
||||
transmitterDevice.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one MIDI (port) device is correctly installed on
|
||||
* the system.
|
||||
*/
|
||||
public static boolean isMidiInstalled() {
|
||||
boolean result = false;
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer);
|
||||
} catch (Exception e1) {
|
||||
System.err.println(e1);
|
||||
}
|
||||
if (result)
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4616517
|
||||
* @summary Receiver.send() does not work properly
|
||||
*/
|
||||
public class ReceiverTransmitterAvailable {
|
||||
|
||||
private static boolean isTestExecuted;
|
||||
private static boolean isTestPassed;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("#4616517: Receiver.send() does not work properly");
|
||||
doAllTests();
|
||||
if (isTestExecuted) {
|
||||
if (isTestPassed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
} else {
|
||||
out("Test NOT FAILED");
|
||||
}
|
||||
}
|
||||
|
||||
private static void doAllTests() {
|
||||
boolean problemOccured = false;
|
||||
boolean succeeded = true;
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
MidiDevice device = null;
|
||||
try {
|
||||
device = MidiSystem.getMidiDevice(infos[i]);
|
||||
succeeded &= doTest(device);
|
||||
} catch (MidiUnavailableException e) {
|
||||
out("exception occured; cannot test");
|
||||
problemOccured = true;
|
||||
}
|
||||
}
|
||||
if (infos.length == 0) {
|
||||
out("Soundcard does not exist or sound drivers not installed!");
|
||||
out("This test requires sound drivers for execution.");
|
||||
}
|
||||
isTestExecuted = !problemOccured;
|
||||
isTestPassed = succeeded;
|
||||
}
|
||||
|
||||
private static boolean doTest(MidiDevice device) {
|
||||
boolean succeeded = true;
|
||||
out("Testing: " + device);
|
||||
boolean expectingReceivers = (device.getMaxReceivers() != 0);
|
||||
boolean expectingTransmitters = (device.getMaxTransmitters() != 0);
|
||||
try {
|
||||
Receiver rec = device.getReceiver();
|
||||
rec.close();
|
||||
if (! expectingReceivers) {
|
||||
out("no exception on getting Receiver");
|
||||
succeeded = false;
|
||||
}
|
||||
} catch (MidiUnavailableException e) {
|
||||
if (expectingReceivers) {
|
||||
out("Exception on getting Receiver: " + e);
|
||||
succeeded = false;
|
||||
}
|
||||
}
|
||||
try {
|
||||
Transmitter trans = device.getTransmitter();
|
||||
trans.close();
|
||||
if (! expectingTransmitters) {
|
||||
out("no exception on getting Transmitter");
|
||||
succeeded = false;
|
||||
}
|
||||
} catch (MidiUnavailableException e) {
|
||||
if (expectingTransmitters) {
|
||||
out("Exception on getting Transmitter: " + e);
|
||||
succeeded = false;
|
||||
}
|
||||
}
|
||||
return succeeded;
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
135
jdk/test/javax/sound/midi/Devices/Reopen.java
Normal file
135
jdk/test/javax/sound/midi/Devices/Reopen.java
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4914667
|
||||
* @summary Closing and reopening MIDI IN device on Linux throws
|
||||
* MidiUnavailableException
|
||||
*/
|
||||
public class Reopen {
|
||||
|
||||
private static boolean isTestExecuted;
|
||||
private static boolean isTestPassed;
|
||||
|
||||
/*
|
||||
* run manually:
|
||||
* java Reopen 100 in for 100 iterations on the MIDI IN device
|
||||
* java Reopen 16 out for 16 iterations on the MIDI OUT device
|
||||
*/
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (args.length == 0) {
|
||||
doAllTests();
|
||||
} else if (args.length == 2) {
|
||||
int numIterations = Integer.parseInt(args[0]);
|
||||
if (args[1].equals("in")) {
|
||||
doTest(numIterations, true);
|
||||
} else {
|
||||
doTest(numIterations, false);
|
||||
}
|
||||
} else {
|
||||
out("usage: java Reopen <iterations> in|out");
|
||||
}
|
||||
}
|
||||
|
||||
private static void doAllTests() throws Exception {
|
||||
out("#4914667: Closing and reopening MIDI IN device on Linux throws MidiUnavailableException");
|
||||
boolean success = true;
|
||||
try {
|
||||
success &= doTest(20, true); // MIDI IN
|
||||
success &= doTest(20, false); // MIDI OUT
|
||||
isTestExecuted = true;
|
||||
} catch (Exception e) {
|
||||
out(e);
|
||||
isTestExecuted = false;
|
||||
}
|
||||
isTestPassed = success;
|
||||
if (isTestExecuted) {
|
||||
if (isTestPassed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
} else {
|
||||
out("Test NOT FAILED");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean doTest(int numIterations, boolean input) throws Exception {
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
MidiDevice outDevice = null;
|
||||
MidiDevice inDevice = null;
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
|
||||
if (! (device instanceof Sequencer) &&
|
||||
! (device instanceof Synthesizer)) {
|
||||
if (device.getMaxReceivers() != 0) {
|
||||
outDevice = device;
|
||||
}
|
||||
if (device.getMaxTransmitters() != 0) {
|
||||
inDevice = device;
|
||||
}
|
||||
}
|
||||
}
|
||||
MidiDevice testDevice = null;
|
||||
if (input) {
|
||||
testDevice = inDevice;
|
||||
} else {
|
||||
testDevice = outDevice;
|
||||
}
|
||||
if (testDevice == null) {
|
||||
out("Cannot test: device not available.");
|
||||
return true;
|
||||
}
|
||||
out("Using Device: " + testDevice);
|
||||
|
||||
for (int i = 0; i < numIterations; i++) {
|
||||
out("@@@ ITERATION: " + i);
|
||||
testDevice.open();
|
||||
// This sleep ensures that the thread of MidiInDevice is started.
|
||||
sleep(50);
|
||||
testDevice.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void sleep(int milliseconds) {
|
||||
try {
|
||||
Thread.sleep(milliseconds);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
|
||||
private static void out(Throwable t) {
|
||||
t.printStackTrace(System.out);
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
60
jdk/test/javax/sound/midi/File/SMFCp037.java
Normal file
60
jdk/test/javax/sound/midi/File/SMFCp037.java
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.midi.MidiSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4303933
|
||||
* @summary MidiSystem fails to load MIDI file on systems with EBCDIC simulation
|
||||
*/
|
||||
public class SMFCp037 {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
// Test to read MIDI files with Cp037 character set - close enough
|
||||
// for EBCDIC simulation
|
||||
System.setProperty("file.encoding", "Cp037");
|
||||
// try to read this file with Cp037 encoding
|
||||
MidiSystem.getSequence(new ByteArrayInputStream(SHORT_SMF));
|
||||
System.out.println(" test passed.");
|
||||
}
|
||||
|
||||
public static byte[] SHORT_SMF = {
|
||||
77, 84, 104, 100, 0, 0, 0, 6, 0, 1, 0, 2, 0, 120, 77, 84, 114, 107, 0, 0,
|
||||
0, 27, 0, -1, 3, 19, 77, 73, 68, 73, 32, 116, 101, 115, 116, 32, 45, 32,
|
||||
116, 114, 97, 99, 107, 32, 48, 0, -1, 47, 0, 77, 84, 114, 107, 0, 0, 0, -44,
|
||||
0, -1, 3, 19, 77, 73, 68, 73, 32, 116, 101, 115, 116, 32, 45, 32, 116, 114,
|
||||
97, 99, 107, 32, 49, 0, -64, 30, 0, -112, 68, 126, 0, -32, 6, 67, 0, 14,
|
||||
71, 0, 20, 74, 0, 26, 77, 0, 32, 80, 0, 42, 85, 6, 50, 89, 6, 56, 92, 5,
|
||||
66, 97, 6, 74, 101, 6, 80, 104, 11, 84, 106, 20, 76, 102, 6, 70, 99, 5, 60,
|
||||
94, 6, 52, 90, 5, 44, 86, 4, 34, 81, 5, 26, 77, 5, 20, 74, 6, 10, 69, 5,
|
||||
2, 65, 7, 0, 64, 42, -112, 66, 123, 11, 68, 0, 72, 63, 126, 4, 66, 0, 43,
|
||||
-32, 0, 63, 6, 0, 60, 7, 0, 56, 6, 0, 53, 5, 0, 49, 5, 0, 43, 4, 0, 37, 3,
|
||||
0, 30, 3, 0, 25, 3, 0, 19, 3, 0, 13, 4, 0, 8, 4, 0, 2, 4, 0, 0, 70, 0, 3,
|
||||
5, 0, 9, 3, 0, 14, 7, 0, 16, 25, 0, 21, 5, 0, 25, 7, 0, 28, 5, 0, 32, 5,
|
||||
0, 36, 5, 0, 41, 6, 0, 46, 5, 0, 50, 5, 0, 53, 4, 0, 58, 7, 0, 61, 7, 0,
|
||||
64, 117, -112, 63, 0, 0, -1, 47, 0
|
||||
};
|
||||
}
|
||||
109
jdk/test/javax/sound/midi/File/SMFParserBreak.java
Normal file
109
jdk/test/javax/sound/midi/File/SMFParserBreak.java
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.io.ByteArrayInputStream;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4910986
|
||||
* @summary MIDI file parser breaks up on http connection
|
||||
*/
|
||||
public class SMFParserBreak {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
InputStream is = new ByteArrayInputStream(midifile);
|
||||
// create a buffered input stream that seems
|
||||
// to be on an unfortunate boundary for the
|
||||
// 1.4.2 SMF parser implementation
|
||||
is = new ChunkInputStream(is, 32);
|
||||
Sequence sequence = MidiSystem.getSequence(is);
|
||||
|
||||
long duration = sequence.getMicrosecondLength() / 10000;
|
||||
System.out.println("Duration: "+duration+" deciseconds ");
|
||||
|
||||
// the test is passed if no exception thrown
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
|
||||
// A MIDI file
|
||||
static byte[] midifile = {
|
||||
77, 84, 104, 100, 0, 0, 0, 6, 0, 1, 0, 3, -30, 120, 77, 84, 114, 107, 0,
|
||||
0, 0, 123, 0, -112, 30, 100, -113, 49, -128, 50, 100, -114, 69, -112, 31,
|
||||
100, -114, 33, -128, 51, 100, -114, 55, -112, 32, 100, -114, 120, -128, 52,
|
||||
100, -114, 40, -112, 33, 100, -114, 26, -128, 53, 100, -114, 26, -112, 34,
|
||||
100, -114, 76, -128, 54, 100, -114, 12, -112, 35, 100, -114, 91, -128, 55,
|
||||
100, -114, 69, -112, 36, 100, -114, 33, -128, 56, 100, -114, 55, -112, 37,
|
||||
100, -114, 84, -128, 57, 100, -114, 40, -112, 38, 100, -114, 26, -128, 58,
|
||||
100, -114, 26, -112, 39, 100, -113, 24, -128, 59, 100, -113, 60, -112, 40,
|
||||
100, -113, 110, -128, 60, 100, -113, 96, -112, 41, 100, -113, 39, -128, 61,
|
||||
100, 0, -1, 47, 0, 77, 84, 114, 107, 0, 0, 0, 4, 0, -1, 47, 0, 77, 84, 114,
|
||||
107, 0, 0, 0, 4, 0, -1, 47, 0
|
||||
};
|
||||
}
|
||||
|
||||
/* an input stream that always returns data in chunks */
|
||||
class ChunkInputStream extends FilterInputStream {
|
||||
int chunkSize;
|
||||
int p = 0; // position
|
||||
|
||||
public ChunkInputStream(InputStream is, int chunkSize) {
|
||||
super(is);
|
||||
this.chunkSize = chunkSize;
|
||||
}
|
||||
|
||||
// override to increase counter
|
||||
public int read() throws IOException {
|
||||
int ret = super.read();
|
||||
if (ret >= 0) {
|
||||
p++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// override to make sure that read(byte[], int, int) is used
|
||||
public int read(byte[] b) throws IOException {
|
||||
return read(b, 0, b.length);
|
||||
}
|
||||
|
||||
// override to split the data in chunks
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
// if we would pass a chunk boundary,
|
||||
// only return up to the chunk boundary
|
||||
if ( (p / chunkSize) < ( (p+len) / chunkSize)) {
|
||||
// p+len is in the next chunk
|
||||
len -= ((p+len) % chunkSize);
|
||||
}
|
||||
int ret = super.read(b, off, len);
|
||||
if (ret >= 0) {
|
||||
p += ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
74
jdk/test/javax/sound/midi/File/WriteRealTimeMessageNPE.java
Normal file
74
jdk/test/javax/sound/midi/File/WriteRealTimeMessageNPE.java
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5048381
|
||||
* @summary NPE when writing a sequence with a realtime MIDI message
|
||||
*/
|
||||
public class WriteRealTimeMessageNPE {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
System.out.println("5048381: NullPointerException when saving a MIDI sequence");
|
||||
boolean npeThrown = false;
|
||||
boolean noEx = false;
|
||||
|
||||
Sequence seq = new Sequence(Sequence.PPQ, 384, 1);
|
||||
Track t = seq.getTracks()[0];
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(0xF8, 0, 0);
|
||||
t.add(new MidiEvent(msg, 0));
|
||||
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
try {
|
||||
MidiSystem.write(seq, 0, out);
|
||||
noEx = true;
|
||||
} catch (NullPointerException npe) {
|
||||
npeThrown = true;
|
||||
System.out.println("## Failed: Threw unexpected NPE: "+npe);
|
||||
throw new Exception("Test FAILED!");
|
||||
} catch (Exception e) {
|
||||
System.out.println("Threw unexpected Exception: "+e);
|
||||
System.out.println("But at least did not throw NPE...");
|
||||
}
|
||||
if (noEx) {
|
||||
InputStream is = new ByteArrayInputStream(out.toByteArray());
|
||||
seq = MidiSystem.getSequence(is);
|
||||
System.out.println("Sequence has "+seq.getTracks().length+" tracks.");
|
||||
if (seq.getTracks().length > 0) {
|
||||
System.out.println("Track 0 has "+seq.getTracks()[0].size()+" events.");
|
||||
}
|
||||
}
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
}
|
||||
76
jdk/test/javax/sound/midi/MetaMessage/MetaMessageClone.java
Normal file
76
jdk/test/javax/sound/midi/MetaMessage/MetaMessageClone.java
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.MetaMessage;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4511796
|
||||
* @summary Check that MetaMessage.clone() works correctly
|
||||
*/
|
||||
public class MetaMessageClone {
|
||||
|
||||
private static void printMsg(MetaMessage msg, byte[] data) {
|
||||
System.out.println(""+msg.getLength()+" total bytes, type="+msg.getType()+", dataLength="+data.length);
|
||||
}
|
||||
|
||||
private static void checkClone(MetaMessage msg) throws Exception {
|
||||
System.out.print("Original: ");
|
||||
byte[] msgData=msg.getData();
|
||||
printMsg(msg, msgData);
|
||||
MetaMessage msg2=(MetaMessage) msg.clone();
|
||||
byte[] msg2Data=msg2.getData();
|
||||
System.out.print("Clone: ");
|
||||
printMsg(msg2, msg2Data);
|
||||
|
||||
if (msg2.getLength()!=msg.getLength()
|
||||
|| msg.getType()!=msg2.getType()
|
||||
|| msgData.length!=msg2Data.length) {
|
||||
throw new Exception("cloned MetaMessage is not equal.");
|
||||
}
|
||||
int max=Math.min(msgData.length, 10);
|
||||
for (int i=0; i<max; i++) {
|
||||
if (msgData[i]!=msg2Data[i]) {
|
||||
throw new Exception("Cloned MetaMessage data is not equal.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// let's create some MetaMessages and check them
|
||||
MetaMessage msg=new MetaMessage();
|
||||
String text="a textmarker";
|
||||
msg.setMessage(1, text.getBytes(), text.length());
|
||||
checkClone(msg);
|
||||
msg.setMessage(0x2E, new byte[0], 0);
|
||||
checkClone(msg);
|
||||
byte[] data=new byte[17000];
|
||||
for (int i=0; i<30; data[i]=(byte) (i++ & 0xFF));
|
||||
msg.setMessage(0x02, data, 80); checkClone(msg);
|
||||
msg.setMessage(0x02, data, 160); checkClone(msg);
|
||||
msg.setMessage(0x02, data, 400); checkClone(msg);
|
||||
msg.setMessage(0x02, data, 1000); checkClone(msg);
|
||||
msg.setMessage(0x02, data, 10000); checkClone(msg);
|
||||
msg.setMessage(0x02, data, 17000); checkClone(msg);
|
||||
}
|
||||
}
|
||||
384
jdk/test/javax/sound/midi/MidiSystem/6411624/Test6411624.java
Normal file
384
jdk/test/javax/sound/midi/MidiSystem/6411624/Test6411624.java
Normal file
@ -0,0 +1,384 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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.awt.Button;
|
||||
import java.awt.Dialog;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Panel;
|
||||
import java.awt.TextArea;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6411624
|
||||
* @summary Tests that MidiSystem.getReceiver() & MidiSystem.getTransmitter
|
||||
* doesn't return sequencer
|
||||
* @build bug6411624
|
||||
* @run main/manual Test6411624
|
||||
*/
|
||||
public class Test6411624 {
|
||||
|
||||
private static void init() throws Exception {
|
||||
//*** Create instructions for the user here ***
|
||||
|
||||
String[] instructions =
|
||||
{
|
||||
"This test should only be run on solaris or linux system",
|
||||
"WITHOUT audio card installed (to test on SunRay set",
|
||||
"incorrect $AUDIODEV value).",
|
||||
"If you system does not meet this conditions, press PASS.",
|
||||
"To run the test follow these instructions:",
|
||||
"1. Open a terminal window.",
|
||||
"2. Type \"cd " + System.getProperty("test.classes") + "\".",
|
||||
"3. Type \"" + System.getProperty("java.home") + "/bin/java bug6411624\".",
|
||||
"4. Follow the instructions shown in the terminal window.",
|
||||
"If you see \"All tests sucessfully passed\", press PASS else press FAIL."
|
||||
};
|
||||
|
||||
Sysout.createDialog( );
|
||||
Sysout.printInstructions( instructions );
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
Standard Test Machinery Section
|
||||
DO NOT modify anything in this section -- it's a
|
||||
standard chunk of code which has all of the
|
||||
synchronisation necessary for the test harness.
|
||||
By keeping it the same in all tests, it is easier
|
||||
to read and understand someone else's test, as
|
||||
well as insuring that all tests behave correctly
|
||||
with the test harness.
|
||||
There is a section following this for test-defined
|
||||
classes
|
||||
******************************************************/
|
||||
private static boolean theTestPassed = false;
|
||||
private static boolean testGeneratedInterrupt = false;
|
||||
private static String failureMessage = "";
|
||||
|
||||
private static Thread mainThread = null;
|
||||
|
||||
private static int sleepTime = 300000;
|
||||
|
||||
public static void main( String args[] ) throws Exception
|
||||
{
|
||||
mainThread = Thread.currentThread();
|
||||
try
|
||||
{
|
||||
init();
|
||||
}
|
||||
catch( TestPassedException e )
|
||||
{
|
||||
//The test passed, so just return from main and harness will
|
||||
// interepret this return as a pass
|
||||
return;
|
||||
}
|
||||
//At this point, neither test passed nor test failed has been
|
||||
// called -- either would have thrown an exception and ended the
|
||||
// test, so we know we have multiple threads.
|
||||
|
||||
//Test involves other threads, so sleep and wait for them to
|
||||
// called pass() or fail()
|
||||
try
|
||||
{
|
||||
Thread.sleep( sleepTime );
|
||||
//Timed out, so fail the test
|
||||
throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
if( ! testGeneratedInterrupt ) throw e;
|
||||
|
||||
//reset flag in case hit this code more than once for some reason (just safety)
|
||||
testGeneratedInterrupt = false;
|
||||
if ( theTestPassed == false )
|
||||
{
|
||||
throw new RuntimeException( failureMessage );
|
||||
}
|
||||
}
|
||||
|
||||
}//main
|
||||
|
||||
public static synchronized void setTimeoutTo( int seconds )
|
||||
{
|
||||
sleepTime = seconds * 1000;
|
||||
}
|
||||
|
||||
public static synchronized void pass()
|
||||
{
|
||||
Sysout.println( "The test passed." );
|
||||
Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
|
||||
//first check if this is executing in main thread
|
||||
if ( mainThread == Thread.currentThread() )
|
||||
{
|
||||
//Still in the main thread, so set the flag just for kicks,
|
||||
// and throw a test passed exception which will be caught
|
||||
// and end the test.
|
||||
theTestPassed = true;
|
||||
throw new TestPassedException();
|
||||
}
|
||||
//pass was called from a different thread, so set the flag and interrupt
|
||||
// the main thead.
|
||||
theTestPassed = true;
|
||||
testGeneratedInterrupt = true;
|
||||
mainThread.interrupt();
|
||||
}//pass()
|
||||
|
||||
public static synchronized void fail()
|
||||
{
|
||||
//test writer didn't specify why test failed, so give generic
|
||||
fail( "it just plain failed! :-)" );
|
||||
}
|
||||
|
||||
public static synchronized void fail( String whyFailed )
|
||||
{
|
||||
Sysout.println( "The test failed: " + whyFailed );
|
||||
Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
|
||||
//check if this called from main thread
|
||||
if ( mainThread == Thread.currentThread() )
|
||||
{
|
||||
//If main thread, fail now 'cause not sleeping
|
||||
throw new RuntimeException( whyFailed );
|
||||
}
|
||||
theTestPassed = false;
|
||||
testGeneratedInterrupt = true;
|
||||
failureMessage = whyFailed;
|
||||
mainThread.interrupt();
|
||||
}//fail()
|
||||
|
||||
}// class Orient
|
||||
|
||||
//This exception is used to exit from any level of call nesting
|
||||
// when it's determined that the test has passed, and immediately
|
||||
// end the test.
|
||||
class TestPassedException extends RuntimeException
|
||||
{
|
||||
}
|
||||
|
||||
//*********** End Standard Test Machinery Section **********
|
||||
|
||||
|
||||
//************ Begin classes defined for the test ****************
|
||||
|
||||
// make listeners in a class defined here, and instantiate them in init()
|
||||
|
||||
/* Example of a class which may be written as part of a test
|
||||
class NewClass implements anInterface
|
||||
{
|
||||
static int newVar = 0;
|
||||
|
||||
public void eventDispatched(AWTEvent e)
|
||||
{
|
||||
//Counting events to see if we get enough
|
||||
eventCount++;
|
||||
|
||||
if( eventCount == 20 )
|
||||
{
|
||||
//got enough events, so pass
|
||||
|
||||
Orient.pass();
|
||||
}
|
||||
else if( tries == 20 )
|
||||
{
|
||||
//tried too many times without getting enough events so fail
|
||||
|
||||
Orient.fail();
|
||||
}
|
||||
|
||||
}// eventDispatched()
|
||||
|
||||
}// NewClass class
|
||||
|
||||
*/
|
||||
|
||||
|
||||
//************** End classes defined for the test *******************
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************
|
||||
Standard Test Machinery
|
||||
DO NOT modify anything below -- it's a standard
|
||||
chunk of code whose purpose is to make user
|
||||
interaction uniform, and thereby make it simpler
|
||||
to read and understand someone else's test.
|
||||
****************************************************/
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery.
|
||||
It creates a dialog (with the instructions), and is the interface
|
||||
for sending text messages to the user.
|
||||
To print the instructions, send an array of strings to Sysout.createDialog
|
||||
WithInstructions method. Put one line of instructions per array entry.
|
||||
To display a message for the tester to see, simply call Sysout.println
|
||||
with the string to be displayed.
|
||||
This mimics System.out.println but works within the test harness as well
|
||||
as standalone.
|
||||
*/
|
||||
|
||||
class Sysout
|
||||
{
|
||||
private static TestDialog dialog;
|
||||
|
||||
public static void createDialogWithInstructions( String[] instructions )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
dialog.printInstructions( instructions );
|
||||
dialog.show();
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
public static void createDialog( )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
String[] defInstr = { "Instructions will appear here. ", "" } ;
|
||||
dialog.printInstructions( defInstr );
|
||||
dialog.show();
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
|
||||
public static void printInstructions( String[] instructions )
|
||||
{
|
||||
dialog.printInstructions( instructions );
|
||||
}
|
||||
|
||||
|
||||
public static void println( String messageIn )
|
||||
{
|
||||
dialog.displayMessage( messageIn );
|
||||
}
|
||||
|
||||
}// Sysout class
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery. It provides a place for the
|
||||
test instructions to be displayed, and a place for interactive messages
|
||||
to the user to be displayed.
|
||||
To have the test instructions displayed, see Sysout.
|
||||
To have a message to the user be displayed, see Sysout.
|
||||
Do not call anything in this dialog directly.
|
||||
*/
|
||||
class TestDialog extends Dialog implements ActionListener
|
||||
{
|
||||
|
||||
TextArea instructionsText;
|
||||
TextArea messageText;
|
||||
int maxStringLength = 80;
|
||||
Panel buttonP = new Panel();
|
||||
Button passB = new Button( "pass" );
|
||||
Button failB = new Button( "fail" );
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public TestDialog( Frame frame, String name )
|
||||
{
|
||||
super( frame, name );
|
||||
int scrollBoth = TextArea.SCROLLBARS_BOTH;
|
||||
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
|
||||
add( "North", instructionsText );
|
||||
|
||||
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
|
||||
add("Center", messageText);
|
||||
|
||||
passB = new Button( "pass" );
|
||||
passB.setActionCommand( "pass" );
|
||||
passB.addActionListener( this );
|
||||
buttonP.add( "East", passB );
|
||||
|
||||
failB = new Button( "fail" );
|
||||
failB.setActionCommand( "fail" );
|
||||
failB.addActionListener( this );
|
||||
buttonP.add( "West", failB );
|
||||
|
||||
add( "South", buttonP );
|
||||
pack();
|
||||
|
||||
show();
|
||||
}// TestDialog()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void printInstructions( String[] instructions )
|
||||
{
|
||||
//Clear out any current instructions
|
||||
instructionsText.setText( "" );
|
||||
|
||||
//Go down array of instruction strings
|
||||
|
||||
String printStr, remainingStr;
|
||||
for( int i=0; i < instructions.length; i++ )
|
||||
{
|
||||
//chop up each into pieces maxSringLength long
|
||||
remainingStr = instructions[ i ];
|
||||
while( remainingStr.length() > 0 )
|
||||
{
|
||||
//if longer than max then chop off first max chars to print
|
||||
if( remainingStr.length() >= maxStringLength )
|
||||
{
|
||||
//Try to chop on a word boundary
|
||||
int posOfSpace = remainingStr.
|
||||
lastIndexOf( ' ', maxStringLength - 1 );
|
||||
|
||||
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
|
||||
|
||||
printStr = remainingStr.substring( 0, posOfSpace + 1 );
|
||||
remainingStr = remainingStr.substring( posOfSpace + 1 );
|
||||
}
|
||||
//else just print
|
||||
else
|
||||
{
|
||||
printStr = remainingStr;
|
||||
remainingStr = "";
|
||||
}
|
||||
|
||||
instructionsText.append( printStr + "\n" );
|
||||
|
||||
}// while
|
||||
|
||||
}// for
|
||||
|
||||
}//printInstructions()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void displayMessage( String messageIn )
|
||||
{
|
||||
messageText.append( messageIn + "\n" );
|
||||
}
|
||||
|
||||
//catch presses of the passed and failed buttons.
|
||||
//simply call the standard pass() or fail() static methods of
|
||||
//DialogOrient
|
||||
public void actionPerformed( ActionEvent e )
|
||||
{
|
||||
if( e.getActionCommand() == "pass" )
|
||||
{
|
||||
Test6411624.pass();
|
||||
}
|
||||
else
|
||||
{
|
||||
Test6411624.fail();
|
||||
}
|
||||
}
|
||||
|
||||
}// TestDialog class
|
||||
244
jdk/test/javax/sound/midi/MidiSystem/6411624/bug6411624.java
Normal file
244
jdk/test/javax/sound/midi/MidiSystem/6411624/bug6411624.java
Normal file
@ -0,0 +1,244 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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.io.IOException;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* This test should be run on specific environment (solaris or linux w/o
|
||||
* audio card installed).
|
||||
*/
|
||||
public class bug6411624 {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
log("This test should only be run on solaris or linux system");
|
||||
log("without audio card installed (to test on SunRay set");
|
||||
log("incorrect $AUDIODEV value).");
|
||||
readln();
|
||||
|
||||
boolean testRecv = false;
|
||||
boolean testTrans = false;
|
||||
boolean testSeq = true;
|
||||
|
||||
// print add info (midi device list)
|
||||
try {
|
||||
MidiDevice.Info[] midis = MidiSystem.getMidiDeviceInfo();
|
||||
log("MidiDevices (total " + midis.length + "):");
|
||||
for (int i=0; i<midis.length; i++) {
|
||||
log("" + i + ": " + midis[i].toString());
|
||||
// MidiDevice dev = MidiSystem.getMidiDevice(midis[i]);
|
||||
// log(" device: " + dev);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
log("!!!EXCEPTION:");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
log("");
|
||||
log("getting default receiver...");
|
||||
try {
|
||||
Receiver rec = MidiSystem.getReceiver();
|
||||
log(" - OK: " + rec);
|
||||
testRecv = checkDevice(rec);
|
||||
rec.close();
|
||||
} catch (MidiUnavailableException e) {
|
||||
log("MidiUnavailableException has been thrown - OK");
|
||||
testRecv = true;
|
||||
}
|
||||
|
||||
|
||||
log("");
|
||||
log("getting default transmitter...");
|
||||
try {
|
||||
Transmitter trans = MidiSystem.getTransmitter();
|
||||
log(" - OK: " + trans);
|
||||
testTrans = checkDevice(trans);
|
||||
trans.close();
|
||||
} catch (MidiUnavailableException e) {
|
||||
log("MidiUnavailableException has been thrown - OK");
|
||||
testTrans = true;
|
||||
}
|
||||
|
||||
|
||||
// print default synthesizer
|
||||
log("");
|
||||
log("getting default synth...");
|
||||
try {
|
||||
Synthesizer synth = MidiSystem.getSynthesizer();
|
||||
log(" - OK: " + synth);
|
||||
synth.close();
|
||||
} catch (MidiUnavailableException e) {
|
||||
log("MidiUnavailableException has been thrown - OK:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
log("");
|
||||
log("getting default sequencer (connected)...");
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
log("OK: " + seq);
|
||||
|
||||
// check that returned sequencer doesn't connected to another sequencer
|
||||
log(" receivers:");
|
||||
log(" max=" + seq.getMaxReceivers());
|
||||
List<Receiver> recvList = seq.getReceivers();
|
||||
log(" count=" + recvList.size());
|
||||
Iterator<Receiver> recvIter = recvList.iterator();
|
||||
int i = 0;
|
||||
while (recvIter.hasNext()) {
|
||||
Receiver recv = recvIter.next();
|
||||
log(" " + (++i) + ": " + recv);
|
||||
}
|
||||
|
||||
log(" transmitters:");
|
||||
log(" max=" + seq.getMaxTransmitters());
|
||||
List<Transmitter> transList = seq.getTransmitters();
|
||||
log(" count=" + transList.size());
|
||||
Iterator<Transmitter> transIter = transList.iterator();
|
||||
i = 0;
|
||||
while (transIter.hasNext()) {
|
||||
Transmitter trans = transIter.next();
|
||||
log(" " + (++i) + ": " + trans);
|
||||
Receiver recv = trans.getReceiver();
|
||||
log(" recv: " + recv);
|
||||
if (!checkDevice(recv))
|
||||
testSeq = false;
|
||||
}
|
||||
|
||||
log("opening sequencer...");
|
||||
seq.open();
|
||||
log("OK.");
|
||||
|
||||
log("closing...");
|
||||
seq.close();
|
||||
log("OK.");
|
||||
} catch (MidiUnavailableException e) {
|
||||
log("MidiUnavailableException has been thrown - OK:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
// debug testing - non-connected sequencer
|
||||
log("");
|
||||
log("getting default sequencer (non-connected)...");
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer(false);
|
||||
log("OK: " + seq);
|
||||
|
||||
log(" receivers:");
|
||||
log(" max=" + seq.getMaxReceivers());
|
||||
List<Receiver> recvList = seq.getReceivers();
|
||||
log(" count=" + recvList.size());
|
||||
Iterator<Receiver> recvIter = recvList.iterator();
|
||||
int i = 0;
|
||||
while (recvIter.hasNext()) {
|
||||
Receiver recv = recvIter.next();
|
||||
log(" " + (++i) + ": " + recv);
|
||||
}
|
||||
|
||||
log(" transmitters:");
|
||||
log(" max=" + seq.getMaxTransmitters());
|
||||
List<Transmitter> transList = seq.getTransmitters();
|
||||
log(" count=" + transList.size());
|
||||
Iterator<Transmitter> transIter = transList.iterator();
|
||||
i = 0;
|
||||
while (transIter.hasNext()) {
|
||||
Transmitter trans = transIter.next();
|
||||
log(" " + (++i) + ": " + trans);
|
||||
Receiver recv = trans.getReceiver();
|
||||
log(" recv: " + recv);
|
||||
}
|
||||
seq.close();
|
||||
} catch (MidiUnavailableException e) {
|
||||
log("MidiUnavailableException has been thrown (shouln't?):");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
log("");
|
||||
log("Test result:");
|
||||
// print results
|
||||
if (testRecv && testTrans && testSeq) {
|
||||
log(" All tests sucessfully passed.");
|
||||
} else {
|
||||
log(" Some tests failed:");
|
||||
log(" receiver test: " + (testRecv ? "OK" : "FAILED"));
|
||||
log(" transmitter test: " + (testTrans ? "OK" : "FAILED"));
|
||||
log(" sequencer test: " + (testSeq ? "OK" : "FAILED"));
|
||||
}
|
||||
log("\n\n\n");
|
||||
}
|
||||
|
||||
// check that device is not sequencer
|
||||
static boolean checkDevice(Object dev) {
|
||||
String className = dev.getClass().toString().toLowerCase();
|
||||
boolean result = (className.indexOf("sequencer") < 0);
|
||||
if (!result)
|
||||
log("ERROR: inapropriate device");
|
||||
return result;
|
||||
}
|
||||
|
||||
// helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
//return System.nanoTime() / 1000000L;
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " (" + Thread.currentThread().getName() + ") " + s);
|
||||
}
|
||||
static void delay(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
static void readln() {
|
||||
log("");
|
||||
log("Press ENTER to continue...");
|
||||
try {
|
||||
while (System.in.read() != 10) ;
|
||||
} catch (IOException e) { }
|
||||
log("");
|
||||
}
|
||||
}
|
||||
226
jdk/test/javax/sound/midi/MidiSystem/DefaultDevices.java
Normal file
226
jdk/test/javax/sound/midi/MidiSystem/DefaultDevices.java
Normal file
@ -0,0 +1,226 @@
|
||||
/*
|
||||
* 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.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
import javax.sound.midi.Transmitter;
|
||||
import javax.sound.midi.spi.MidiDeviceProvider;
|
||||
|
||||
import com.sun.media.sound.JDK13Services;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4776511
|
||||
* @bug 4934509
|
||||
* @bug 4938236
|
||||
* @modules java.desktop/com.sun.media.sound
|
||||
* @run main/timeout=600 DefaultDevices
|
||||
* @summary RFE: Setting the default MixerProvider
|
||||
*/
|
||||
/** Test the retrieving of MidiDevices with default device properties.
|
||||
* This is a part of the test for 4776511.
|
||||
* The test also functions as a unit test for 4934509: SPEC: Document
|
||||
* explicitely MidiSystem.getReceiver's behavior
|
||||
* and a regession test for 4938236: Crash when opening synthesizer implicitly
|
||||
* The test has been updated to reflect a fix for 6411624: MidiSystem.getSequencer()
|
||||
* doesn't throw MidiUnavaivableException if no audio card installed (see also
|
||||
* 6422786: regression test javax/sound/midi/MidiSystem/DefaultDevices.java fails)
|
||||
*/
|
||||
public class DefaultDevices {
|
||||
|
||||
private static final String ERROR_PROVIDER_CLASS_NAME = "abc";
|
||||
private static final String ERROR_INSTANCE_NAME = "def";
|
||||
|
||||
private static final Class RECEIVER_CLASS = javax.sound.midi.Receiver.class;
|
||||
private static final Class TRANSMITTER_CLASS = javax.sound.midi.Transmitter.class;
|
||||
private static final Class SEQUENCER_CLASS = javax.sound.midi.Sequencer.class;
|
||||
private static final Class SYNTHESIZER_CLASS = javax.sound.midi.Synthesizer.class;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean allOk = true;
|
||||
MidiDevice.Info[] infos;
|
||||
|
||||
out("\nTesting MidiDevices retrieved via MidiSystem");
|
||||
infos = MidiSystem.getMidiDeviceInfo();
|
||||
allOk &= testDevices(infos, null);
|
||||
|
||||
out("\nTesting MidiDevices retrieved from MidiDeviceProviders");
|
||||
List providers = JDK13Services.getProviders(MidiDeviceProvider.class);
|
||||
for (int i = 0; i < providers.size(); i++) {
|
||||
MidiDeviceProvider provider = (MidiDeviceProvider)providers.get(i);
|
||||
infos = provider.getDeviceInfo();
|
||||
allOk &= testDevices(infos, provider.getClass().getName());
|
||||
}
|
||||
|
||||
if (!allOk) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
out("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean testDevices(MidiDevice.Info[] infos,
|
||||
String providerClassName) {
|
||||
boolean allOk = true;
|
||||
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
MidiDevice device = null;
|
||||
try {
|
||||
device = MidiSystem.getMidiDevice(infos[i]);
|
||||
} catch (MidiUnavailableException e) {
|
||||
out("Exception thrown; Test NOT failed.");
|
||||
e.printStackTrace(System.out);
|
||||
out("");
|
||||
}
|
||||
out("\nTesting device: " + device);
|
||||
if (device instanceof Sequencer) {
|
||||
allOk &= testDevice(device, SEQUENCER_CLASS, providerClassName, true, true);
|
||||
// incorrect cases
|
||||
allOk &= testDevice(device, SYNTHESIZER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, RECEIVER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, TRANSMITTER_CLASS, providerClassName, false, false);
|
||||
}
|
||||
if (device instanceof Synthesizer) {
|
||||
allOk &= testDevice(device, SYNTHESIZER_CLASS, providerClassName, true, true);
|
||||
allOk &= testDevice(device, RECEIVER_CLASS, providerClassName, false, true);
|
||||
// incorrect cases
|
||||
allOk &= testDevice(device, TRANSMITTER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, SEQUENCER_CLASS, providerClassName, false, false);
|
||||
}
|
||||
if (device instanceof Receiver) {
|
||||
allOk &= testDevice(device, RECEIVER_CLASS, providerClassName, true, true);
|
||||
// incorrect cases
|
||||
allOk &= testDevice(device, TRANSMITTER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, SYNTHESIZER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, SEQUENCER_CLASS, providerClassName, false, false);
|
||||
}
|
||||
if (device instanceof Transmitter) {
|
||||
allOk &= testDevice(device, TRANSMITTER_CLASS, providerClassName, true, true);
|
||||
// incorrect cases
|
||||
allOk &= testDevice(device, RECEIVER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, SYNTHESIZER_CLASS, providerClassName, false, false);
|
||||
allOk &= testDevice(device, SEQUENCER_CLASS, providerClassName, false, false);
|
||||
}
|
||||
}
|
||||
return allOk;
|
||||
}
|
||||
|
||||
private static boolean testDevice(MidiDevice device, Class type,
|
||||
String providerClassName, boolean testWrong, boolean expectedResult) {
|
||||
boolean allOk = true;
|
||||
String instanceName = device.getDeviceInfo().getName();
|
||||
|
||||
// no error
|
||||
allOk &= testDevice(device, type, providerClassName,
|
||||
instanceName, expectedResult);
|
||||
|
||||
if (testWrong) {
|
||||
// erroneous provider class name, correct instance name
|
||||
allOk &= testDevice(device, type, ERROR_PROVIDER_CLASS_NAME,
|
||||
instanceName, expectedResult);
|
||||
|
||||
// correct provider class name, erroneous instance name
|
||||
// we presume that provider provides only one class of requested type
|
||||
allOk &= testDevice(device, type, providerClassName,
|
||||
ERROR_INSTANCE_NAME, expectedResult);
|
||||
}
|
||||
|
||||
return allOk;
|
||||
}
|
||||
|
||||
private static boolean testDevice(MidiDevice device, Class type,
|
||||
String providerClassName, String instanceName,
|
||||
boolean expectedResult) {
|
||||
boolean allOk = true;
|
||||
|
||||
try {
|
||||
String propertyName = type.getName();
|
||||
String propertyValue = (providerClassName != null) ? providerClassName: "" ;
|
||||
propertyValue += "#" + instanceName;
|
||||
out("property: " + propertyName + "="+ propertyValue);
|
||||
System.setProperty(propertyName, propertyValue);
|
||||
Object reference = null;
|
||||
Object result = null;
|
||||
if (type == SEQUENCER_CLASS) {
|
||||
reference = device;
|
||||
result = MidiSystem.getSequencer();
|
||||
} else if (type == SYNTHESIZER_CLASS) {
|
||||
reference = device;
|
||||
result = MidiSystem.getSynthesizer();
|
||||
} else if (type == RECEIVER_CLASS) {
|
||||
reference = device.getReceiver();
|
||||
result = MidiSystem.getReceiver();
|
||||
} else if (type == TRANSMITTER_CLASS) {
|
||||
reference = device.getTransmitter();
|
||||
result = MidiSystem.getTransmitter();
|
||||
}
|
||||
out("result: " + result);
|
||||
boolean rightDevice = (reference.getClass() == result.getClass());
|
||||
if (rightDevice != expectedResult) {
|
||||
out("\nERROR: type " + type + " failed:"
|
||||
+ " class should" + (expectedResult ? "" : " NOT") + " be '"
|
||||
+ reference.getClass()
|
||||
+ "' but is '" + result.getClass() + "'!\n");
|
||||
allOk = false;
|
||||
}
|
||||
if (expectedResult
|
||||
&& reference instanceof MidiDevice
|
||||
&& result instanceof MidiDevice) {
|
||||
MidiDevice referenceDevice = (MidiDevice)reference;
|
||||
MidiDevice resultDevice = (MidiDevice)result;
|
||||
if (!referenceDevice.getDeviceInfo().getName().equals(
|
||||
resultDevice.getDeviceInfo().getName())) {
|
||||
out("\nERROR: type " + type + " failed: name should be '"
|
||||
+ referenceDevice.getDeviceInfo().getName()
|
||||
+ "' but is '"
|
||||
+ resultDevice.getDeviceInfo().getName() + "'!\n");
|
||||
allOk = false;
|
||||
}
|
||||
}
|
||||
if (result instanceof Receiver) {
|
||||
((Receiver)result).close();
|
||||
} else if (result instanceof Transmitter) {
|
||||
((Transmitter)result).close();
|
||||
} else if (result instanceof Synthesizer) {
|
||||
((Synthesizer)result).close();
|
||||
} else if (result instanceof Sequencer) {
|
||||
((Sequencer)result).close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
out("Exception thrown; Test NOT failed.");
|
||||
e.printStackTrace(System.out);
|
||||
out("");
|
||||
}
|
||||
return allOk;
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
164
jdk/test/javax/sound/midi/MidiSystem/DefaultProperties.java
Normal file
164
jdk/test/javax/sound/midi/MidiSystem/DefaultProperties.java
Normal file
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* 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.io.File;
|
||||
|
||||
import com.sun.media.sound.JDK13Services;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4776511
|
||||
* @summary RFE: Setting the default MixerProvider. Test the retrieving and
|
||||
* parsing of properties. This is a part of the test for 4776511.
|
||||
* @run main/othervm DefaultProperties
|
||||
* @modules java.desktop/com.sun.media.sound
|
||||
*/
|
||||
public class DefaultProperties {
|
||||
|
||||
private static final Class[] lineTypeClasses = {
|
||||
javax.sound.midi.Receiver.class,
|
||||
javax.sound.midi.Transmitter.class,
|
||||
javax.sound.midi.Sequencer.class,
|
||||
javax.sound.midi.Synthesizer.class,
|
||||
};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean allOk = true;
|
||||
File file = new File(System.getProperty("test.src", "."), "testdata");
|
||||
System.setProperty("java.home", file.getCanonicalPath());
|
||||
|
||||
for (int i = 0; i < lineTypeClasses.length; i++) {
|
||||
Class cls = lineTypeClasses[i];
|
||||
String propertyName = cls.getName();
|
||||
String result;
|
||||
String provClassName;
|
||||
String instanceName;
|
||||
|
||||
// properties file, both provider class name and instance name
|
||||
provClassName = "xyz";
|
||||
instanceName = "123";
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + " failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, provider class name only, no trailing hash
|
||||
provClassName = "abc";
|
||||
System.setProperty(propertyName, provClassName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, provider class name only, trailing hash
|
||||
provClassName = "def";
|
||||
System.setProperty(propertyName, provClassName + "#");
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, instance name only
|
||||
instanceName = "ghi";
|
||||
System.setProperty(propertyName, "#" + instanceName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: provider class should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + " failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, both provider class and instance name
|
||||
provClassName = "jkl";
|
||||
instanceName = "mno";
|
||||
System.setProperty(propertyName, provClassName + "#" + instanceName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + "failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + "failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, empty
|
||||
System.setProperty(propertyName, "");
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: provider class should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + "failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
}
|
||||
if (! allOk) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
out("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
|
||||
128
jdk/test/javax/sound/midi/MidiSystem/GetSequencer.java
Normal file
128
jdk/test/javax/sound/midi/MidiSystem/GetSequencer.java
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* 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.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4931400
|
||||
* @summary Clarify default connections in default sequencer
|
||||
*/
|
||||
public class GetSequencer {
|
||||
|
||||
static boolean failed = false;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
doTest(1);
|
||||
doTest(2);
|
||||
doTest(3);
|
||||
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
out("test OK");
|
||||
}
|
||||
|
||||
public static void doTest(int mode) {
|
||||
Sequencer seq = null;
|
||||
boolean connected = false;
|
||||
|
||||
try {
|
||||
switch (mode) {
|
||||
case 1:
|
||||
seq = MidiSystem.getSequencer();
|
||||
connected = true;
|
||||
break;
|
||||
case 2:
|
||||
seq = MidiSystem.getSequencer(false);
|
||||
connected = false;
|
||||
break;
|
||||
case 3:
|
||||
seq = MidiSystem.getSequencer(true);
|
||||
connected = true;
|
||||
break;
|
||||
}
|
||||
out("Testing Sequencer "+seq);
|
||||
if (connected) {
|
||||
out(" opened in connected mode.");
|
||||
} else {
|
||||
out(" opened in non-connected mode.");
|
||||
}
|
||||
System.out.println(" opening...");
|
||||
seq.open();
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.err.println("MidiUnavailableException was thrown: " + mue);
|
||||
System.err.println(" could not test this sequencer.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
List<Transmitter> transmitters = seq.getTransmitters();
|
||||
int size = transmitters.size();
|
||||
out(" transmitters.size()="+size);
|
||||
if (size != 1 && connected) {
|
||||
out(" should have 1 connection! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
if (size != 0 && !connected) {
|
||||
out(" should have 0 connections! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
out(" closing...");
|
||||
seq.close();
|
||||
transmitters = seq.getTransmitters();
|
||||
size = transmitters.size();
|
||||
out(" transmitters.size()="+size);
|
||||
if (size != 0) {
|
||||
out(" should have 0 connections! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
|
||||
out(" opening again...");
|
||||
seq.open();
|
||||
transmitters = seq.getTransmitters();
|
||||
size = transmitters.size();
|
||||
out(" transmitters.size()="+size);
|
||||
if (size != 1 && connected) {
|
||||
out(" should have 1 connection! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
if (size != 0 && !connected) {
|
||||
out(" should have 0 connections! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println(" unexpectedException was thrown: " + e);
|
||||
System.err.println(" causes this test to FAIL.");
|
||||
failed = true;
|
||||
}
|
||||
seq.close();
|
||||
}
|
||||
|
||||
static void out(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4883060
|
||||
* @summary AudioSystem.getAudioFileTypes returns duplicates
|
||||
*/
|
||||
public class MidiFileTypeUniqueness {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean foundDuplicates = false;
|
||||
int[] aTypes = MidiSystem.getMidiFileTypes();
|
||||
for (int i = 0; i < aTypes.length; i++)
|
||||
{
|
||||
for (int j = 0; j < aTypes.length; j++)
|
||||
{
|
||||
if (aTypes[i] == aTypes[j] && i != j) {
|
||||
foundDuplicates = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (foundDuplicates) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
}
|
||||
}
|
||||
65
jdk/test/javax/sound/midi/MidiSystem/ProviderCacheing.java
Normal file
65
jdk/test/javax/sound/midi/MidiSystem/ProviderCacheing.java
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 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 com.sun.media.sound.JDK13Services;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4776511
|
||||
* @summary RFE: Setting the default MixerProvider. Test the cacheing of
|
||||
* providers. This is a part of the test for 4776511.
|
||||
* @modules java.desktop/com.sun.media.sound
|
||||
*/
|
||||
public class ProviderCacheing {
|
||||
|
||||
private static final Class[] providerClasses = {
|
||||
javax.sound.midi.spi.MidiDeviceProvider.class,
|
||||
javax.sound.midi.spi.MidiFileReader.class,
|
||||
javax.sound.midi.spi.MidiFileWriter.class,
|
||||
javax.sound.midi.spi.SoundbankReader.class,
|
||||
};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean allCached = true;
|
||||
for (int i = 0; i < providerClasses.length; i++) {
|
||||
List list0 = JDK13Services.getProviders(providerClasses[i]);
|
||||
List list1 = JDK13Services.getProviders(providerClasses[i]);
|
||||
if (list0 == list1) {
|
||||
out("Providers should not be cached for " + providerClasses[i]);
|
||||
allCached = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! allCached) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
out("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
27
jdk/test/javax/sound/midi/MidiSystem/testdata/conf/sound.properties
vendored
Normal file
27
jdk/test/javax/sound/midi/MidiSystem/testdata/conf/sound.properties
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
javax.sound.midi.Receiver=xyz#123
|
||||
javax.sound.midi.Transmitter=xyz#123
|
||||
javax.sound.midi.Sequencer=xyz#123
|
||||
javax.sound.midi.Synthesizer=xyz#123
|
||||
151
jdk/test/javax/sound/midi/Sequence/GetMicrosecondLength.java
Normal file
151
jdk/test/javax/sound/midi/Sequence/GetMicrosecondLength.java
Normal file
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4929955
|
||||
* @summary Sequence.getMicrosecondLength() returns wrong value
|
||||
*/
|
||||
public class GetMicrosecondLength {
|
||||
|
||||
public static boolean failed = false;
|
||||
//private static Sequencer seq = null;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
/*
|
||||
try {
|
||||
seq = MidiSystem.getSequencer();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
*/
|
||||
for (int sec = 1; sec < 10; sec += 4) {
|
||||
for (int tempo=0; tempo < 1000; tempo+=120) {
|
||||
for (int resolution=1; resolution < 480; ) {
|
||||
testSequence(sec, tempo, resolution);
|
||||
if (resolution == 1) {
|
||||
resolution = 120;
|
||||
} else {
|
||||
resolution += 120;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
out("Test Passed.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Sequence for testing.
|
||||
*/
|
||||
private static void testSequence(int lengthInSeconds, int tempoInBPM, int resolution) {
|
||||
Sequence sequence = null;
|
||||
long lengthInMicroseconds = lengthInSeconds * 1000000;
|
||||
boolean createTempoEvent = true;
|
||||
if (tempoInBPM == 0) {
|
||||
tempoInBPM = 120;
|
||||
createTempoEvent = false;
|
||||
System.out.print("Creating sequence: "+lengthInSeconds+"sec, "
|
||||
+"resolution="+resolution+" ticks/beat...");
|
||||
} else {
|
||||
System.out.print("Creating sequence: "+lengthInSeconds+"sec, "
|
||||
+tempoInBPM+" beats/min, "
|
||||
+"resolution="+resolution+" ticks/beat...");
|
||||
}
|
||||
//long lengthInTicks = (lengthInMicroseconds * resolution) / tempoInBPM;
|
||||
long lengthInTicks = (lengthInMicroseconds * tempoInBPM * resolution) / 60000000l;
|
||||
//out("expected length in ticks: " + lengthInTicks);
|
||||
try {
|
||||
sequence = new Sequence(Sequence.PPQ, resolution);
|
||||
Track track = sequence.createTrack();
|
||||
if (createTempoEvent) {
|
||||
int tempoInMPQ = (int) (60000000l / tempoInBPM);
|
||||
MetaMessage tm = new MetaMessage();
|
||||
byte[] msg = new byte[3];
|
||||
msg[0] = (byte) (tempoInMPQ >> 16);
|
||||
msg[1] = (byte) ((tempoInMPQ >> 8) & 0xFF);
|
||||
msg[2] = (byte) (tempoInMPQ & 0xFF);
|
||||
|
||||
tm.setMessage(0x51 /* Meta Tempo */, msg, msg.length);
|
||||
track.add(new MidiEvent(tm, 0));
|
||||
//out("regtest: tempoInMPQ="+tempoInMPQ);
|
||||
//out("Added tempo event: new size="+track.size());
|
||||
}
|
||||
ShortMessage mm = new ShortMessage();
|
||||
mm.setMessage(0xF6, 0, 0);
|
||||
MidiEvent me = new MidiEvent(mm, lengthInTicks);
|
||||
track.add(me);
|
||||
//out("Added realtime event: new size="+track.size());
|
||||
} catch (InvalidMidiDataException e) {
|
||||
out(e);
|
||||
}
|
||||
boolean thisFailed = false;
|
||||
long actualLengthInTicks = sequence.getTickLength();
|
||||
// allow +/- 5%
|
||||
if (Math.abs(actualLengthInTicks - lengthInTicks) > lengthInTicks / 20) {
|
||||
out("FAILED:");
|
||||
out(" expected length in ticks: " + lengthInTicks);
|
||||
out(" actual length in ticks : " + actualLengthInTicks);
|
||||
thisFailed = true;
|
||||
}
|
||||
long actualLengthInUs = sequence.getMicrosecondLength();
|
||||
// allow +/- 5%
|
||||
if (Math.abs(actualLengthInUs - lengthInMicroseconds) > lengthInMicroseconds / 20) {
|
||||
if (!thisFailed) {
|
||||
out("FAILED:");
|
||||
}
|
||||
out(" expected length in microsecs: " + lengthInMicroseconds);
|
||||
out(" actual length in microsecs : " + actualLengthInUs);
|
||||
thisFailed = true;
|
||||
}
|
||||
if (!thisFailed) {
|
||||
out("OK");
|
||||
}
|
||||
/*if (seq != null) {
|
||||
try {
|
||||
seq.setSequence(sequence);
|
||||
out("Sequencer tempo="+seq.getTempoInBPM());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
*/
|
||||
failed |= thisFailed;
|
||||
}
|
||||
|
||||
|
||||
private static void out(Throwable t) {
|
||||
t.printStackTrace(System.out);
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
85
jdk/test/javax/sound/midi/Sequence/MidiSMPTE.java
Normal file
85
jdk/test/javax/sound/midi/Sequence/MidiSMPTE.java
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4291250
|
||||
* @summary Midi files with SMPTE time do not play properly
|
||||
*/
|
||||
public class MidiSMPTE {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Sequence s = null;
|
||||
//File midiFile = new File("outsmpte.mid");
|
||||
//InputStream is = new FileInputStream(midiFile);
|
||||
//is = new BufferedInputStream(is);
|
||||
InputStream is = new ByteArrayInputStream(smptemidifile);
|
||||
s = MidiSystem.getSequence(is);
|
||||
long duration = s.getMicrosecondLength() / 1000000;
|
||||
System.out.println("Duration: "+duration+" seconds ");
|
||||
if (duration > 14) {
|
||||
throw new Exception("SMPTE time reader is broken! Test FAILED");
|
||||
}
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
|
||||
public static void printFile(String filename) throws Exception {
|
||||
File file = new File(filename);
|
||||
FileInputStream fis = new FileInputStream(file);
|
||||
byte[] data = new byte[(int) file.length()];
|
||||
fis.read(data);
|
||||
String s = "";
|
||||
for (int i=0; i<data.length; i++) {
|
||||
s+=String.valueOf(data[i])+", ";
|
||||
if (s.length()>72) {
|
||||
System.out.println(s);
|
||||
s="";
|
||||
}
|
||||
}
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
// A MIDI file with SMPTE timing
|
||||
static byte[] smptemidifile = {
|
||||
77, 84, 104, 100, 0, 0, 0, 6, 0, 1, 0, 3, -30, 120, 77, 84, 114, 107, 0,
|
||||
0, 0, 123, 0, -112, 30, 100, -113, 49, -128, 50, 100, -114, 69, -112, 31,
|
||||
100, -114, 33, -128, 51, 100, -114, 55, -112, 32, 100, -114, 120, -128, 52,
|
||||
100, -114, 40, -112, 33, 100, -114, 26, -128, 53, 100, -114, 26, -112, 34,
|
||||
100, -114, 76, -128, 54, 100, -114, 12, -112, 35, 100, -114, 91, -128, 55,
|
||||
100, -114, 69, -112, 36, 100, -114, 33, -128, 56, 100, -114, 55, -112, 37,
|
||||
100, -114, 84, -128, 57, 100, -114, 40, -112, 38, 100, -114, 26, -128, 58,
|
||||
100, -114, 26, -112, 39, 100, -113, 24, -128, 59, 100, -113, 60, -112, 40,
|
||||
100, -113, 110, -128, 60, 100, -113, 96, -112, 41, 100, -113, 39, -128, 61,
|
||||
100, 0, -1, 47, 0, 77, 84, 114, 107, 0, 0, 0, 4, 0, -1, 47, 0, 77, 84, 114,
|
||||
107, 0, 0, 0, 4, 0, -1, 47, 0
|
||||
};
|
||||
|
||||
}
|
||||
94
jdk/test/javax/sound/midi/Sequence/SMPTEDuration.java
Normal file
94
jdk/test/javax/sound/midi/Sequence/SMPTEDuration.java
Normal file
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4702328
|
||||
* @summary Wrong time in sequence for SMPTE based types
|
||||
*/
|
||||
public class SMPTEDuration {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
int[][] dataMes = { {ShortMessage.NOTE_ON, 10, 0x24, 0x50} ,
|
||||
{ ShortMessage.NOTE_OFF, 10, 0x24, 0x44 },
|
||||
{ ShortMessage.NOTE_ON, 10, 0x24, 0x50 },
|
||||
{ ShortMessage.NOTE_ON, 10, 0x26, 0x50 },
|
||||
{ ShortMessage.NOTE_OFF, 10, 0x26, 0x53 } };
|
||||
long[] ticks = { 0, 68, 240, 240, 286};
|
||||
int res = 240;
|
||||
ShortMessage msg;
|
||||
Sequence midiData = null;
|
||||
Track track;
|
||||
boolean failed = false;
|
||||
|
||||
|
||||
try {
|
||||
midiData = new Sequence(Sequence.SMPTE_24 , res);
|
||||
} catch (InvalidMidiDataException invMidiEx) {
|
||||
invMidiEx.printStackTrace(System.out);
|
||||
System.out.println("Unexpected InvalidMidiDataException: "
|
||||
+ invMidiEx.getMessage());
|
||||
failed = true;
|
||||
}
|
||||
track = midiData.createTrack();
|
||||
for (int i = 0; i < dataMes.length; i++) {
|
||||
msg = new ShortMessage();
|
||||
try {
|
||||
msg.setMessage(dataMes[i][0], dataMes[i][1], dataMes[i][2],
|
||||
dataMes[i][3]);
|
||||
} catch (InvalidMidiDataException invMidiEx) {
|
||||
invMidiEx.printStackTrace(System.out);
|
||||
System.out.println("Unexpected InvalidMidiDataException: "
|
||||
+ invMidiEx.getMessage());
|
||||
failed = true;
|
||||
}
|
||||
track.add(new MidiEvent(msg, ticks[i]));
|
||||
}
|
||||
// lengthInMs = (tickLength*1000000)/(divType*Res)
|
||||
long micros = (long) ((midiData.getTickLength() * 1000000) / (res * Sequence.SMPTE_24));
|
||||
if (midiData.getMicrosecondLength() != micros) {
|
||||
failed = true;
|
||||
System.out.println("getMicrosecondLength() returns wrong length: "
|
||||
+ midiData.getMicrosecondLength());
|
||||
System.out.println("getMicrosecondLength() must return length: "
|
||||
+ micros);
|
||||
}
|
||||
if (midiData.getTickLength() != 286) {
|
||||
failed = true;
|
||||
System.out.println("getTickLength() returns wrong length: "
|
||||
+ midiData.getTickLength());
|
||||
}
|
||||
|
||||
if( failed == true ) {
|
||||
throw new Exception("test failed");
|
||||
} else {
|
||||
System.out.println("Passed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
113
jdk/test/javax/sound/midi/Sequencer/LoopIAE.java
Normal file
113
jdk/test/javax/sound/midi/Sequencer/LoopIAE.java
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5025549
|
||||
* @summary Verify that setLoopEndPoint throws IAE
|
||||
*/
|
||||
public class LoopIAE {
|
||||
|
||||
static ShortMessage MidiMsg3(int a, int b, int c) {
|
||||
try {
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage((byte)a,(byte)b,(byte)c);
|
||||
return msg;
|
||||
} catch(InvalidMidiDataException ex) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
static boolean failed = false;
|
||||
|
||||
public static void main(String[] argv) throws Exception {
|
||||
if (!hasSequencer()) {
|
||||
return;
|
||||
}
|
||||
Sequencer sequencer = MidiSystem.getSequencer();
|
||||
Sequence sequence = new Sequence(Sequence.PPQ, 240);
|
||||
Track track = sequence.createTrack();
|
||||
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+0,45,100),0));
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+0,45,0),0 + 240));
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+9,45,100),10*20));
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+9,45,0),10*20 + 10));
|
||||
|
||||
try {
|
||||
sequencer.open();
|
||||
sequencer.setSequence(sequence);
|
||||
sequencer.setTempoInBPM(100);
|
||||
|
||||
System.out.println("Setting loop end point to 1");
|
||||
sequencer.setLoopEndPoint(1);
|
||||
System.out.println(" -> effectively: "+sequencer.getLoopEndPoint());
|
||||
System.out.println("Setting loop start point to 2 -- should throw IAE");
|
||||
sequencer.setLoopStartPoint(2);
|
||||
System.out.println(" -> effectively: "+sequencer.getLoopStartPoint());
|
||||
System.out.println("No IllegalArgumentException was thrown!");
|
||||
failed = true;
|
||||
} catch (IllegalArgumentException iae) {
|
||||
System.out.println("IAE was thrown correctly.");
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.out.println("MidiUnavailableException was thrown: " + mue);
|
||||
System.out.println("Cannot execute test.");
|
||||
} catch (InvalidMidiDataException imEx) {
|
||||
System.out.println("InvalidMidiDataException was thrown.");
|
||||
imEx.printStackTrace();
|
||||
System.out.println("Cannot execute test.");
|
||||
} finally {
|
||||
if (sequencer != null && sequencer.isOpen()) {
|
||||
sequencer.close();
|
||||
}
|
||||
}
|
||||
if (failed) {
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
System.out.println("test passed.");
|
||||
}
|
||||
|
||||
static boolean hasSequencer() {
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
if (seq != null) {
|
||||
if (seq.isOpen()) {
|
||||
seq.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println("No sequencer available! Cannot execute test.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
315
jdk/test/javax/sound/midi/Sequencer/Looping.java
Normal file
315
jdk/test/javax/sound/midi/Sequencer/Looping.java
Normal file
@ -0,0 +1,315 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaEventListener;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4204105
|
||||
* @summary RFE: add loop() method(s) to Sequencer
|
||||
* @key intermittent
|
||||
*/
|
||||
public class Looping {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("4204105: RFE: add loop() method(s) to Sequencer");
|
||||
boolean passed = testAll();
|
||||
if (passed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the test on all available Sequencers.
|
||||
*
|
||||
* @return true if the test passed for all Sequencers, false otherwise
|
||||
*/
|
||||
private static boolean testAll() throws Exception {
|
||||
boolean result = true;
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
if (device instanceof Sequencer) {
|
||||
result &= testSequencer((Sequencer) device);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the test on the passed Sequencer.
|
||||
*
|
||||
* @return true if the test is passed this Sequencer, false otherwise
|
||||
*/
|
||||
private static boolean testSequencer(Sequencer seq) throws Exception{
|
||||
boolean result = true;
|
||||
out("testing: " + seq);
|
||||
|
||||
result &= testGetSet(seq);
|
||||
|
||||
seq.setSequence(createSequence());
|
||||
|
||||
result &= testGetSet(seq);
|
||||
|
||||
result &= testPlay(seq);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static boolean testGetSet(Sequencer seq) {
|
||||
boolean result = true;
|
||||
Sequence sequence = seq.getSequence();
|
||||
boolean isSequenceLoaded = (sequence != null);
|
||||
|
||||
out("TestGetSet");
|
||||
|
||||
try {
|
||||
if (seq.getLoopStartPoint() != 0) {
|
||||
out("start point", isSequenceLoaded,
|
||||
"isn't 0!");
|
||||
result = false;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
if (!isSequenceLoaded) {
|
||||
out("Caught permissable IllegalArgumentException:");
|
||||
} else {
|
||||
out("Threw unacceptable IllegalArgumentException! FAILED");
|
||||
result = false;
|
||||
}
|
||||
out(iae.toString());
|
||||
}
|
||||
|
||||
if (seq.getLoopEndPoint() != -1) {
|
||||
out("end point", isSequenceLoaded,
|
||||
"isn't -1!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.setLoopStartPoint(25);
|
||||
if (seq.getLoopStartPoint() != 25) {
|
||||
out("setLoopStartPoint()", isSequenceLoaded,
|
||||
"doesn't set the start point correctly!");
|
||||
result = false;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
if (!isSequenceLoaded) {
|
||||
out("Caught permissable IllegalArgumentException:");
|
||||
} else {
|
||||
out("Threw unacceptable IllegalArgumentException! FAILED");
|
||||
result = false;
|
||||
}
|
||||
out(iae.toString());
|
||||
}
|
||||
|
||||
try {
|
||||
seq.setLoopEndPoint(26);
|
||||
if (seq.getLoopEndPoint() != 26) {
|
||||
out("setLoopEndPoint()", isSequenceLoaded,
|
||||
"doesn't set the end point correctly!");
|
||||
result = false;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
if (!isSequenceLoaded) {
|
||||
out("Caught permissable IllegalArgumentException:");
|
||||
} else {
|
||||
out("Threw unacceptable IllegalArgumentException! FAILED");
|
||||
result = false;
|
||||
}
|
||||
out(iae.toString());
|
||||
}
|
||||
|
||||
try {
|
||||
seq.setLoopStartPoint(0);
|
||||
if (seq.getLoopStartPoint() != 0) {
|
||||
out("setLoopStartPoint()", isSequenceLoaded,
|
||||
"doesn't set the start point correctly!");
|
||||
result = false;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
if (!isSequenceLoaded) {
|
||||
out("Caught permissable IllegalArgumentException:");
|
||||
} else {
|
||||
out("Threw unacceptable IllegalArgumentException! FAILED");
|
||||
result = false;
|
||||
}
|
||||
out(iae.toString());
|
||||
}
|
||||
|
||||
if (isSequenceLoaded) {
|
||||
seq.setLoopEndPoint(sequence.getTickLength());
|
||||
if (seq.getLoopEndPoint() != sequence.getTickLength()) {
|
||||
out("setLoopEndPoint()", isSequenceLoaded,
|
||||
"doesn't set the end point correctly!");
|
||||
result = false;
|
||||
}
|
||||
} else {
|
||||
// fails
|
||||
seq.setLoopEndPoint(-1);
|
||||
if (seq.getLoopEndPoint() != -1) {
|
||||
out("setLoopEndPoint()", isSequenceLoaded,
|
||||
"doesn't set the end point correctly!");
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (seq.getLoopCount() != 0) {
|
||||
out("loop count", isSequenceLoaded,
|
||||
"isn't 0!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
seq.setLoopCount(1001);
|
||||
if (seq.getLoopCount() != 1001) {
|
||||
out("setLoopCount()", isSequenceLoaded,
|
||||
"doesn't set the loop count correctly!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
seq.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
|
||||
if (seq.getLoopCount() != Sequencer.LOOP_CONTINUOUSLY) {
|
||||
out("setLoopCount(Sequencer.LOOP_CONTINUOUSLY)", isSequenceLoaded,
|
||||
"doesn't set the loop count correctly!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.setLoopCount(-55);
|
||||
out("setLoopCount()", isSequenceLoaded,
|
||||
"doesn't throw IllegalArgumentException on illegal value!");
|
||||
result = false;
|
||||
} catch (IllegalArgumentException e) {
|
||||
// EXCEPTION IS EXPECTED
|
||||
out("Caught permissable IAE");
|
||||
}
|
||||
|
||||
seq.setLoopCount(0);
|
||||
if (seq.getLoopCount() != 0) {
|
||||
out("setLoopCount()", isSequenceLoaded,
|
||||
"doesn't set the loop count correctly!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static boolean testPlay(Sequencer seq) {
|
||||
boolean result = true;
|
||||
long stopTime;
|
||||
|
||||
out("TestPlay");
|
||||
|
||||
TestMetaEventListener listener = new TestMetaEventListener();
|
||||
seq.addMetaEventListener(listener);
|
||||
long startTime = System.currentTimeMillis();
|
||||
try {
|
||||
seq.open();
|
||||
out("Playing sequence, length="+(seq.getMicrosecondLength()/1000)+"millis");
|
||||
seq.start();
|
||||
while (true) {
|
||||
stopTime = listener.getStopTime();
|
||||
if (stopTime != 0) {
|
||||
break;
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
long measuredDuration = stopTime - startTime;
|
||||
out("play duration (us): " + measuredDuration);
|
||||
} catch (Exception e) {
|
||||
out("test not executed; exception:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
seq.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Sequence for testing.
|
||||
*
|
||||
* @return a dummy Sequence, or null, if a problem occured while creating
|
||||
* the Sequence
|
||||
*/
|
||||
private static Sequence createSequence() {
|
||||
Sequence sequence = null;
|
||||
int lengthInSeconds = 2;
|
||||
long lengthInMicroseconds = lengthInSeconds * 1000000;
|
||||
int resolution = 480;
|
||||
long lengthInTicks = (lengthInMicroseconds * 120 * resolution) / 60000000l;
|
||||
out("length in ticks: " + lengthInTicks);
|
||||
try {
|
||||
sequence = new Sequence(Sequence.PPQ, resolution, 1);
|
||||
Track track = sequence.createTrack();
|
||||
ShortMessage mm = new ShortMessage();
|
||||
mm.setMessage(0xF6, 0, 0);
|
||||
MidiEvent me = new MidiEvent(mm, lengthInTicks);
|
||||
track.add(me);
|
||||
} catch (InvalidMidiDataException e) {
|
||||
// DO NOTHING
|
||||
}
|
||||
out("sequence length (ticks): " + sequence.getTickLength());
|
||||
out("sequence length (us): " + sequence.getMicrosecondLength());
|
||||
return sequence;
|
||||
}
|
||||
|
||||
|
||||
private static void out(String m1, boolean isSequenceLoaded, String m2) {
|
||||
out(m1 + (isSequenceLoaded ? " with Sequence " : " without Sequence ") + m2);
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
|
||||
private static class TestMetaEventListener implements MetaEventListener {
|
||||
private long stopTime;
|
||||
|
||||
|
||||
public void meta(MetaMessage m) {
|
||||
System.out.print(" Got MetaMessage: ");
|
||||
if (m.getType() == 47) {
|
||||
stopTime = System.currentTimeMillis();
|
||||
System.out.println(" End Of Track -- OK");
|
||||
} else {
|
||||
System.out.println(" unknown. Ignored.");
|
||||
}
|
||||
}
|
||||
|
||||
public long getStopTime() {
|
||||
return stopTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
133
jdk/test/javax/sound/midi/Sequencer/MetaCallback.java
Normal file
133
jdk/test/javax/sound/midi/Sequencer/MetaCallback.java
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.Instrument;
|
||||
import javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaEventListener;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4347135
|
||||
* @summary MIDI MetaMessage callback inconsistent
|
||||
* @run main/othervm MetaCallback
|
||||
*/
|
||||
public class MetaCallback implements MetaEventListener {
|
||||
|
||||
static ShortMessage MidiMsg3(int a, int b, int c) {
|
||||
try {
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage((byte)a,(byte)b,(byte)c);
|
||||
return msg;
|
||||
} catch(InvalidMidiDataException ex) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
//Synthesizer synth;
|
||||
Instrument[] instruments;
|
||||
Sequencer sequencer;
|
||||
Sequence sequence;
|
||||
Track track;
|
||||
|
||||
public static int TOTAL_COUNT = 100;
|
||||
|
||||
int metaCount = 0;
|
||||
boolean finished = false;
|
||||
|
||||
MetaCallback() throws Exception {
|
||||
|
||||
sequencer=MidiSystem.getSequencer();
|
||||
sequence=new Sequence(Sequence.PPQ,240);
|
||||
track=sequence.createTrack();
|
||||
sequencer.addMetaEventListener(this);
|
||||
|
||||
byte[] data = new byte[1];
|
||||
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+0,45,100),0));
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+0,45,0),0 + 240));
|
||||
int c;
|
||||
for(c=0; c < TOTAL_COUNT; c++) {
|
||||
data[0]=(byte)(c+1);
|
||||
MetaMessage meta = new MetaMessage();
|
||||
meta.setMessage(1, data, 1); // type, data, length
|
||||
track.add(new MidiEvent(meta,c*20));
|
||||
}
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+9,45,100),c*20));
|
||||
track.add(new MidiEvent(MidiMsg3(ShortMessage.NOTE_ON+9,45,0),c*20 + 10));
|
||||
|
||||
sequencer.setSlaveSyncMode(Sequencer.SyncMode.INTERNAL_CLOCK);
|
||||
sequencer.setMasterSyncMode(Sequencer.SyncMode.INTERNAL_CLOCK);
|
||||
sequencer.open();
|
||||
sequencer.setSequence(sequence);
|
||||
sequencer.setTempoInBPM(100);
|
||||
System.out.println("Starting playback...");
|
||||
this.start();
|
||||
while (!finished && sequencer.getTickPosition() < sequencer.getTickLength()) {
|
||||
System.out.println("Tick "+sequencer.getTickPosition()+"...");
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
System.out.println("Stopping playback...");
|
||||
this.stop();
|
||||
if (metaCount != TOTAL_COUNT) {
|
||||
throw new Exception("Expected "+TOTAL_COUNT+" callbacks, but got "+metaCount+"!");
|
||||
}
|
||||
}
|
||||
void start() {sequencer.start();}
|
||||
void stop() {sequencer.stop();}
|
||||
|
||||
public void meta(MetaMessage msg) {
|
||||
System.out.println(""+metaCount+": got "+msg);
|
||||
if (msg.getType() == 0x2F) {
|
||||
finished = true;
|
||||
} else if (msg.getData().length > 0 && msg.getType() == 1) {
|
||||
metaCount++;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] argv) throws Exception {
|
||||
if (hasSequencer()) {
|
||||
new MetaCallback();
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
static boolean hasSequencer() {
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
if (seq != null) {
|
||||
seq.open();
|
||||
seq.close();
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
System.out.println("No sequencer available! Cannot execute test.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
213
jdk/test/javax/sound/midi/Sequencer/Recording.java
Normal file
213
jdk/test/javax/sound/midi/Sequencer/Recording.java
Normal file
@ -0,0 +1,213 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4932841
|
||||
* @key intermittent
|
||||
* @summary Sequencer's recording feature does not work
|
||||
*/
|
||||
public class Recording {
|
||||
|
||||
public static boolean failed = false;
|
||||
public static boolean passed = false;
|
||||
private static Sequencer seq = null;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
try {
|
||||
seq = MidiSystem.getSequencer();
|
||||
|
||||
// create an arbitrary sequence which lasts 10 seconds
|
||||
Sequence sequence = createSequence(10, 120, 240);
|
||||
|
||||
seq.setSequence(sequence);
|
||||
out("Set Sequence to Sequencer. Tempo="+seq.getTempoInBPM());
|
||||
|
||||
Track track = sequence.createTrack();
|
||||
int oldSize = track.size();
|
||||
seq.recordEnable(track, -1);
|
||||
|
||||
seq.open();
|
||||
|
||||
// if getReceiver throws Exception, failed!
|
||||
failed = true;
|
||||
Receiver rec = seq.getReceiver();
|
||||
|
||||
// start recording and add various events
|
||||
seq.startRecording();
|
||||
|
||||
// is exception from here on, not failed
|
||||
failed = false;
|
||||
|
||||
if (!seq.isRecording()) {
|
||||
failed = true;
|
||||
throw new Exception("Sequencer did not start recording!");
|
||||
}
|
||||
if (!seq.isRunning()) {
|
||||
failed = true;
|
||||
throw new Exception("Sequencer started recording, but is not running!");
|
||||
}
|
||||
|
||||
// first: add an event to the middle of the sequence
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(0xC0, 80, 00);
|
||||
rec.send(msg, 5l * 1000l * 1000l);
|
||||
|
||||
Thread.sleep(1000);
|
||||
|
||||
// then add a real-time event
|
||||
msg = new ShortMessage();
|
||||
msg.setMessage(0xC0, 81, 00);
|
||||
long secondEventTick = seq.getTickPosition();
|
||||
rec.send(msg, -1);
|
||||
|
||||
seq.stopRecording();
|
||||
if (seq.isRecording()) {
|
||||
failed = true;
|
||||
throw new Exception("Stopped recording, but Sequencer is still recording!");
|
||||
}
|
||||
if (!seq.isRunning()) {
|
||||
failed = true;
|
||||
throw new Exception("Stopped recording, but Sequencer but is not running anymore!");
|
||||
}
|
||||
|
||||
seq.stop();
|
||||
if (seq.isRunning()) {
|
||||
failed = true;
|
||||
throw new Exception("Stopped Sequencer, but it is still running!");
|
||||
}
|
||||
|
||||
// now examine the contents of the recorded track:
|
||||
// 1) number of events: should be 2 more
|
||||
int newSize = track.size();
|
||||
int addedEventCount = newSize - oldSize;
|
||||
|
||||
out("Added "+addedEventCount+" events to recording track.");
|
||||
if (addedEventCount != 2) {
|
||||
failed = true;
|
||||
throw new Exception("Did not add 2 events!");
|
||||
}
|
||||
|
||||
// 2) the first event should be at roughly "secondEventTick"
|
||||
MidiEvent ev = track.get(0);
|
||||
msg = (ShortMessage) ev.getMessage();
|
||||
out("The first recorded event is at tick position: "+ev.getTick());
|
||||
if (Math.abs(ev.getTick() - secondEventTick) > 1000) {
|
||||
out(" -> but expected something like: "+secondEventTick+"! FAILED.");
|
||||
failed = true;
|
||||
}
|
||||
|
||||
ev = track.get(1);
|
||||
msg = (ShortMessage) ev.getMessage();
|
||||
out("The 2nd recorded event is at tick position: "+ev.getTick());
|
||||
out(" -> sequence's tick length is "+seq.getTickLength());
|
||||
if (Math.abs(ev.getTick() - (sequence.getTickLength() / 2)) > 1000) {
|
||||
out(" -> but expected something like: "+(seq.getTickLength()/2)+"! FAILED.");
|
||||
failed = true;
|
||||
}
|
||||
|
||||
passed = true;
|
||||
} catch (Exception e) {
|
||||
out(e.toString());
|
||||
if (!failed) out("Test not failed.");
|
||||
}
|
||||
if (seq != null) {
|
||||
seq.close();
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
else if (passed) {
|
||||
out("Test Passed.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Sequence for testing.
|
||||
*/
|
||||
private static Sequence createSequence(int lengthInSeconds, int tempoInBPM,
|
||||
int resolution) {
|
||||
Sequence sequence = null;
|
||||
long lengthInMicroseconds = lengthInSeconds * 1000000;
|
||||
boolean createTempoEvent = true;
|
||||
if (tempoInBPM == 0) {
|
||||
tempoInBPM = 120;
|
||||
createTempoEvent = false;
|
||||
System.out.print("Creating sequence: "+lengthInSeconds+"sec, "
|
||||
+"resolution="+resolution+" ticks/beat...");
|
||||
} else {
|
||||
System.out.print("Creating sequence: "+lengthInSeconds+"sec, "
|
||||
+tempoInBPM+" beats/min, "
|
||||
+"resolution="+resolution+" ticks/beat...");
|
||||
}
|
||||
//long lengthInTicks = (lengthInMicroseconds * resolution) / tempoInBPM;
|
||||
long lengthInTicks = (lengthInMicroseconds * tempoInBPM * resolution) / 60000000l;
|
||||
//out("expected length in ticks: " + lengthInTicks);
|
||||
try {
|
||||
sequence = new Sequence(Sequence.PPQ, resolution);
|
||||
Track track = sequence.createTrack();
|
||||
if (createTempoEvent) {
|
||||
int tempoInMPQ = (int) (60000000l / tempoInBPM);
|
||||
MetaMessage tm = new MetaMessage();
|
||||
byte[] msg = new byte[3];
|
||||
msg[0] = (byte) (tempoInMPQ >> 16);
|
||||
msg[1] = (byte) ((tempoInMPQ >> 8) & 0xFF);
|
||||
msg[2] = (byte) (tempoInMPQ & 0xFF);
|
||||
|
||||
tm.setMessage(0x51 /* Meta Tempo */, msg, msg.length);
|
||||
track.add(new MidiEvent(tm, 0));
|
||||
//out("regtest: tempoInMPQ="+tempoInMPQ);
|
||||
//out("Added tempo event: new size="+track.size());
|
||||
}
|
||||
ShortMessage mm = new ShortMessage();
|
||||
mm.setMessage(0xF6, 0, 0);
|
||||
MidiEvent me = new MidiEvent(mm, lengthInTicks);
|
||||
track.add(me);
|
||||
//out("Added realtime event: new size="+track.size());
|
||||
} catch (InvalidMidiDataException e) {
|
||||
out(e);
|
||||
}
|
||||
out("OK");
|
||||
|
||||
return sequence;
|
||||
}
|
||||
|
||||
private static void out(Throwable t) {
|
||||
t.printStackTrace(System.out);
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
117
jdk/test/javax/sound/midi/Sequencer/SeqRecordDoesNotCopy.java
Normal file
117
jdk/test/javax/sound/midi/Sequencer/SeqRecordDoesNotCopy.java
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiMessage;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5048381
|
||||
* @summary Sequencer doesn't create distinct messages when recording events.
|
||||
* @key headful
|
||||
*/
|
||||
public class SeqRecordDoesNotCopy {
|
||||
public static void main(String argv[]) throws Exception {
|
||||
Sequencer s = MidiSystem.getSequencer();
|
||||
s.open();
|
||||
try {
|
||||
Sequence seq = new Sequence(Sequence.PPQ, 384, 2);
|
||||
s.setSequence(seq);
|
||||
Track t = seq.getTracks()[0];
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(0x90, 0x40, 0x7F);
|
||||
t.add(new MidiEvent(msg, 11000));
|
||||
msg.setMessage(0x90, 0x40, 0x00);
|
||||
t.add(new MidiEvent(msg, 12000));
|
||||
t = seq.getTracks()[1];
|
||||
s.recordEnable(t, -1);
|
||||
System.out.println("Started recording...");
|
||||
s.startRecording();
|
||||
Receiver r = s.getReceiver();
|
||||
Thread.sleep(100);
|
||||
// send a normal message
|
||||
System.out.println("Recording a normal NOTE ON message...");
|
||||
msg.setMessage(0x90, 0x40, 0x6F);
|
||||
r.send(msg, -1);
|
||||
Thread.sleep(100);
|
||||
// send a normal message
|
||||
System.out.println("Recording a normal NOTE OFF message...");
|
||||
msg.setMessage(0x90, 0x40, 0x00);
|
||||
r.send(msg, -1);
|
||||
Thread.sleep(100);
|
||||
s.stop();
|
||||
// now see if the messages were recorded
|
||||
System.out.println("Recorded messages:");
|
||||
int sameMessage = 0;
|
||||
for (int i = 0; i < t.size(); i++) {
|
||||
System.out.print(" "+(i+1)+". ");
|
||||
printEvent(t.get(i));
|
||||
if (t.get(i).getMessage() == msg) {
|
||||
System.out.println("## Failed: Same Message reference!");
|
||||
sameMessage++;
|
||||
}
|
||||
}
|
||||
if (sameMessage > 0) {
|
||||
System.out.println("## Failed: The same instance was recorded!");
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
System.out.println("Did not detect any duplicate messages.");
|
||||
System.out.println("Test passed.");
|
||||
} catch (Exception e) {
|
||||
System.out.println("Unexpected Exception: "+e);
|
||||
//e.printStackTrace();
|
||||
throw new Exception("Test FAILED!");
|
||||
} finally {
|
||||
s.close();
|
||||
}
|
||||
}
|
||||
public static void printEvent(MidiEvent event)
|
||||
{
|
||||
MidiMessage message = event.getMessage();
|
||||
long tick = event.getTick();
|
||||
byte[] data = message.getMessage();
|
||||
|
||||
StringBuffer sb = new StringBuffer((data.length * 3) - 1);
|
||||
|
||||
for (int i = 0; i < data.length; i++)
|
||||
{
|
||||
sb.append(toHexByteString(data[i]));
|
||||
if (i < data.length - 1) sb.append(' ');
|
||||
}
|
||||
System.out.printf("%5d: %s%n", tick, sb);
|
||||
}
|
||||
|
||||
private static String toHexByteString(int n)
|
||||
{
|
||||
if (n < 0) n &= 0xFF;
|
||||
String s = Integer.toHexString(n).toUpperCase();
|
||||
if (s.length() == 1) s = '0' + s;
|
||||
return s;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiMessage;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Receiver;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5048381
|
||||
* @summary Sequencer records real time messages into the sequence
|
||||
* @key headful
|
||||
*/
|
||||
public class SeqRecordsRealTimeEvents {
|
||||
public static void main(String argv[]) throws Exception {
|
||||
Sequencer s = MidiSystem.getSequencer();
|
||||
s.open();
|
||||
try {
|
||||
Sequence seq = new Sequence(Sequence.PPQ, 384, 2);
|
||||
s.setSequence(seq);
|
||||
Track t = seq.getTracks()[0];
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(0x90, 0x40, 0x7F);
|
||||
t.add(new MidiEvent(msg, 11000));
|
||||
msg = new ShortMessage();
|
||||
msg.setMessage(0x90, 0x40, 0x00);
|
||||
t.add(new MidiEvent(msg, 12000));
|
||||
t = seq.getTracks()[1];
|
||||
s.recordEnable(t, -1);
|
||||
System.out.println("Started recording...");
|
||||
s.startRecording();
|
||||
Receiver r = s.getReceiver();
|
||||
Thread.sleep(100);
|
||||
int oldTrackSize = t.size();
|
||||
// send a realtime message to the track
|
||||
System.out.println("Recording real time message...");
|
||||
msg = new ShortMessage();
|
||||
msg.setMessage(0xF8, 0, 0);
|
||||
r.send(msg, -1);
|
||||
Thread.sleep(100);
|
||||
// send a normal message
|
||||
msg = new ShortMessage();
|
||||
System.out.println("Recording a normal NOTE ON message...");
|
||||
msg.setMessage(0x90, 0x40, 0x6F);
|
||||
r.send(msg, -1);
|
||||
Thread.sleep(100);
|
||||
s.stop();
|
||||
// now see if the messages were recorded
|
||||
int newMessages = t.size() - oldTrackSize;
|
||||
System.out.println("Recorded messages:");
|
||||
for (int i = 0; i < t.size(); i++) {
|
||||
System.out.print(" "+(i+1)+". ");
|
||||
printEvent(t.get(i));
|
||||
}
|
||||
if (newMessages == 0) {
|
||||
System.out.println("## Failed: No messages were recorded!");
|
||||
throw new Exception("Test FAILED!");
|
||||
} else if (newMessages == 1) {
|
||||
System.out.println("Only one message was recorded. Correct!");
|
||||
} else if (newMessages > 1) {
|
||||
System.out.println("## Failed: 2 or more messages were recorded!");
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
System.out.println("Test passed.");
|
||||
} catch (Exception e) {
|
||||
System.out.println("Unexpected Exception: "+e);
|
||||
//e.printStackTrace();
|
||||
throw new Exception("Test FAILED!");
|
||||
} finally {
|
||||
s.close();
|
||||
}
|
||||
}
|
||||
public static void printEvent(MidiEvent event)
|
||||
{
|
||||
MidiMessage message = event.getMessage();
|
||||
long tick = event.getTick();
|
||||
byte[] data = message.getMessage();
|
||||
|
||||
StringBuffer sb = new StringBuffer((data.length * 3) - 1);
|
||||
|
||||
for (int i = 0; i < data.length; i++)
|
||||
{
|
||||
sb.append(toHexByteString(data[i]));
|
||||
if (i < data.length - 1) sb.append(' ');
|
||||
}
|
||||
System.out.printf("%5d: %s%n", tick, sb);
|
||||
}
|
||||
|
||||
private static String toHexByteString(int n)
|
||||
{
|
||||
if (n < 0) n &= 0xFF;
|
||||
String s = Integer.toHexString(n).toUpperCase();
|
||||
if (s.length() == 1) s = '0' + s;
|
||||
return s;
|
||||
}
|
||||
}
|
||||
52
jdk/test/javax/sound/midi/Sequencer/SeqStartRecording.java
Normal file
52
jdk/test/javax/sound/midi/Sequencer/SeqStartRecording.java
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequencer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5001943
|
||||
* @summary Sequencer.startRecording throws unexpected NPE
|
||||
* @key headful
|
||||
*/
|
||||
public class SeqStartRecording {
|
||||
public static void main(String argv[]) throws Exception {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
seq.open();
|
||||
try {
|
||||
seq.startRecording();
|
||||
System.out.println("Test passed.");
|
||||
} catch (NullPointerException npe) {
|
||||
System.out.println("Caught NPE: "+npe);
|
||||
npe.printStackTrace();
|
||||
throw new Exception("Test FAILED!");
|
||||
} catch (Exception e) {
|
||||
System.out.println("Unexpected Exception: "+e);
|
||||
e.printStackTrace();
|
||||
System.out.println("Test NOT failed.");
|
||||
} finally {
|
||||
seq.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
106
jdk/test/javax/sound/midi/Sequencer/SequencerCacheValues.java
Normal file
106
jdk/test/javax/sound/midi/Sequencer/SequencerCacheValues.java
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Sequencer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4716740
|
||||
* @summary default sequencer does not set the tempo factor
|
||||
*/
|
||||
public class SequencerCacheValues {
|
||||
|
||||
static boolean failed = false;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
Sequencer seq = null;
|
||||
int totalNumberOfSequencers = 0;
|
||||
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int device=0; device<infos.length; device++) {
|
||||
//seq = MidiSystem.getSequencer();
|
||||
MidiDevice dev = MidiSystem.getMidiDevice(infos[device]);
|
||||
if (dev instanceof Sequencer) {
|
||||
seq = (Sequencer) dev;
|
||||
totalNumberOfSequencers++;
|
||||
System.out.println("Opening sequencer "+infos[device]);
|
||||
try {
|
||||
seq.open();
|
||||
try {
|
||||
doTest(seq);
|
||||
} finally {
|
||||
if (seq != null) {
|
||||
seq.close();
|
||||
seq = null;
|
||||
}
|
||||
}
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.err.println("MidiUnavailableException was thrown: " + mue);
|
||||
System.err.println("could not test this sequencer.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (totalNumberOfSequencers == 0) {
|
||||
System.out.println("No sequencers installed!");
|
||||
failed = true;
|
||||
}
|
||||
if (failed) {
|
||||
throw new Exception("FAILED");
|
||||
} else {
|
||||
System.out.println("test OK");
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean equalsFloat(float f1, float f2) {
|
||||
return (f1-f2<0.0001) && (f2-f1<0.0001);
|
||||
}
|
||||
|
||||
public static void doTest(Sequencer seq) throws Exception {
|
||||
seq.setTempoInMPQ(3.0f);
|
||||
System.out.println("Setting tempo in MPQ to "+3.0f);
|
||||
if (!equalsFloat(seq.getTempoInMPQ(), 3.0f)) {
|
||||
System.err.println("getTempoInMPQ() returns wrong value : "
|
||||
+ seq.getTempoInMPQ());
|
||||
failed = true;
|
||||
}
|
||||
|
||||
System.out.println("Setting tempo factor to "+2.0f);
|
||||
seq.setTempoFactor(2.0f);
|
||||
if (!equalsFloat(seq.getTempoFactor(), 2.0f)) {
|
||||
System.err.println("getTempoFactor() returns: " + seq.getTempoFactor());
|
||||
failed = true;
|
||||
}
|
||||
|
||||
float bpmTempo = 120.0f;
|
||||
System.out.println("Setting tempo to "+120.0f+"bpm");
|
||||
seq.setTempoInBPM(bpmTempo);
|
||||
if (!equalsFloat(seq.getTempoInMPQ(), (60000000.0f/seq.getTempoInBPM()))) {
|
||||
System.err.println("getTempoInMPQ() returns: " + seq.getTempoInMPQ());
|
||||
System.err.println("getTempoInBPM() returns: " + seq.getTempoInBPM());
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
170
jdk/test/javax/sound/midi/Sequencer/SequencerSetMuteSolo.java
Normal file
170
jdk/test/javax/sound/midi/Sequencer/SequencerSetMuteSolo.java
Normal file
@ -0,0 +1,170 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4713900
|
||||
* @summary default Sequencer allows to set Mute for invalid track
|
||||
*/
|
||||
public class SequencerSetMuteSolo {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
if (!hasSequencer()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//printMidiFile(args[0]);
|
||||
|
||||
boolean failed = false;
|
||||
Sequencer seq = null;
|
||||
Sequence midiData = getSequence();
|
||||
int numTracks = midiData.getTracks().length;
|
||||
int totalNumberOfSequencers = 0;
|
||||
int totalNumberOfTestedSequencers = 0;
|
||||
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (int device=0; device<infos.length; device++) {
|
||||
//seq = MidiSystem.getSequencer();
|
||||
MidiDevice dev = MidiSystem.getMidiDevice(infos[device]);
|
||||
if (dev instanceof Sequencer) {
|
||||
seq = (Sequencer) dev;
|
||||
totalNumberOfSequencers++;
|
||||
System.out.println("Opening sequencer "+infos[device]);
|
||||
try {
|
||||
seq.open();
|
||||
try {
|
||||
seq.setSequence(midiData);
|
||||
System.err.println("Number of tracks: " + numTracks);
|
||||
System.err.println("TrackMute["+numTracks+"] state was: " + seq.getTrackMute(numTracks));
|
||||
System.err.println(" setting to muted.");
|
||||
seq.setTrackMute(numTracks, true);
|
||||
System.err.println(" TrackMute["+numTracks+"] is now: " + seq.getTrackMute(numTracks));
|
||||
if (seq.getTrackMute(numTracks)) {
|
||||
failed = true;
|
||||
}
|
||||
System.err.println("TrackSolo["+numTracks+"] state was: " + seq.getTrackSolo(numTracks));
|
||||
System.err.println(" setting to solo.");
|
||||
seq.setTrackSolo(numTracks, true);
|
||||
System.err.println(" TrackSolo["+numTracks+"] is now: " + seq.getTrackSolo(numTracks));
|
||||
if (seq.getTrackSolo(numTracks)) {
|
||||
failed = true;
|
||||
}
|
||||
totalNumberOfTestedSequencers++;
|
||||
} finally {
|
||||
if (seq != null) {
|
||||
seq.close();
|
||||
seq = null;
|
||||
}
|
||||
}
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.err.println("MidiUnavailableException was thrown: " + mue);
|
||||
System.err.println("could not test this sequencer.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (totalNumberOfSequencers == 0) {
|
||||
System.out.println("No sequencers installed!");
|
||||
failed = true;
|
||||
}
|
||||
if (totalNumberOfTestedSequencers == 0) {
|
||||
System.out.println("Could not test any sequencers!");
|
||||
failed = true;
|
||||
}
|
||||
if( failed ) {
|
||||
throw new Exception("FAILED");
|
||||
} else {
|
||||
System.out.println("test OK");
|
||||
}
|
||||
}
|
||||
|
||||
public static String getString(byte b) {
|
||||
//String res = Integer.toHexString(b & 0xFF).toUpperCase();
|
||||
//while (res.length()<2) res="0"+res;
|
||||
//return res;
|
||||
return String.valueOf(b);
|
||||
}
|
||||
|
||||
|
||||
public static void printMidiFile(String filename) throws Exception {
|
||||
File file = new File(filename);
|
||||
FileInputStream fis = new FileInputStream(file);
|
||||
byte[] data = new byte[(int) file.length()];
|
||||
fis.read(data);
|
||||
String s = "";
|
||||
for (int i=0; i<data.length; i++) {
|
||||
s+=getString(data[i])+", ";
|
||||
if (s.length()>72) {
|
||||
System.out.println(s);
|
||||
s="";
|
||||
}
|
||||
}
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
public static Sequence getSequence() throws Exception {
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(pitchbend);
|
||||
Sequence seq = MidiSystem.getSequence(bais);
|
||||
return seq;
|
||||
}
|
||||
|
||||
public static byte[] pitchbend = {
|
||||
77, 84, 104, 100, 0, 0, 0, 6, 0, 1, 0, 2, 0, 120, 77, 84, 114, 107, 0, 0,
|
||||
0, 27, 0, -1, 3, 19, 77, 73, 68, 73, 32, 116, 101, 115, 116, 32, 45, 32,
|
||||
116, 114, 97, 99, 107, 32, 48, 0, -1, 47, 0, 77, 84, 114, 107, 0, 0, 0, -44,
|
||||
0, -1, 3, 19, 77, 73, 68, 73, 32, 116, 101, 115, 116, 32, 45, 32, 116, 114,
|
||||
97, 99, 107, 32, 49, 0, -64, 30, 0, -112, 68, 126, 0, -32, 6, 67, 0, 14,
|
||||
71, 0, 20, 74, 0, 26, 77, 0, 32, 80, 0, 42, 85, 6, 50, 89, 6, 56, 92, 5,
|
||||
66, 97, 6, 74, 101, 6, 80, 104, 11, 84, 106, 20, 76, 102, 6, 70, 99, 5, 60,
|
||||
94, 6, 52, 90, 5, 44, 86, 4, 34, 81, 5, 26, 77, 5, 20, 74, 6, 10, 69, 5,
|
||||
2, 65, 7, 0, 64, 42, -112, 66, 123, 11, 68, 0, 72, 63, 126, 4, 66, 0, 43,
|
||||
-32, 0, 63, 6, 0, 60, 7, 0, 56, 6, 0, 53, 5, 0, 49, 5, 0, 43, 4, 0, 37, 3,
|
||||
0, 30, 3, 0, 25, 3, 0, 19, 3, 0, 13, 4, 0, 8, 4, 0, 2, 4, 0, 0, 70, 0, 3,
|
||||
5, 0, 9, 3, 0, 14, 7, 0, 16, 25, 0, 21, 5, 0, 25, 7, 0, 28, 5, 0, 32, 5,
|
||||
0, 36, 5, 0, 41, 6, 0, 46, 5, 0, 50, 5, 0, 53, 4, 0, 58, 7, 0, 61, 7, 0,
|
||||
64, 117, -112, 63, 0, 0, -1, 47, 0
|
||||
};
|
||||
|
||||
static boolean hasSequencer() {
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
if (seq != null) {
|
||||
seq.open();
|
||||
seq.close();
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
System.out.println("No sequencer available! Cannot execute test.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
272
jdk/test/javax/sound/midi/Sequencer/SequencerState.java
Normal file
272
jdk/test/javax/sound/midi/Sequencer/SequencerState.java
Normal file
@ -0,0 +1,272 @@
|
||||
/*
|
||||
* 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.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4913027
|
||||
* @summary several Sequencer methods should specify behaviour on closed Sequencer
|
||||
*/
|
||||
public class SequencerState {
|
||||
|
||||
private static boolean hasSequencer() {
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
if (seq != null) {
|
||||
seq.open();
|
||||
seq.close();
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
System.out.println("No sequencer available! Cannot execute test.");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
out("4913027: several Sequencer methods should should specify behaviour on closed Sequencer");
|
||||
if (hasSequencer()) {
|
||||
boolean passed = testAll();
|
||||
if (passed) {
|
||||
out("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the test on all available Sequencers.
|
||||
*
|
||||
* @return true if the test passed for all Sequencers, false otherwise
|
||||
*/
|
||||
private static boolean testAll() throws Exception {
|
||||
boolean result = true;
|
||||
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
|
||||
for (int i = 0; i < devices.length; i++) {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
|
||||
if (device instanceof Sequencer) {
|
||||
result &= testSequencer((Sequencer) device);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the test on the passed Sequencer.
|
||||
*
|
||||
* @return true if the test is passed this Sequencer, false otherwise
|
||||
*/
|
||||
private static boolean testSequencer(Sequencer seq) throws Exception {
|
||||
boolean result = true;
|
||||
|
||||
out("testing: " + seq);
|
||||
/* test calls in closed state.
|
||||
*/
|
||||
if (seq.isOpen()) {
|
||||
out("Sequencer is already open, cannot test!");
|
||||
return result;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.start();
|
||||
out("closed state: start() does not throw IllegalStateException!");
|
||||
result = false;
|
||||
} catch (IllegalStateException e) {
|
||||
}
|
||||
|
||||
try {
|
||||
seq.stop();
|
||||
out("closed state: stop() does not throw IllegalStateException!");
|
||||
result = false;
|
||||
} catch (IllegalStateException e) {
|
||||
}
|
||||
|
||||
try {
|
||||
seq.startRecording();
|
||||
out("closed state: startRecording() does not throw IllegalStateException!");
|
||||
result = false;
|
||||
} catch (IllegalStateException e) {
|
||||
}
|
||||
|
||||
try {
|
||||
seq.stopRecording();
|
||||
out("closed state: stopRecording() does not throw IllegalStateException!");
|
||||
result = false;
|
||||
} catch (IllegalStateException e) {
|
||||
}
|
||||
|
||||
Sequence sequence = createSequence();
|
||||
if (sequence == null) {
|
||||
out("created Sequence is null, cannot test!");
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
seq.setSequence(sequence);
|
||||
} catch (IllegalStateException e) {
|
||||
out("closed state: setSequence(Sequence) throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
InputStream inputStream = createSequenceInputStream();
|
||||
if (inputStream == null) {
|
||||
out("created InputStream is null, cannot test!");
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
seq.setSequence(inputStream);
|
||||
} catch (IllegalStateException e) {
|
||||
out("closed state: setSequence(InputStream) throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.getSequence();
|
||||
} catch (IllegalStateException e) {
|
||||
out("closed state: getSequence() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
/* test calls in open state.
|
||||
*/
|
||||
seq.open();
|
||||
if (! seq.isOpen()) {
|
||||
out("Sequencer is not open, cannot test!");
|
||||
return result;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.start();
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: start() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.stop();
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: stop() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.startRecording();
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: startRecording() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.stopRecording();
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: stopRecording() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
sequence = createSequence();
|
||||
if (sequence == null) {
|
||||
out("created Sequence is null, cannot test!");
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
seq.setSequence(sequence);
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: setSequence(Sequence) throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
inputStream = createSequenceInputStream();
|
||||
if (inputStream == null) {
|
||||
out("created InputStream is null, cannot test!");
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
seq.setSequence(inputStream);
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: setSequence(InputStream) throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
try {
|
||||
seq.getSequence();
|
||||
} catch (IllegalStateException e) {
|
||||
out("open state: getSequence() throws IllegalStateException!");
|
||||
result = false;
|
||||
}
|
||||
|
||||
seq.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Sequence for testing.
|
||||
*
|
||||
* @return a dummy Sequence, or null, if a problem occured while creating
|
||||
* the Sequence
|
||||
*/
|
||||
private static Sequence createSequence() {
|
||||
Sequence sequence = null;
|
||||
try {
|
||||
sequence = new Sequence(Sequence.PPQ, 480, 1);
|
||||
} catch (InvalidMidiDataException e) {
|
||||
// DO NOTHING
|
||||
}
|
||||
return sequence;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new InputStream containing a Sequence for testing.
|
||||
*
|
||||
* @return an InputStream containing a dummy Sequence, or null, if a problem
|
||||
* occured while creating the InputStream
|
||||
*/
|
||||
private static InputStream createSequenceInputStream() {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
Sequence sequence = createSequence();
|
||||
if (sequence == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
MidiSystem.write(sequence, 0, baos);
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||
return bais;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
139
jdk/test/javax/sound/midi/Sequencer/SetTickPosition.java
Normal file
139
jdk/test/javax/sound/midi/Sequencer/SetTickPosition.java
Normal file
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4493775
|
||||
* @summary Sequncer method, setTickPosition(long) doesnot set the Tick position
|
||||
*/
|
||||
public class SetTickPosition {
|
||||
private static boolean testPassed = true;
|
||||
|
||||
public void runTest()
|
||||
{
|
||||
Sequencer theSequencer = null;
|
||||
try
|
||||
{
|
||||
System.out.print("Getting Sequencer...");
|
||||
theSequencer = MidiSystem.getSequencer();
|
||||
System.out.println("got "+theSequencer);
|
||||
|
||||
if(!(theSequencer.isOpen()))
|
||||
{
|
||||
System.out.println("Opening Sequencer...");
|
||||
theSequencer.open();
|
||||
|
||||
if(!(theSequencer.isOpen()))
|
||||
{
|
||||
System.out.println("Unable to open the Sequencer. Test NOT FAILED.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("theSequencer is open!\n");
|
||||
|
||||
System.out.println("Creating New Sequence...");
|
||||
Sequence theSequence = new Sequence(Sequence.PPQ, 120);
|
||||
|
||||
System.out.println("Adding Track To Sequence...");
|
||||
Track theTrack = theSequence.createTrack();
|
||||
|
||||
int theChannel = 0;
|
||||
|
||||
int theNote = 60;
|
||||
int theVelocity = 100;
|
||||
ShortMessage theShortMessage = new ShortMessage();
|
||||
|
||||
for (int tick=0; tick<2000; tick+=120) {
|
||||
//System.out.println("Adding NOTE_ON To Track At Tick: " + tick + "...\n");
|
||||
theShortMessage.setMessage(ShortMessage.NOTE_ON, theChannel, theNote, theVelocity);
|
||||
MidiEvent theMidiEvent = new MidiEvent(theShortMessage, tick);
|
||||
theTrack.add(theMidiEvent);
|
||||
|
||||
//System.out.println("Adding NOTE_OFF To Track At Tick: " + (tick+60) + "...\n");
|
||||
theShortMessage.setMessage(ShortMessage.NOTE_OFF, theChannel, theNote, theVelocity);
|
||||
theMidiEvent = new MidiEvent(theShortMessage, tick+60);
|
||||
theTrack.add(theMidiEvent);
|
||||
}
|
||||
theSequencer.setSequence(theSequence);
|
||||
|
||||
float theTempoInBPM = 120;
|
||||
theSequencer.setTempoInBPM(theTempoInBPM);
|
||||
long theTickLengthOfSequence = theSequencer.getTickLength();
|
||||
System.out.println("Length Of Sequence In Ticks: " + theTickLengthOfSequence);
|
||||
System.out.println("Sequence resolution: " + theSequencer.getSequence().getResolution());
|
||||
|
||||
theSequencer.start();
|
||||
for(long theTickPosition = 0; theTickPosition < theTickLengthOfSequence; theTickPosition += (theTickLengthOfSequence / 10))
|
||||
{
|
||||
System.out.println("Now Setting Tick Position To: " + theTickPosition);
|
||||
theSequencer.setTickPosition(theTickPosition);
|
||||
|
||||
long theCurrentTickPosition = theSequencer.getTickPosition();
|
||||
long theCurrentMsPosition = (long) (theSequencer.getMicrosecondPosition()/1000);
|
||||
System.out.println("IsRunning()=" + theSequencer.isRunning());
|
||||
System.out.println("Now Current Tick Position Is: " + theCurrentTickPosition);
|
||||
//System.out.println("Now Current micro Position Is: " + theCurrentMsPosition);
|
||||
System.out.println("");
|
||||
|
||||
try {
|
||||
Thread.sleep(800);
|
||||
} catch (InterruptedException ie) {}
|
||||
|
||||
// last time, set tick pos to 0
|
||||
if (theTickPosition>0 && theTickPosition<(theTickLengthOfSequence / 10)) {
|
||||
theTickPosition=(theTickLengthOfSequence / 10);
|
||||
}
|
||||
|
||||
// 30 = 1/4 * 120, the resolution of the sequence
|
||||
if(Math.abs(theCurrentTickPosition - theTickPosition) > 30) {
|
||||
System.out.println("theCurrentTickPosition != theTickPosition!");
|
||||
testPassed = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex) { ex.printStackTrace(); }
|
||||
if (theSequencer != null) {
|
||||
theSequencer.close();
|
||||
}
|
||||
if (testPassed) {
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SetTickPosition thisTest = new SetTickPosition();
|
||||
thisTest.runTest();
|
||||
if (!testPassed) {
|
||||
throw new Exception("Test FAILED");
|
||||
}
|
||||
}
|
||||
}
|
||||
211
jdk/test/javax/sound/midi/Sequencer/TickLength.java
Normal file
211
jdk/test/javax/sound/midi/Sequencer/TickLength.java
Normal file
@ -0,0 +1,211 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaEventListener;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Sequencer;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4427890
|
||||
* @run main/othervm TickLength
|
||||
* @summary Sequencer.getTickLength() and Sequence.getTickLength() report the
|
||||
* wrong length
|
||||
*/
|
||||
public class TickLength implements MetaEventListener {
|
||||
private Sequence theSequence;
|
||||
private Sequencer theSequencer;
|
||||
|
||||
public TickLength() {
|
||||
this.initMidiCompoments();
|
||||
System.out.println("Got Sequencer "+theSequencer);
|
||||
theSequence = this.generateSequence();
|
||||
try {
|
||||
theSequencer.setSequence(theSequence);
|
||||
}
|
||||
catch(Exception e) {
|
||||
System.out.println(this.getClass()+"\tCannot set sequence to sequencer ("+e+")");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
theSequencer.start();
|
||||
}
|
||||
|
||||
/*
|
||||
instantiate the necessary midi components
|
||||
*/
|
||||
private boolean initMidiCompoments() {
|
||||
|
||||
|
||||
try {
|
||||
theSequencer = MidiSystem.getSequencer();
|
||||
}
|
||||
catch(Exception e) {
|
||||
System.out.println(this.getClass()+"\tSequencer Device not supported"+e+")");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
theSequencer.open();
|
||||
}
|
||||
catch(Exception e) {
|
||||
System.out.println(this.getClass()+"Cannot open Sequencer Device");
|
||||
return false;
|
||||
}
|
||||
if(!theSequencer.addMetaEventListener(this)) {
|
||||
System.out.println(this.getClass()+"\tCould not register MetaEventListener - there will be problems with scrolling! ");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static int lastTick = 0;
|
||||
|
||||
private Sequence generateSequence() {
|
||||
MidiEvent dummyMidiEvent;
|
||||
ShortMessage dummyShortMessage;
|
||||
Sequence dummySequence = null;
|
||||
Track[] allTracks ;
|
||||
Track theTrack;
|
||||
|
||||
try {
|
||||
dummySequence = new Sequence(Sequence.PPQ,1500);
|
||||
}
|
||||
catch(InvalidMidiDataException e) {
|
||||
System.out.println("O o "+e);
|
||||
}
|
||||
|
||||
dummySequence.createTrack();
|
||||
allTracks = dummySequence.getTracks();
|
||||
theTrack = allTracks[0];
|
||||
lastTick = 0;
|
||||
for(int i=0;i<20; i++) {
|
||||
theTrack.add(this.createShortMidiEvent(ShortMessage.NOTE_ON, 2, 30+i, 100,100+1000*i));
|
||||
theTrack.add(this.createMetaMidiEvent(1,"start",100+1000*i));
|
||||
lastTick = (1000*i)+600;
|
||||
theTrack.add(this.createShortMidiEvent(ShortMessage.NOTE_OFF, 2, 30+i, 100, lastTick));
|
||||
theTrack.add(this.createMetaMidiEvent(1,"end",lastTick));
|
||||
}
|
||||
|
||||
return dummySequence;
|
||||
}
|
||||
|
||||
/*
|
||||
A method to create a short midi event (sound)
|
||||
*/
|
||||
|
||||
public MidiEvent createShortMidiEvent(int theCommand, int theChannel, int theData1, int theData2, long theTime) {
|
||||
ShortMessage dummyShortMessage;
|
||||
MidiEvent dummyMidiEvent;
|
||||
|
||||
try {
|
||||
dummyShortMessage = new ShortMessage();
|
||||
dummyShortMessage.setMessage(theCommand, theChannel, theData1, theData2);
|
||||
dummyMidiEvent = new MidiEvent(dummyShortMessage,theTime);
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(this.getClass()+"\t"+e);
|
||||
return null;
|
||||
}
|
||||
|
||||
return dummyMidiEvent;
|
||||
}
|
||||
|
||||
/*
|
||||
A method to create a meta midi event (used in meta() method)
|
||||
*/
|
||||
public MidiEvent createMetaMidiEvent(int theType, String theData1, long theTime) {
|
||||
MetaMessage dummyMetaMessage;
|
||||
MidiEvent dummyMidiEvent;
|
||||
|
||||
try {
|
||||
dummyMetaMessage = new MetaMessage();
|
||||
dummyMetaMessage.setMessage(theType, theData1.getBytes(), theData1.length());
|
||||
dummyMidiEvent = new MidiEvent(dummyMetaMessage,theTime);
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
return dummyMidiEvent;
|
||||
}
|
||||
|
||||
/*
|
||||
the method is activated by each meta midi event
|
||||
it puts out the actual tick position, as well as the WRONG total tick length and the RIGHT
|
||||
tick length using the work around by dividing the total length by 64
|
||||
*/
|
||||
public void meta(MetaMessage p1) {
|
||||
if(p1.getType() ==47) {
|
||||
return;
|
||||
}
|
||||
System.out.println("getTickPosition:\t"+theSequencer.getTickPosition()
|
||||
+"\t Sequencer.getTickLength:\t"+theSequencer.getTickLength()
|
||||
+"\tReal Length:\t"+lastTick
|
||||
+"\t Sequence.getTickLength:\t"+theSequence.getTickLength()
|
||||
//(theSequencer.getTickLength()/64));
|
||||
);
|
||||
}
|
||||
|
||||
public void checkLengths() throws Exception {
|
||||
System.out.println("Sequencer.getTickLength() = "+theSequencer.getTickLength());
|
||||
System.out.println("Sequence.getTickLength() = "+theSequence.getTickLength());
|
||||
long diff = theSequencer.getTickLength() - theSequence.getTickLength();
|
||||
if (diff > 100 || diff < -100) {
|
||||
throw new Exception("Difference too large! Failed.");
|
||||
}
|
||||
System.out.println("Passed");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (!hasSequencer()) {
|
||||
return;
|
||||
}
|
||||
TickLength tlt = new TickLength();
|
||||
//tlt.start();
|
||||
tlt.checkLengths();
|
||||
}
|
||||
|
||||
static boolean hasSequencer() {
|
||||
try {
|
||||
Sequencer seq = MidiSystem.getSequencer();
|
||||
if (seq != null) {
|
||||
seq.open();
|
||||
seq.close();
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
System.out.println("No sequencer available! Cannot execute test.");
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
71
jdk/test/javax/sound/midi/ShortMessage/FastShortMessage.java
Normal file
71
jdk/test/javax/sound/midi/ShortMessage/FastShortMessage.java
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4851018
|
||||
* @summary MidiMessage.getLength and .getData return wrong values.
|
||||
* also: 4890405: Reading MidiMessage byte array fails in 1.4.2
|
||||
*/
|
||||
public class FastShortMessage {
|
||||
public static void main(String args[]) throws Exception {
|
||||
int[] dataMes = {ShortMessage.NOTE_ON | 9, 0x24, 0x50};
|
||||
int res = 240;
|
||||
Sequence midiData = new Sequence(Sequence.PPQ, res);
|
||||
|
||||
Track track = midiData.createTrack();
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(dataMes[0], dataMes[1], dataMes[2]);
|
||||
track.add(new MidiEvent(msg, 0));
|
||||
|
||||
// save sequence to outputstream
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
MidiSystem.write(midiData, 0, baos);
|
||||
|
||||
// reload that sequence
|
||||
InputStream is = new ByteArrayInputStream(baos.toByteArray());
|
||||
Sequence seq = MidiSystem.getSequence(is);
|
||||
|
||||
track = seq.getTracks()[0];
|
||||
msg = (ShortMessage) (track.get(0).getMessage());
|
||||
byte[] msgData = msg.getMessage();
|
||||
|
||||
if (msgData.length != dataMes.length
|
||||
|| (msgData[0] & 0xFF) != dataMes[0]
|
||||
|| (msgData[1] & 0xFF) != dataMes[1]
|
||||
|| (msgData[2] & 0xFF) != dataMes[2]) {
|
||||
throw new Exception("test failed. read length="+msgData.length);
|
||||
}
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5011306
|
||||
* @summary FastShortMessage.setMessage does not use the data2 parameter
|
||||
*/
|
||||
public class FastShortMessage2 {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
int[] dataMes = {ShortMessage.NOTE_ON | 9, 0x24, 0x50};
|
||||
|
||||
Sequence midiData = new Sequence(Sequence.PPQ, 240);
|
||||
Track track = midiData.createTrack();
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(dataMes[0], dataMes[1], dataMes[2]);
|
||||
track.add(new MidiEvent(msg, 0));
|
||||
// save sequence to outputstream
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
MidiSystem.write(midiData, 0, baos);
|
||||
// reload that sequence
|
||||
InputStream is = new ByteArrayInputStream(baos.toByteArray());
|
||||
Sequence seq = MidiSystem.getSequence(is);
|
||||
track = seq.getTracks()[0];
|
||||
msg = (ShortMessage) (track.get(0).getMessage());
|
||||
if (!msg.getClass().toString().contains("FastShortMessage")) {
|
||||
System.out.println("msg is not FastShortMessage, this test is useless then..."+msg.getClass());
|
||||
}
|
||||
|
||||
msg.setMessage(dataMes[0], dataMes[1], dataMes[2]);
|
||||
byte[] msgData = msg.getMessage();
|
||||
|
||||
if (msgData.length != dataMes.length
|
||||
|| (msgData[0] & 0xFF) != dataMes[0]
|
||||
|| (msgData[1] & 0xFF) != dataMes[1]
|
||||
|| (msgData[2] & 0xFF) != dataMes[2]) {
|
||||
System.out.println("status="+(msgData[0] & 0xFF)+" and expected "+dataMes[0]);
|
||||
System.out.println("data1="+(msgData[1] & 0xFF)+" and expected "+dataMes[1]);
|
||||
System.out.println("data2="+(msgData[2] & 0xFF)+" and expected "+dataMes[2]);
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
}
|
||||
123
jdk/test/javax/sound/midi/Soundbanks/ExtraCharInSoundbank.java
Normal file
123
jdk/test/javax/sound/midi/Soundbanks/ExtraCharInSoundbank.java
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.midi.Instrument;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Soundbank;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4429762
|
||||
* @summary Some instrument names in some soundbanks include bad extra characters
|
||||
*/
|
||||
public class ExtraCharInSoundbank {
|
||||
|
||||
private static void printName(String loadedName)
|
||||
{
|
||||
System.out.println("Loaded Name: " + loadedName);
|
||||
byte[] theLoadedNameByteArray = loadedName.getBytes();
|
||||
|
||||
System.out.print("Name Bytes: ");
|
||||
for(int i = 0; i < theLoadedNameByteArray.length; i++)
|
||||
System.out.print((Integer.toHexString((int)theLoadedNameByteArray[i]).toUpperCase()) + " ");
|
||||
System.out.println("");
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
private static boolean containsControlChar(String name) {
|
||||
byte[] bytes = name.getBytes();
|
||||
for (int i = 0; i < bytes.length; i++) {
|
||||
if (bytes[i] < 32) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean checkInstrumentNames(Synthesizer theSynthesizer)
|
||||
{
|
||||
boolean containsControlCharacters = false;
|
||||
|
||||
Instrument[] theLoadedInstruments = theSynthesizer.getLoadedInstruments();
|
||||
|
||||
System.out.println("Checking soundbank...");
|
||||
for(int theInstrumentIndex = 0; theInstrumentIndex < theLoadedInstruments.length; theInstrumentIndex++) {
|
||||
String name = theLoadedInstruments[theInstrumentIndex].getName();
|
||||
if (containsControlChar(name)) {
|
||||
containsControlCharacters = true;
|
||||
System.out.print("Instrument[" + theInstrumentIndex + "] contains unexpected control characters: ");
|
||||
printName(name);
|
||||
}
|
||||
}
|
||||
return !containsControlCharacters;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// the internal synthesizer needs a soundcard to work properly
|
||||
if (!isSoundcardInstalled()) {
|
||||
return;
|
||||
}
|
||||
Synthesizer theSynth = MidiSystem.getSynthesizer();
|
||||
System.out.println("Got synth: "+theSynth);
|
||||
theSynth.open();
|
||||
try {
|
||||
Soundbank theSoundbank = theSynth.getDefaultSoundbank();
|
||||
System.out.println("Got soundbank: "+theSoundbank);
|
||||
theSynth.loadAllInstruments(theSoundbank);
|
||||
try {
|
||||
if (!checkInstrumentNames(theSynth)) {
|
||||
throw new Exception("Test failed");
|
||||
}
|
||||
} finally {
|
||||
theSynth.unloadAllInstruments(theSoundbank);
|
||||
}
|
||||
} finally {
|
||||
theSynth.close();
|
||||
}
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4629810
|
||||
* @summary MidiSystem.getSoundbank() throws unexpected IOException
|
||||
*/
|
||||
public class GetSoundBankIOException {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
boolean failed = false;
|
||||
try {
|
||||
String filename = "GetSoundBankIOException.java";
|
||||
System.out.println("Opening "+filename+" as soundbank...");
|
||||
File midiFile = new File(System.getProperty("test.src", "."), filename);
|
||||
MidiSystem.getSoundbank(midiFile);
|
||||
//Soundbank sBank = MidiSystem.getSoundbank(new NonMarkableIS());
|
||||
System.err.println("InvalidMidiDataException was not thrown!");
|
||||
failed = true;
|
||||
} catch (InvalidMidiDataException invMidiEx) {
|
||||
System.err.println("InvalidMidiDataException was thrown. OK.");
|
||||
} catch (IOException ioEx) {
|
||||
System.err.println("Unexpected IOException was caught!");
|
||||
System.err.println(ioEx.getMessage());
|
||||
ioEx.printStackTrace();
|
||||
failed = true;
|
||||
}
|
||||
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
private static class NonMarkableIS extends InputStream {
|
||||
int counter = 0;
|
||||
|
||||
public NonMarkableIS() {
|
||||
}
|
||||
|
||||
public int read() throws IOException {
|
||||
if (counter > 1000) return -1;
|
||||
return (++counter) % 256;
|
||||
}
|
||||
|
||||
public synchronized void mark(int readlimit) {
|
||||
System.out.println("Called mark with readlimit= "+readlimit);
|
||||
}
|
||||
|
||||
public synchronized void reset() throws IOException {
|
||||
throw new IOException("mark/reset not supported");
|
||||
}
|
||||
|
||||
public boolean markSupported() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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.io.PrintStream;
|
||||
|
||||
import javax.sound.midi.Instrument;
|
||||
import javax.sound.midi.MidiChannel;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Soundbank;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4987585
|
||||
* @summary Some MidiChannel methods are asynchronous
|
||||
*/
|
||||
public class AsynchronousMidiChannel {
|
||||
static PrintStream log = System.err;
|
||||
static PrintStream ref = System.out;
|
||||
|
||||
public static void main(String args[]) {
|
||||
doIt(args);
|
||||
}
|
||||
|
||||
public static void doIt(String args[]) {
|
||||
Synthesizer synth = null;
|
||||
MidiChannel mChanArr[];
|
||||
MidiChannel chan = null;
|
||||
boolean failed = false;
|
||||
int i = 0;
|
||||
int chanNum = 0;
|
||||
|
||||
int val = 1;
|
||||
int contr = 0;
|
||||
Soundbank sBank;
|
||||
Instrument[] insArr;
|
||||
Instrument instr = null;
|
||||
Object ev = new Object();
|
||||
|
||||
try {
|
||||
synth = MidiSystem.getSynthesizer();
|
||||
System.out.println("Got synth: "+synth);
|
||||
synth.open();
|
||||
|
||||
int latency = (int) synth.getLatency();
|
||||
System.out.println(" -> latency: "
|
||||
+latency
|
||||
+" microseconds");
|
||||
|
||||
mChanArr = synth.getChannels();
|
||||
while ((i < mChanArr.length) && (chan == null)) {
|
||||
chanNum = i;
|
||||
chan = mChanArr[i++];
|
||||
}
|
||||
if (chan == null) {
|
||||
System.out.println("No channels in "
|
||||
+"this synthesizer!");
|
||||
return;
|
||||
}
|
||||
System.out.println("Got MidiChannel: "+chan);
|
||||
|
||||
|
||||
sBank = synth.getDefaultSoundbank();
|
||||
if (sBank == null) {
|
||||
System.out.println("No default sound bank!");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
insArr = sBank.getInstruments();
|
||||
for (int j = 0; j < insArr.length; j++) {
|
||||
if (insArr[j].getPatch().getBank() == val) {
|
||||
instr = insArr[j];
|
||||
synth.loadInstrument(instr);
|
||||
}
|
||||
}
|
||||
if (instr == null) {
|
||||
System.out.println("No instr. with this bank!");
|
||||
return;
|
||||
}
|
||||
|
||||
chan.controlChange(contr, val);
|
||||
|
||||
// need to respect the synthesizer's latency
|
||||
if (latency > 0) {
|
||||
try {
|
||||
Thread.sleep(latency/1000);
|
||||
} catch (InterruptedException inEx) {
|
||||
}
|
||||
}
|
||||
|
||||
if (chan.getController(contr) != val) {
|
||||
failed = true;
|
||||
System.err.println("getController() does not "
|
||||
+"return proper value: "
|
||||
+ chan.getController(contr));
|
||||
} else {
|
||||
System.out.println("getController("
|
||||
+ contr + ") returns proper value: "
|
||||
+ chan.getController(contr));
|
||||
}
|
||||
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.err.println("MidiUnavailableException was "
|
||||
+"thrown: " + mue);
|
||||
System.out.println("could not test.");
|
||||
return;
|
||||
} catch(SecurityException se) {
|
||||
se.printStackTrace();
|
||||
System.err.println("Sound access is not denied but "
|
||||
+ "SecurityException was thrown!");
|
||||
return;
|
||||
|
||||
} finally {
|
||||
if (synth != null) synth.close();
|
||||
}
|
||||
|
||||
|
||||
if (failed == true) {
|
||||
System.out.println("test failed");
|
||||
} else {
|
||||
System.out.println("OKAY");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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 javax.sound.midi.MidiDevice;
|
||||
import javax.sound.midi.MidiMessage;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6186488
|
||||
* @summary Tests that software Java Syntesizer processed
|
||||
* non-ShortMessage-derived messages
|
||||
* @run main/manual=yesno bug6186488
|
||||
*/
|
||||
public class bug6186488 {
|
||||
public static void main(String[] args) throws Exception {
|
||||
MidiDevice/*Synthesizer*/ synth = null;
|
||||
|
||||
try {
|
||||
synth = MidiSystem.getSynthesizer();
|
||||
//synth = MidiSystem.getMidiDevice(infos[0]);
|
||||
|
||||
System.out.println("Synthesizer: " + synth.getDeviceInfo());
|
||||
synth.open();
|
||||
MidiMessage msg = new GenericMidiMessage(0x90, 0x3C, 0x40);
|
||||
//ShortMessage msg = new ShortMessage();
|
||||
//msg.setMessage(0x90, 0x3C, 0x40);
|
||||
|
||||
synth.getReceiver().send(msg, 0);
|
||||
Thread.sleep(2000);
|
||||
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
throw ex;
|
||||
} finally {
|
||||
if (synth != null && synth.isOpen())
|
||||
synth.close();
|
||||
}
|
||||
System.out.print("Did you heard a note? (enter 'y' or 'n') ");
|
||||
int result = System.in.read();
|
||||
System.in.skip(1000);
|
||||
if (result == 'y' || result == 'Y')
|
||||
{
|
||||
System.out.println("Test passed sucessfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Test FAILED.");
|
||||
throw new RuntimeException("Test failed.");
|
||||
}
|
||||
}
|
||||
|
||||
private static class GenericMidiMessage extends MidiMessage {
|
||||
GenericMidiMessage(int... message) {
|
||||
super(new byte[message.length]);
|
||||
for (int i=0; i<data.length; i++) {
|
||||
data[i] = (byte)(0xFF & message[i]);
|
||||
}
|
||||
}
|
||||
|
||||
GenericMidiMessage(byte... message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
return new GenericMidiMessage((byte[])data.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5029790
|
||||
* @summary Synthesizer.getLatency returns wrong value
|
||||
*/
|
||||
public class SynthesizerGetLatency {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
Synthesizer synth = null;
|
||||
boolean failed = false;
|
||||
boolean notexec = false;
|
||||
try {
|
||||
synth = MidiSystem.getSynthesizer();
|
||||
System.out.println("Got synth: "+synth);
|
||||
synth.open();
|
||||
|
||||
int latency = (int) synth.getLatency();
|
||||
System.out.println(" -> latency: "
|
||||
+latency
|
||||
+" microseconds");
|
||||
if (latency < 5000 && latency > 0) {
|
||||
System.out.println("## This latency is VERY small, probably due to this bug.");
|
||||
System.out.println("## This causes failure of this test.");
|
||||
failed = true;
|
||||
}
|
||||
} catch (MidiUnavailableException mue) {
|
||||
System.err.println("MidiUnavailableException was "
|
||||
+"thrown: " + mue);
|
||||
System.out.println("could not test.");
|
||||
notexec = true;
|
||||
} catch(SecurityException se) {
|
||||
se.printStackTrace();
|
||||
System.err.println("Sound access is not denied but "
|
||||
+ "SecurityException was thrown!");
|
||||
notexec = true;
|
||||
} finally {
|
||||
if (synth != null) synth.close();
|
||||
}
|
||||
|
||||
|
||||
if (failed) {
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
if (notexec) {
|
||||
System.out.println("Test not failed.");
|
||||
} else {
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
218
jdk/test/javax/sound/midi/Synthesizer/bug4685396.java
Normal file
218
jdk/test/javax/sound/midi/Synthesizer/bug4685396.java
Normal file
@ -0,0 +1,218 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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 javax.sound.midi.Instrument;
|
||||
import javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.Soundbank;
|
||||
import javax.sound.midi.Synthesizer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4685396
|
||||
* @summary Tests that Synthesizer.remapInstrument works
|
||||
* @run main bug4685396
|
||||
* @key headful
|
||||
*/
|
||||
public class bug4685396 {
|
||||
|
||||
static Synthesizer synth = null;
|
||||
|
||||
public static boolean isInstrumentExist(Instrument inst, Instrument[] insts) {
|
||||
for (int i = 0; i < insts.length; i++) {
|
||||
if (inst.equals(insts[i]))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static boolean test(
|
||||
boolean reloadInstr, // reload all instruments?
|
||||
boolean unloadFrom, // unload "from" instrument?
|
||||
boolean unloadTo // unload "to" instrument?
|
||||
) throws Exception
|
||||
{
|
||||
log("Starting test: reloadInstr=" + reloadInstr
|
||||
+ ", unloadFrom=" + unloadFrom
|
||||
+ ", unloadTo=" + unloadTo
|
||||
+ "");
|
||||
|
||||
log(" creating synthesizer...");
|
||||
synth = MidiSystem.getSynthesizer();
|
||||
log(" opening synthesizer...");
|
||||
synth.open();
|
||||
|
||||
Soundbank sbank = synth.getDefaultSoundbank();
|
||||
if (sbank == null)
|
||||
throw new RuntimeException("ERROR: Could not get default soundbank");
|
||||
|
||||
if (reloadInstr) {
|
||||
synth.unloadAllInstruments(sbank);
|
||||
synth.loadAllInstruments(sbank);
|
||||
}
|
||||
|
||||
Instrument[] instrs = synth.getLoadedInstruments();
|
||||
|
||||
log(" " + instrs.length + " instruments loaded.");
|
||||
|
||||
if (instrs.length < 2)
|
||||
throw new RuntimeException("ERROR: need at least 2 loaded instruments");
|
||||
|
||||
Instrument from = instrs[0];
|
||||
Instrument to = instrs[instrs.length - 1];
|
||||
|
||||
if (unloadFrom)
|
||||
synth.unloadInstrument(from);
|
||||
if (unloadTo)
|
||||
synth.unloadInstrument(to);
|
||||
|
||||
log(" from instrument (" + (unloadFrom ? "UNLOADED" : "LOADED")
|
||||
+ "): " + from.toString());
|
||||
log(" to instrument (" + (unloadTo ? "UNLOADED" : "LOADED")
|
||||
+ "): " + to.toString());
|
||||
|
||||
boolean result = false;
|
||||
boolean excepted = false;
|
||||
try {
|
||||
result = synth.remapInstrument(from, to);
|
||||
log(" remapInstrument(from, to) returns " + result);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
excepted = true;
|
||||
log(" EXCEPTION:");
|
||||
ex.printStackTrace(System.out);
|
||||
}
|
||||
|
||||
instrs = synth.getLoadedInstruments();
|
||||
log(" " + instrs.length + " instruments remains loaded.");
|
||||
|
||||
boolean toUnloaded = !isInstrumentExist(to, instrs);
|
||||
boolean fromUnloaded = !isInstrumentExist(from, instrs);
|
||||
|
||||
log(" from instrument is " + (fromUnloaded ? "UNLOADED" : "LOADED"));
|
||||
log(" to instrument is " + (toUnloaded ? "UNLOADED" : "LOADED"));
|
||||
|
||||
boolean bOK = true;
|
||||
if (result) {
|
||||
if (unloadTo) {
|
||||
bOK = false;
|
||||
log("ERROR: unloaded to, but sucessfull remap");
|
||||
}
|
||||
if (!fromUnloaded) {
|
||||
bOK = false;
|
||||
log("ERROR: sucessfull remap, but from hasn't been unloaded");
|
||||
}
|
||||
if (toUnloaded) {
|
||||
bOK = false;
|
||||
log("ERROR: to has been unloaded!");
|
||||
}
|
||||
} else {
|
||||
if (!excepted) {
|
||||
bOK = false;
|
||||
log("ERROR: remap returns false, exception hasn't been thrown");
|
||||
}
|
||||
if (!unloadTo) {
|
||||
bOK = false;
|
||||
log("ERROR: to is loaded, but remap returns false");
|
||||
}
|
||||
if (unloadFrom != fromUnloaded) {
|
||||
bOK = false;
|
||||
log("ERROR: remap returns false, but status of from has been changed");
|
||||
}
|
||||
}
|
||||
|
||||
if (bOK) {
|
||||
log("Test result: OK\n");
|
||||
} else {
|
||||
log("Test result: FAIL\n");
|
||||
}
|
||||
|
||||
return bOK;
|
||||
}
|
||||
|
||||
static void cleanup() {
|
||||
if (synth != null) {
|
||||
synth.close();
|
||||
synth = null;
|
||||
}
|
||||
}
|
||||
|
||||
static boolean runTest(
|
||||
boolean reloadInstr, // reload all instruments?
|
||||
boolean unloadTo, // unload "to" instrument?
|
||||
boolean unloadFrom // unload "from" instrument?
|
||||
)
|
||||
{
|
||||
boolean success = false;
|
||||
try {
|
||||
success = test(reloadInstr, unloadFrom, unloadTo);
|
||||
} catch (Exception ex) {
|
||||
log("Exception: " + ex.toString());
|
||||
}
|
||||
cleanup();
|
||||
return success;
|
||||
}
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
boolean failed = false;
|
||||
if (!runTest(true, false, false))
|
||||
failed = true;
|
||||
if (!runTest(true, false, true))
|
||||
failed = true;
|
||||
if (!runTest(true, true, false))
|
||||
failed = true;
|
||||
if (!runTest(true, true, true))
|
||||
failed = true;
|
||||
|
||||
if (failed) {
|
||||
throw new RuntimeException("Test FAILED.");
|
||||
}
|
||||
log("Test sucessfully passed.");
|
||||
}
|
||||
|
||||
|
||||
// helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
//return System.nanoTime() / 1000000L;
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " (" + Thread.currentThread().getName() + ") " + s);
|
||||
}
|
||||
static void delay(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
97
jdk/test/javax/sound/midi/Track/TrackAddSameTick.java
Normal file
97
jdk/test/javax/sound/midi/Track/TrackAddSameTick.java
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 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 javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.ShortMessage;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4941944
|
||||
* @summary Track may not have a determined order for inserting events at same
|
||||
* tick time
|
||||
*/
|
||||
public class TrackAddSameTick {
|
||||
|
||||
static boolean failed = false;
|
||||
static MidiEvent[] evs = new MidiEvent[10];
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
Sequence seq = new Sequence(Sequence.PPQ, 240);
|
||||
Track t = seq.createTrack();
|
||||
|
||||
log("add 10 events in random order");
|
||||
t.add(createEvent(10, 5));
|
||||
t.add(createEvent(0, 0));
|
||||
t.add(createEvent(10, 6));
|
||||
t.add(createEvent(11, 8));
|
||||
t.add(createEvent(10, 7));
|
||||
t.add(createEvent(0, 1));
|
||||
t.add(createEvent(0, 2));
|
||||
t.add(createEvent(15, 9));
|
||||
t.add(createEvent(0, 3));
|
||||
t.add(createEvent(1, 4));
|
||||
|
||||
// now compare the events.
|
||||
// The note param will tell us the
|
||||
// the expected position
|
||||
long lastTick = 0;
|
||||
for (int i = 0; i < t.size(); i++) {
|
||||
MidiEvent ev = t.get(i);
|
||||
if (ev.getMessage() instanceof ShortMessage) {
|
||||
ShortMessage msg = (ShortMessage) ev.getMessage();
|
||||
log(""+i+": ShortMessage at tick "+ev.getTick()
|
||||
+" with expected position "+msg.getData1());
|
||||
if (ev.getTick() < lastTick) {
|
||||
log(" FAILED: last tick is larger than this event's tick!");
|
||||
failed = true;
|
||||
}
|
||||
if (i != msg.getData1()) {
|
||||
log(" FAILED: Track did not order correctly.");
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
log("Test passed.");
|
||||
}
|
||||
|
||||
public static MidiEvent createEvent(long tick, int expectedPos)
|
||||
throws Exception {
|
||||
ShortMessage msg = new ShortMessage();
|
||||
msg.setMessage(0x90, (int) expectedPos, 00);
|
||||
MidiEvent ev = new MidiEvent(msg, tick);
|
||||
return ev;
|
||||
}
|
||||
|
||||
public static void log(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
public static void log(Exception e) {
|
||||
//System.out.println(s);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
127
jdk/test/javax/sound/midi/Track/bug6416024.java
Normal file
127
jdk/test/javax/sound/midi/Track/bug6416024.java
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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 javax.sound.midi.InvalidMidiDataException;
|
||||
import javax.sound.midi.MetaMessage;
|
||||
import javax.sound.midi.MidiEvent;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.midi.Track;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6416024
|
||||
* @summary Tests that sequence correctly handle removing of EndOfTrack event
|
||||
* @run main bug6416024
|
||||
*/
|
||||
public class bug6416024 {
|
||||
|
||||
boolean test() {
|
||||
Sequence sequence = null;
|
||||
Track track = null;
|
||||
MidiEvent event = null;
|
||||
|
||||
log("creating sequence...");
|
||||
try {
|
||||
sequence = new Sequence(Sequence.PPQ, 10);
|
||||
log(" - OK: " + sequence);
|
||||
} catch(InvalidMidiDataException e ) {
|
||||
log(" - FAILED: got exception");
|
||||
e.printStackTrace(System.out);
|
||||
return false;
|
||||
}
|
||||
|
||||
log("creating track...");
|
||||
track = sequence.createTrack();
|
||||
log(" - OK: " + track);
|
||||
log("initial track size=" + track.size());
|
||||
|
||||
log("removing all track events...");
|
||||
while (track.size() > 0) {
|
||||
try {
|
||||
event = track.get(0);
|
||||
log(" ..removing event " + event);
|
||||
track.remove(event);
|
||||
log(" - OK, track size=" + track.size());
|
||||
} catch (Exception e) {
|
||||
log(" - FAILED: got exception");
|
||||
e.printStackTrace(System.out);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
MetaMessage newMsg = new MetaMessage();
|
||||
MidiEvent newEvent = new MidiEvent(newMsg, 10);
|
||||
log("adding new event...");
|
||||
try {
|
||||
if (!track.add(newEvent)) {
|
||||
log("event hasn't been added");
|
||||
return false;
|
||||
}
|
||||
log(" - OK, track size=" + track.size());
|
||||
} catch (Exception e) {
|
||||
log(" - FAILED: got exception");
|
||||
e.printStackTrace(System.out);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
bug6416024 This = new bug6416024();
|
||||
if (This.test()) {
|
||||
log("Test passed sucessfully.");
|
||||
} else {
|
||||
log("Test FAILED!");
|
||||
delay(1000);
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
}
|
||||
|
||||
// helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
//return System.nanoTime() / 1000000L;
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " (" + Thread.currentThread().getName() + ") " + s);
|
||||
}
|
||||
static void delay(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
118
jdk/test/javax/sound/midi/Transmitter/bug6415669.java
Normal file
118
jdk/test/javax/sound/midi/Transmitter/bug6415669.java
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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 javax.sound.midi.MidiSystem;
|
||||
import javax.sound.midi.MidiUnavailableException;
|
||||
import javax.sound.midi.Transmitter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6415669
|
||||
* @summary Tests that terminating thread which got transmitter doesn't cause
|
||||
* JVM crash (windows)
|
||||
* @run main bug6415669
|
||||
*/
|
||||
public class bug6415669 {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
String osStr = System.getProperty("os.name");
|
||||
boolean isWin = osStr.toLowerCase().startsWith("windows");
|
||||
log("OS: " + osStr);
|
||||
log("Arch: " + System.getProperty("os.arch"));
|
||||
if (!isWin) {
|
||||
log("The test is for Windows only");
|
||||
return;
|
||||
}
|
||||
|
||||
bug6415669 This = new bug6415669();
|
||||
if (This.test()) {
|
||||
log("Test sucessfully passed.");
|
||||
} else {
|
||||
log("Test FAILED!");
|
||||
throw new RuntimeException("Test FAILED!");
|
||||
}
|
||||
}
|
||||
|
||||
volatile Transmitter transmitter = null;
|
||||
Thread openThread = null;
|
||||
boolean test() {
|
||||
openThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
log("openThread: getting transmitter...");
|
||||
transmitter = MidiSystem.getTransmitter();
|
||||
log("openThread: - OK: " + transmitter);
|
||||
} catch (MidiUnavailableException ex) {
|
||||
log("openThread: - Exception: ");
|
||||
ex.printStackTrace(System.out);
|
||||
log("openThread: skipping...");
|
||||
}
|
||||
log("openThread: exiting...");
|
||||
}
|
||||
});
|
||||
log("starting openThread...");
|
||||
openThread.start();
|
||||
|
||||
while (openThread.isAlive())
|
||||
delay(500);
|
||||
// make additional delay
|
||||
delay(500);
|
||||
|
||||
if (transmitter == null) {
|
||||
return true; // midi is not available, just ignore
|
||||
}
|
||||
|
||||
log("closing transmitter");
|
||||
transmitter.close();
|
||||
log(" - OK");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
//return System.nanoTime() / 1000000L;
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " (" + Thread.currentThread().getName() + ") " + s);
|
||||
}
|
||||
static void delay(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,235 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4672864
|
||||
* @summary AudioFileFormat.toString() throws unexpected NullPointerException
|
||||
*/
|
||||
public class AudioFileFormatToString {
|
||||
|
||||
static final int STATUS_PASSED = 0;
|
||||
static final int STATUS_FAILED = 2;
|
||||
static final int STATUS_TEMP = 95;
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
int testExitStatus = run(argv, System.out);
|
||||
if (testExitStatus != STATUS_PASSED) {
|
||||
throw new Exception("Test FAILED " + testExitStatus);
|
||||
}
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
public static int run(String argv[], java.io.PrintStream out) {
|
||||
int testResult = STATUS_PASSED;
|
||||
|
||||
out.println("\n==> Test for AudioFileFormat class:");
|
||||
|
||||
AudioFormat testAudioFormat =
|
||||
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, // AudioFormat.Encoding
|
||||
(float) 44100.0, // float SampleRate
|
||||
(int) 8, // int sampleSizeInBits
|
||||
(int) 2, // int channels
|
||||
(int) 2, // int frameSize
|
||||
(float) 110.0, // float frameRate
|
||||
true // boolean bigEndian
|
||||
);
|
||||
AudioFormat nullAudioFormat = null;
|
||||
|
||||
AudioFileFormat.Type testAudioFileFormatType = AudioFileFormat.Type.WAVE;
|
||||
AudioFileFormat.Type nullAudioFileFormatType = null;
|
||||
|
||||
AudioFileFormat testedAudioFileFormat = null;
|
||||
out.println("\n>> public AudioFileFormat constructor for AudioFileFormat.Type = null: ");
|
||||
try {
|
||||
testedAudioFileFormat =
|
||||
new AudioFileFormat(nullAudioFileFormatType, // AudioFileFormat.Type
|
||||
testAudioFormat, // AudioFormat
|
||||
(int) 1024 // int frameLength
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedAudioFileFormat.getType():");
|
||||
try {
|
||||
AudioFileFormat.Type producedType = testedAudioFileFormat.getType();
|
||||
out.println("> PASSED: producedType = " + producedType);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedAudioFileFormat.toString():");
|
||||
try {
|
||||
String producedString = testedAudioFileFormat.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
out.println("\n>> public AudioFileFormat constructor for AudioFormat = null: ");
|
||||
try {
|
||||
testedAudioFileFormat =
|
||||
new AudioFileFormat(testAudioFileFormatType, // AudioFileFormat.Type
|
||||
nullAudioFormat, // AudioFormat
|
||||
(int) 1024 // int frameLength
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedAudioFileFormat.getFormat():");
|
||||
try {
|
||||
AudioFormat producedFormat = testedAudioFileFormat.getFormat();
|
||||
out.println("> PASSED: producedFormat = " + producedFormat);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedAudioFileFormat.toString():");
|
||||
try {
|
||||
String producedString = testedAudioFileFormat.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
out.println("\n>> protected AudioFileFormat constructor for AudioFileFormat.Type = null: ");
|
||||
try {
|
||||
testedAudioFileFormat =
|
||||
new TestAudioFileFormat(nullAudioFileFormatType, // AudioFileFormat.Type
|
||||
(int) 1024, // byteLength
|
||||
testAudioFormat, // AudioFormat
|
||||
(int) 1024 // int frameLength
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedAudioFileFormat.getType():");
|
||||
try {
|
||||
AudioFileFormat.Type producedType = testedAudioFileFormat.getType();
|
||||
out.println("> PASSED: producedType = " + producedType);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedAudioFileFormat.toString():");
|
||||
try {
|
||||
String producedString = testedAudioFileFormat.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
out.println("\n>> protected AudioFileFormat constructor for AudioFormat = null: ");
|
||||
try {
|
||||
testedAudioFileFormat =
|
||||
new TestAudioFileFormat(testAudioFileFormatType, // AudioFileFormat.Type
|
||||
(int) 1024, // byteLength
|
||||
nullAudioFormat, // AudioFormat
|
||||
(int) 1024 // int frameLength
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedAudioFileFormat.getFormat():");
|
||||
try {
|
||||
AudioFormat producedFormat = testedAudioFileFormat.getFormat();
|
||||
out.println("> PASSED: producedFormat = " + producedFormat);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedAudioFileFormat.toString():");
|
||||
try {
|
||||
String producedString = testedAudioFileFormat.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
if (testResult == STATUS_FAILED) {
|
||||
out.println("\n==> test FAILED!");
|
||||
} else {
|
||||
out.println("\n==> test PASSED!");
|
||||
}
|
||||
return testResult;
|
||||
}
|
||||
}
|
||||
|
||||
class TestAudioFileFormat extends AudioFileFormat {
|
||||
|
||||
TestAudioFileFormat(AudioFileFormat.Type type, int byteLength,
|
||||
AudioFormat format, int frameLength) {
|
||||
super(type, byteLength, format, frameLength);
|
||||
}
|
||||
}
|
||||
144
jdk/test/javax/sound/sampled/AudioFileFormat/Properties.java
Normal file
144
jdk/test/javax/sound/sampled/AudioFileFormat/Properties.java
Normal file
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* 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.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.sound.midi.MidiFileFormat;
|
||||
import javax.sound.midi.Sequence;
|
||||
import javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4666845
|
||||
* @summary RFE: Add properties to AudioFileFormat and MidiFileFormat
|
||||
*/
|
||||
public class Properties {
|
||||
|
||||
static boolean g_failed = false;
|
||||
|
||||
// all of p1 need to be in p2
|
||||
static boolean compare(Map p1, Map p2) {
|
||||
boolean failed = false;
|
||||
for(String key: (Set<String>) p1.keySet()) {
|
||||
out(" testing key: "+key);
|
||||
if (!p2.containsKey(key)) {
|
||||
out(" missing property: '"+key+"'. Failed");
|
||||
failed = true;
|
||||
}
|
||||
Object v1 = p1.get(key);
|
||||
Object v2 = p2.get(key);
|
||||
if (((v1 == null) && (v2 != null))
|
||||
|| ((v1 != null) && (v2 == null))
|
||||
|| !(v1.equals(v2))) {
|
||||
out(" property '"+key+"' is different: "
|
||||
+"expected='"+v1+"' "
|
||||
+"actual='"+v2+"'. Failed");
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
// test if we can modify p2
|
||||
try {
|
||||
int oldSize = p2.size();
|
||||
p2.clear();
|
||||
if (oldSize > 0 && p2.size() == 0) {
|
||||
out(" could clear the properties! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// correct
|
||||
}
|
||||
return failed;
|
||||
}
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
// don't need to catch exceptions: any exception is a
|
||||
// failure of this test
|
||||
|
||||
Map<String, Object> p = new HashMap<String,Object>();
|
||||
p.put("author", "Florian");
|
||||
p.put("duration", new Long(1000));
|
||||
p.put("MyProp", "test");
|
||||
|
||||
out("Testing AudioFileFormat properties:");
|
||||
// create an AudioFileFormat with properties
|
||||
AudioFormat format = new AudioFormat( 44100.0f, 16, 2, true, false);
|
||||
AudioFileFormat aff =
|
||||
new AudioFileFormat(AudioFileFormat.Type.WAVE,
|
||||
format, 1000, p);
|
||||
// test that it has the properties
|
||||
boolean failed = compare(p, aff.properties());
|
||||
// test getProperty()
|
||||
Object o = aff.getProperty("author");
|
||||
if (o == null || !o.equals("Florian")) {
|
||||
out(" getProperty did not report an existing property!");
|
||||
failed = true;
|
||||
}
|
||||
o = aff.getProperty("does not exist");
|
||||
if (o != null) {
|
||||
out(" getProperty returned something for a non-existing property!");
|
||||
failed = true;
|
||||
}
|
||||
if (!failed) {
|
||||
out(" OK");
|
||||
} else {
|
||||
g_failed = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
out("Testing MidiFileFormat properties:");
|
||||
// create a MidiFileFormat with properties
|
||||
MidiFileFormat mff =
|
||||
new MidiFileFormat(0, Sequence.PPQ, 240,
|
||||
1000, 100, p);
|
||||
// test that it has the properties
|
||||
failed = compare(p, mff.properties());
|
||||
// test getProperty()
|
||||
o = mff.getProperty("author");
|
||||
if (o == null || !o.equals("Florian")) {
|
||||
out(" getProperty did not report an existing property!");
|
||||
failed = true;
|
||||
}
|
||||
o = mff.getProperty("does not exist");
|
||||
if (o != null) {
|
||||
out(" getProperty returned something for a non-existing property!");
|
||||
failed = true;
|
||||
}
|
||||
if (!failed) {
|
||||
out(" OK");
|
||||
} else {
|
||||
g_failed = true;
|
||||
}
|
||||
|
||||
|
||||
if (g_failed) throw new Exception("Test FAILED!");
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
static void out(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
44
jdk/test/javax/sound/sampled/AudioFileFormat/TypeEquals.java
Normal file
44
jdk/test/javax/sound/sampled/AudioFileFormat/TypeEquals.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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 javax.sound.sampled.AudioFileFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4925483
|
||||
* @summary RFE: equals() should compare string in Encoding and Type
|
||||
*/
|
||||
public class TypeEquals {
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
// first test that we can create our own type
|
||||
// (the constructor was made public)
|
||||
AudioFileFormat.Type myType = new AudioFileFormat.Type("WAVE", "wav");
|
||||
|
||||
// then check if this one equals this new one
|
||||
// with the static instance in AudioFileFormat.Type
|
||||
if (!myType.equals(AudioFileFormat.Type.WAVE)) {
|
||||
throw new Exception("Types do not equal!");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4754759
|
||||
* @summary AudioFormat does not handle uncommon bit sizes correctly
|
||||
*/
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
|
||||
public class AudioFormatBitSize {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int bits = 18;
|
||||
AudioFormat format = new AudioFormat(44100.0f, bits, 1, true, false);
|
||||
if (format.getFrameSize() * 8 < bits) {
|
||||
System.out.println("bits = "+bits+" do not fit into a "+format.getFrameSize()+" bytes sample!");
|
||||
throw new Exception("Test failed");
|
||||
} else
|
||||
System.out.println("bits = "+bits+" fit OK into a "+format.getFrameSize()+" bytes sample!");
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
}
|
||||
44
jdk/test/javax/sound/sampled/AudioFormat/EncodingEquals.java
Normal file
44
jdk/test/javax/sound/sampled/AudioFormat/EncodingEquals.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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 javax.sound.sampled.AudioFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4925483
|
||||
* @summary RFE: equals() should compare string in Encoding and Type
|
||||
*/
|
||||
public class EncodingEquals {
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
// first test that we can create our own encoding
|
||||
// (the constructor was made public)
|
||||
AudioFormat.Encoding myType = new AudioFormat.Encoding("PCM_SIGNED");
|
||||
|
||||
// then check if this one equals this new one
|
||||
// with the static instance in AudioFormat.Encoding
|
||||
if (!myType.equals(AudioFormat.Encoding.PCM_SIGNED)) {
|
||||
throw new Exception("Encodings do not equal!");
|
||||
}
|
||||
}
|
||||
}
|
||||
115
jdk/test/javax/sound/sampled/AudioFormat/Properties.java
Normal file
115
jdk/test/javax/sound/sampled/AudioFormat/Properties.java
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* 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.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4925767
|
||||
* @summary RFE: Add Properties to AudioFormat
|
||||
*/
|
||||
public class Properties {
|
||||
|
||||
static boolean g_failed = false;
|
||||
|
||||
// all of p1 need to be in p2
|
||||
static boolean compare(Map p1, Map p2) {
|
||||
boolean failed = false;
|
||||
for(String key: (Set<String>) p1.keySet()) {
|
||||
out(" testing key: "+key);
|
||||
if (!p2.containsKey(key)) {
|
||||
out(" missing property: '"+key+"'. Failed");
|
||||
failed = true;
|
||||
}
|
||||
Object v1 = p1.get(key);
|
||||
Object v2 = p2.get(key);
|
||||
if (((v1 == null) && (v2 != null))
|
||||
|| ((v1 != null) && (v2 == null))
|
||||
|| !(v1.equals(v2))) {
|
||||
out(" property '"+key+"' is different: "
|
||||
+"expected='"+v1+"' "
|
||||
+"actual='"+v2+"'. Failed");
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
// test if we can modify p2
|
||||
try {
|
||||
int oldSize = p2.size();
|
||||
p2.clear();
|
||||
if (oldSize > 0 && p2.size() == 0) {
|
||||
out(" could clear the properties! Failed.");
|
||||
failed = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// correct
|
||||
}
|
||||
return failed;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
// don't need to catch exceptions: any exception is a
|
||||
// failure of this test
|
||||
|
||||
Map<String, Object> p = new HashMap<String,Object>();
|
||||
p.put("bitrate", new Integer(128));
|
||||
p.put("quality", new Integer(10));
|
||||
p.put("MyProp", "test");
|
||||
|
||||
out("Testing AudioFileFormat properties:");
|
||||
// create an AudioFileFormat with properties
|
||||
AudioFormat format =
|
||||
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
|
||||
44100.0f, 16, 2, 4, 44100.0f, false, p);
|
||||
// test that it has the properties
|
||||
boolean failed = compare(p, format.properties());
|
||||
// test getProperty()
|
||||
Object o = format.getProperty("MyProp");
|
||||
if (o == null || !o.equals("test")) {
|
||||
out(" getProperty did not report an existing property!");
|
||||
failed = true;
|
||||
}
|
||||
o = format.getProperty("does not exist");
|
||||
if (o != null) {
|
||||
out(" getProperty returned something for a non-existing property!");
|
||||
failed = true;
|
||||
}
|
||||
if (!failed) {
|
||||
out(" OK");
|
||||
} else {
|
||||
g_failed = true;
|
||||
}
|
||||
|
||||
if (g_failed) throw new Exception("Test FAILED!");
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
static void out(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,237 @@
|
||||
/*
|
||||
* 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.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4948663
|
||||
* @summary AudioInputStream does not use the original stream passed to its constructor
|
||||
*/
|
||||
public class AISReadFraction {
|
||||
|
||||
static int failed = 0;
|
||||
static byte[] testData = new byte[256];
|
||||
static boolean DEBUG = false;
|
||||
|
||||
static AudioFormat[] formats = {
|
||||
new AudioFormat(44100.0f, 8, 1, false, false), // frameSize = 1
|
||||
new AudioFormat(44100.0f, 8, 2, false, false), // frameSize = 2
|
||||
new AudioFormat(44100.0f, 16, 1, true, false), // frameSize = 2
|
||||
new AudioFormat(44100.0f, 24, 1, true, false), // frameSize = 3
|
||||
new AudioFormat(44100.0f, 16, 2, true, false), // frameSize = 4
|
||||
new AudioFormat(44100.0f, 8, 5, false, false), // frameSize = 5
|
||||
new AudioFormat(44100.0f, 16, 3, true, false), // frameSize = 6
|
||||
new AudioFormat(44100.0f, 8, 7, false, false), // frameSize = 7
|
||||
new AudioFormat(44100.0f, 32, 2, true, false) // frameSize = 8
|
||||
};
|
||||
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
for (int i = 0; i<testData.length; i++) {
|
||||
testData[i] = (byte) (i % 128);
|
||||
}
|
||||
|
||||
for (int f = 0; f < formats.length; f++) {
|
||||
// first test without marking
|
||||
doTest(formats[f], false);
|
||||
// then with marking
|
||||
doTest(formats[f], true);
|
||||
}
|
||||
|
||||
out(""+failed+" failures.");
|
||||
if (failed>0) throw new Exception("Test FAILED!");
|
||||
out("Test passed.");
|
||||
}
|
||||
|
||||
static void doTest(AudioFormat format, boolean doMark) {
|
||||
out("Test with"+(doMark?"":"out")+" marking. Audio format: "
|
||||
+"sampleSize="+format.getSampleSizeInBits()+"bits "
|
||||
+"channels="+format.getChannels()+" "
|
||||
+"frameSize="+format.getFrameSize()+"byte(s)");
|
||||
int maxReadBytes = (testData.length / format.getFrameSize()) * format.getFrameSize();
|
||||
InputStream is = new FractionalIS(testData, doMark);
|
||||
AudioInputStream ais = new AudioInputStream(is, format, AudioSystem.NOT_SPECIFIED);
|
||||
// first some general tests
|
||||
if (ais.markSupported() && !doMark) {
|
||||
out(" #AIS reports markSupported, but underlying stream cannot! FAILED");
|
||||
failed ++;
|
||||
}
|
||||
if (!ais.markSupported() && doMark) {
|
||||
out(" #AIS does not report markSupported, but underlying stream can mark! FAILED");
|
||||
failed++;
|
||||
}
|
||||
byte[] data = new byte[1000];
|
||||
int frameSize = format.getFrameSize();
|
||||
int counter = 5;
|
||||
int totalReadBytes = 0;
|
||||
boolean hasRead0 = false;
|
||||
boolean hasMarked = false;
|
||||
boolean hasReset = false;
|
||||
int markPos = 0;
|
||||
while (true) {
|
||||
try {
|
||||
int toBeRead = frameSize * counter;
|
||||
counter += 3;
|
||||
if (counter > 14) {
|
||||
counter -= 14;
|
||||
}
|
||||
int read = ais.read(data, 0, toBeRead);
|
||||
if (DEBUG) out(" -> ais.read(data, 0, "+toBeRead+"): "+read+" (frameSize="+frameSize+")");
|
||||
if ((totalReadBytes == maxReadBytes) && (read != -1)
|
||||
&& ((read > 0) || hasRead0)) {
|
||||
if (read == 0) {
|
||||
out(" #stream was read to the end ("+maxReadBytes+"), but ais.read returned repeatedly 0 bytes. FAILED");
|
||||
} else {
|
||||
out(" #stream was read to the end ("+maxReadBytes+"), but ais.read returned "+read+" bytes... FAILED");
|
||||
}
|
||||
failed++;
|
||||
break;
|
||||
}
|
||||
if (read > 0) {
|
||||
verifyReadBytes(data, totalReadBytes, read);
|
||||
if ((read % frameSize) != 0) {
|
||||
out(" #Read non-integral number of frames: "+read+" bytes, frameSize="+frameSize+" bytes. FAILED");
|
||||
failed++;
|
||||
}
|
||||
totalReadBytes += read;
|
||||
hasRead0 = false;
|
||||
}
|
||||
else if (read == 0) {
|
||||
//out(" wanted to read "+toBeRead+" at position "+totalReadBytes+", but got 0 bytes!");
|
||||
if (hasRead0) {
|
||||
out(" read 0 twice in a row! FAILED");
|
||||
failed++;
|
||||
break;
|
||||
}
|
||||
hasRead0 = true;
|
||||
} else {
|
||||
// end of stream
|
||||
out(" End of stream reached. Total read bytes: "+totalReadBytes);
|
||||
if (totalReadBytes != maxReadBytes) {
|
||||
out(" #Failed: should have read "+maxReadBytes+" bytes! FAILED.");
|
||||
failed++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// test marking
|
||||
if (totalReadBytes > 50 && !hasMarked && !hasReset && doMark) {
|
||||
out(" Marking at position "+totalReadBytes);
|
||||
hasMarked = true;
|
||||
ais.mark(0);
|
||||
markPos = totalReadBytes;
|
||||
}
|
||||
if (totalReadBytes > 100 && hasMarked && !hasReset && doMark) {
|
||||
out(" Resetting at position "+totalReadBytes+" back to "+markPos);
|
||||
hasReset = true;
|
||||
ais.reset();
|
||||
totalReadBytes = markPos;
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
out(" #caught unexpected exception:");
|
||||
e.printStackTrace();
|
||||
failed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void verifyReadBytes(byte[] data, int offset, int len) {
|
||||
int firstWrongByte = -1;
|
||||
for (int i = 0; i < len; i++) {
|
||||
int expected = ((offset + i) % 128);
|
||||
if (data[i] != expected) {
|
||||
out(" read data is not correct! offset="+offset+" expected="+expected+" actual="+data[i]);
|
||||
failed++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void out(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
|
||||
static class FractionalIS extends InputStream {
|
||||
byte[] data;
|
||||
int pos = 0;
|
||||
boolean canMark;
|
||||
// a counter how many bytes are not returned
|
||||
int missingBytes = 0;
|
||||
int markPos = -1;
|
||||
|
||||
FractionalIS(byte[] data, boolean canMark) {
|
||||
this.data = data;
|
||||
this.canMark = canMark;
|
||||
}
|
||||
|
||||
public int read() throws IOException {
|
||||
if (pos >= data.length) {
|
||||
return -1;
|
||||
}
|
||||
return data[pos++] & 0xFF;
|
||||
}
|
||||
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
if (++missingBytes > 5) {
|
||||
missingBytes = 0;
|
||||
}
|
||||
int reducedLen = len - missingBytes;
|
||||
if (reducedLen <= 0) reducedLen = 1;
|
||||
if (DEBUG) out(" FIS.read(data, 0, "+len+"): reducing len to "+reducedLen+" bytes.");
|
||||
int ret = super.read(b, off, reducedLen);
|
||||
if (DEBUG) out(" returning "+ret+" bytes. Now at pos="+pos);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void mark(int readlimit) {
|
||||
markPos = pos;
|
||||
if (DEBUG) out(" FIS.mark(): marking at "+pos);
|
||||
}
|
||||
|
||||
public void reset() throws IOException {
|
||||
if (!canMark) {
|
||||
throw new IOException("reset not supported!");
|
||||
}
|
||||
if (markPos == -1) {
|
||||
throw new IOException("Mark position not set!");
|
||||
}
|
||||
pos = markPos;
|
||||
if (DEBUG) out(" FIS.reset(): now back at "+pos);
|
||||
}
|
||||
|
||||
public boolean markSupported() {
|
||||
return canMark;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6188860
|
||||
* @summary Tests that method AudioInputStream.read() returns right value
|
||||
*/
|
||||
public class bug6188860 {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
byte[] testData = new byte[256];
|
||||
|
||||
// fill data
|
||||
for (int i = 0; i < testData.length; i++)
|
||||
testData[i] = (byte) (i % 128);
|
||||
|
||||
InputStream streamSrc = new TestInputStream(testData);
|
||||
AudioFormat format = new AudioFormat(44100.0f, 8, 1, false, false); // frameSize = 1
|
||||
AudioInputStream streamAudio = new AudioInputStream(streamSrc, format, AudioSystem.NOT_SPECIFIED);
|
||||
|
||||
int nErrCount = 0;
|
||||
int nTotal = 0;
|
||||
|
||||
int dataSrc, dataRead;
|
||||
while (nTotal < (testData.length - 1)) {
|
||||
dataRead = streamAudio.read();
|
||||
if (dataRead < 0) {
|
||||
System.out.println("end of stream");
|
||||
break;
|
||||
}
|
||||
|
||||
dataSrc = testData[nTotal];
|
||||
|
||||
if (dataRead != dataSrc) {
|
||||
System.out.println("" + nTotal + " - mismatch :" + dataRead + " <> " + dataSrc);
|
||||
nErrCount++;
|
||||
}
|
||||
nTotal++;
|
||||
}
|
||||
|
||||
System.out.println("Total: " + nTotal + "; Mismatches: " + nErrCount);
|
||||
|
||||
if (nErrCount > 0) {
|
||||
throw new RuntimeException("test failed: " + nErrCount + " mismatches of total " + nTotal + " bytes.");
|
||||
}
|
||||
System.out.println("Test sucessfully passed.");
|
||||
}
|
||||
|
||||
|
||||
static class TestInputStream extends InputStream {
|
||||
byte[] data;
|
||||
int pos = 0;
|
||||
|
||||
TestInputStream(byte[] data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public int read() throws IOException {
|
||||
if (pos >= data.length) {
|
||||
return -1;
|
||||
}
|
||||
return data[pos++] & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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 javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4883060
|
||||
* @summary AudioSystem.getAudioFileTypes returns duplicates
|
||||
*/
|
||||
public class AudioFileTypeUniqueness {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean foundDuplicates = false;
|
||||
AudioFileFormat.Type[] aTypes = AudioSystem.getAudioFileTypes();
|
||||
for (int i = 0; i < aTypes.length; i++)
|
||||
{
|
||||
for (int j = 0; j < aTypes.length; j++)
|
||||
{
|
||||
if (aTypes[i].equals(aTypes[j]) && i != j) {
|
||||
foundDuplicates = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (foundDuplicates) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 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 javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4303037
|
||||
* @summary Shows the existing audio file types of AudioSystem and checks
|
||||
* whether there are some at all
|
||||
*/
|
||||
public class ShowAudioFileTypes {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
AudioFileFormat.Type[] aTypes = AudioSystem.getAudioFileTypes();
|
||||
System.out.println(aTypes.length+" supported target types:");
|
||||
for (int i = 0; i < aTypes.length; i++)
|
||||
{
|
||||
System.out.println(" "+(i+1)+". " + aTypes[i]+" with ext. '"+aTypes[i].getExtension()+"'");
|
||||
}
|
||||
if (aTypes.length<3) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
System.out.println("Test passed");
|
||||
}
|
||||
}
|
||||
}
|
||||
198
jdk/test/javax/sound/sampled/AudioSystem/DefaultMixers.java
Normal file
198
jdk/test/javax/sound/sampled/AudioSystem/DefaultMixers.java
Normal file
@ -0,0 +1,198 @@
|
||||
/*
|
||||
* 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
|
||||
* @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);
|
||||
}
|
||||
}
|
||||
164
jdk/test/javax/sound/sampled/AudioSystem/DefaultProperties.java
Normal file
164
jdk/test/javax/sound/sampled/AudioSystem/DefaultProperties.java
Normal file
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* 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.io.File;
|
||||
|
||||
import com.sun.media.sound.JDK13Services;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4776511
|
||||
* @build DefaultProperties
|
||||
* @run main/othervm DefaultProperties
|
||||
* @summary RFE: Setting the default MixerProvider. Test the retrieving and
|
||||
* parsing of properties.
|
||||
* @modules java.desktop/com.sun.media.sound
|
||||
*/
|
||||
public class DefaultProperties {
|
||||
|
||||
private static final Class[] lineTypeClasses = {
|
||||
javax.sound.sampled.SourceDataLine.class,
|
||||
javax.sound.sampled.TargetDataLine.class,
|
||||
javax.sound.sampled.Clip.class,
|
||||
javax.sound.sampled.Port.class,
|
||||
};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean allOk = true;
|
||||
File file = new File(System.getProperty("test.src", "."), "testdata");
|
||||
System.setProperty("java.home", file.getCanonicalPath());
|
||||
|
||||
for (int i = 0; i < lineTypeClasses.length; i++) {
|
||||
Class cls = lineTypeClasses[i];
|
||||
String propertyName = cls.getName();
|
||||
String result;
|
||||
String provClassName;
|
||||
String instanceName;
|
||||
|
||||
// properties file, both provider class name and instance name
|
||||
provClassName = "xyz";
|
||||
instanceName = "123";
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + " failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, provider class name only, no trailing hash
|
||||
provClassName = "abc";
|
||||
System.setProperty(propertyName, provClassName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, provider class name only, trailing hash
|
||||
provClassName = "def";
|
||||
System.setProperty(propertyName, provClassName + "#");
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, instance name only
|
||||
instanceName = "ghi";
|
||||
System.setProperty(propertyName, "#" + instanceName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: provider class should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + " failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, both provider class and instance name
|
||||
provClassName = "jkl";
|
||||
instanceName = "mno";
|
||||
System.setProperty(propertyName, provClassName + "#" + instanceName);
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (! provClassName.equals(result)) {
|
||||
out("type " + cls + " failed: provider class should be '" +
|
||||
provClassName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (! instanceName.equals(result)) {
|
||||
out("type " + cls + " failed: instance name should be '" +
|
||||
instanceName + "' but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
|
||||
// system property, empty
|
||||
System.setProperty(propertyName, "");
|
||||
result = JDK13Services.getDefaultProviderClassName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: provider class should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
result = JDK13Services.getDefaultInstanceName(cls);
|
||||
if (result != null) {
|
||||
out("type " + cls + " failed: instance name should be " +
|
||||
"null but is '" + result + "'!");
|
||||
allOk = false;
|
||||
}
|
||||
}
|
||||
if (! allOk) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
out("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* 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 com.sun.media.sound.JDK13Services;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4776511
|
||||
* @summary RFE: Setting the default MixerProvider. Test the cacheing of
|
||||
* providers.
|
||||
* @modules java.desktop/com.sun.media.sound
|
||||
*/
|
||||
public class ProviderCacheing {
|
||||
|
||||
private static final Class[] providerClasses = {
|
||||
javax.sound.sampled.spi.AudioFileReader.class,
|
||||
javax.sound.sampled.spi.AudioFileWriter.class,
|
||||
javax.sound.sampled.spi.FormatConversionProvider.class,
|
||||
javax.sound.sampled.spi.MixerProvider.class,
|
||||
};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean allCached = true;
|
||||
for (int i = 0; i < providerClasses.length; i++) {
|
||||
List list0 = JDK13Services.getProviders(providerClasses[i]);
|
||||
List list1 = JDK13Services.getProviders(providerClasses[i]);
|
||||
if (list0 == list1) {
|
||||
out("Providers should not be cached for " + providerClasses[i]);
|
||||
allCached = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! allCached) {
|
||||
throw new Exception("Test failed");
|
||||
} else {
|
||||
out("Test passed");
|
||||
}
|
||||
}
|
||||
|
||||
private static void out(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
27
jdk/test/javax/sound/sampled/AudioSystem/testdata/conf/sound.properties
vendored
Normal file
27
jdk/test/javax/sound/sampled/AudioSystem/testdata/conf/sound.properties
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
javax.sound.sampled.SourceDataLine=xyz#123
|
||||
javax.sound.sampled.TargetDataLine=xyz#123
|
||||
javax.sound.sampled.Clip=xyz#123
|
||||
javax.sound.sampled.Port=xyz#123
|
||||
163
jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java
Normal file
163
jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4946913
|
||||
* @summary DirectClip doesn't kill the thread correctly, sometimes
|
||||
* @run main/othervm ClipCloseLoss
|
||||
* @key headful
|
||||
*/
|
||||
public class ClipCloseLoss {
|
||||
static int frameCount = 441000; // lets say 10 seconds
|
||||
static AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false);
|
||||
static ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(new byte[frameCount * format.getFrameSize()]);
|
||||
|
||||
static int success = 0;
|
||||
static boolean failed = false;
|
||||
|
||||
public static void run(Mixer m) {
|
||||
Clip clip = null;
|
||||
try {
|
||||
if (m == null) {
|
||||
out("Using default mixer");
|
||||
clip = (Clip) AudioSystem.getClip();
|
||||
} else {
|
||||
out("Using mixer: "+m);
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format, AudioSystem.NOT_SPECIFIED);
|
||||
clip = (Clip) m.getLine(info);
|
||||
}
|
||||
out(" got clip: "+clip);
|
||||
if (!clip.getClass().toString().contains("Direct")) {
|
||||
out(" no direct audio clip -> do not test.");
|
||||
return;
|
||||
}
|
||||
|
||||
out(" open");
|
||||
bais.reset();
|
||||
clip.open(new AudioInputStream(bais, format, frameCount));
|
||||
|
||||
out(" clip.close()");
|
||||
//long t = System.currentTimeMillis();
|
||||
clip.close();
|
||||
//if (System.currentTimeMillis() - t > 1950) {
|
||||
// out(" clip.close needed more than 2 seconds! Causes failure of this test.");
|
||||
// failed = true;
|
||||
//}
|
||||
out(" clip closed");
|
||||
success++;
|
||||
} catch (LineUnavailableException luae) {
|
||||
// line not available, test not failed
|
||||
System.err.println(luae);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// line not available, test not failed
|
||||
System.err.println(iae);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static int getClipThreadCount() {
|
||||
int ret = 0;
|
||||
ThreadGroup tg = Thread.currentThread().getThreadGroup();
|
||||
while (tg.getParent() != null) { tg = tg.getParent(); }
|
||||
Thread[] threads = new Thread[500];
|
||||
int count = tg.enumerate(threads, true);
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (threads[i].getName().contains("Direct")
|
||||
&& threads[i].getName().contains("Clip")) {
|
||||
out("Found Direct Clip thread object: "+threads[i]);
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (isSoundcardInstalled()) {
|
||||
bais.mark(0);
|
||||
run(null);
|
||||
Mixer.Info[] infos = AudioSystem.getMixerInfo();
|
||||
for (int i = 0; i<infos.length; i++) {
|
||||
try {
|
||||
Mixer m = AudioSystem.getMixer(infos[i]);
|
||||
run(m);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
out("Waiting 1 second to dispose of all threads");
|
||||
Thread.sleep(1000);
|
||||
if (getClipThreadCount() > 0) {
|
||||
out("Unused clip threads exist! Causes test failure");
|
||||
failed = true;
|
||||
}
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
if (success > 0) {
|
||||
out("Test passed.");
|
||||
} else {
|
||||
System.err.println("Test could not execute: please install an audio device");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void out(String s) {
|
||||
/*long t = System.nanoTime() / 1000000l;
|
||||
String ts = ""+(t % 1000);
|
||||
while (ts.length() < 3) ts = "0"+ts;
|
||||
System.out.println(""+(t/1000)+":"+ts+" "+s);
|
||||
System.out.flush();*/
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
226
jdk/test/javax/sound/sampled/Clip/ClipFlushCrash.java
Normal file
226
jdk/test/javax/sound/sampled/Clip/ClipFlushCrash.java
Normal file
@ -0,0 +1,226 @@
|
||||
/*
|
||||
* 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4946945
|
||||
* @summary Crash in javasound while running TicTacToe demo applet tiger b26
|
||||
*/
|
||||
public class ClipFlushCrash {
|
||||
static int frameCount = 441000; // lets say 10 seconds
|
||||
static AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false);
|
||||
static ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(new byte[frameCount * format.getFrameSize()]);
|
||||
|
||||
static int success = 0;
|
||||
|
||||
public static void run(Mixer m) {
|
||||
Clip clip = null;
|
||||
try {
|
||||
if (m == null) {
|
||||
out("Using default mixer");
|
||||
clip = (Clip) AudioSystem.getClip();
|
||||
} else {
|
||||
out("Using mixer: "+m);
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format, AudioSystem.NOT_SPECIFIED);
|
||||
clip = (Clip) m.getLine(info);
|
||||
}
|
||||
out(" got clip: "+clip);
|
||||
if (!clip.getClass().toString().contains("Direct")) {
|
||||
out(" no direct audio clip -> do not test.");
|
||||
return;
|
||||
}
|
||||
|
||||
out(" open");
|
||||
bais.reset();
|
||||
clip.open(new AudioInputStream(bais, format, frameCount));
|
||||
|
||||
AT at1 = new AT(clip, "flush thread", 123) {
|
||||
public void doAction() throws Exception {
|
||||
log("flush");
|
||||
clip.flush();
|
||||
}
|
||||
};
|
||||
AT at2 = new AT(clip, "setFramePosition thread", 67) {
|
||||
public void doAction() throws Exception {
|
||||
int pos = (int) (Math.random() * clip.getFrameLength());
|
||||
log("setPosition to frame "+pos);
|
||||
clip.setFramePosition(pos);
|
||||
}
|
||||
};
|
||||
AT at3 = new AT(clip, "start/stop thread", 300) {
|
||||
public void doAction() throws Exception {
|
||||
if (clip.isRunning()) {
|
||||
log("stop");
|
||||
clip.stop();
|
||||
} else {
|
||||
log("start");
|
||||
clip.setFramePosition(0);
|
||||
clip.start();
|
||||
}
|
||||
}
|
||||
};
|
||||
AT at4 = new AT(clip, "open/close thread", 600) {
|
||||
public synchronized void doAction() throws Exception {
|
||||
log("close");
|
||||
clip.close();
|
||||
wait(50);
|
||||
if (!terminated) {
|
||||
log("open");
|
||||
bais.reset();
|
||||
clip.open(new AudioInputStream(bais, format, frameCount));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
out(" clip.start");
|
||||
clip.start();
|
||||
out(" for 10 seconds, call start/stop, setFramePosition, and flush from other threads");
|
||||
at1.start();
|
||||
at2.start();
|
||||
at3.start();
|
||||
at4.start();
|
||||
try {
|
||||
Thread.sleep(10000);
|
||||
} catch (InterruptedException ie) {}
|
||||
out(" finished.");
|
||||
at1.terminate();
|
||||
at2.terminate();
|
||||
at3.terminate();
|
||||
at4.terminate();
|
||||
out(" clip.close()");
|
||||
clip.close();
|
||||
success++;
|
||||
} catch (LineUnavailableException luae) {
|
||||
// line not available, test not failed
|
||||
System.err.println(luae);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// line not available, test not failed
|
||||
System.err.println(iae);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (isSoundcardInstalled()) {
|
||||
bais.mark(0);
|
||||
run(null);
|
||||
Mixer.Info[] infos = AudioSystem.getMixerInfo();
|
||||
for (int i = 0; i<infos.length; i++) {
|
||||
try {
|
||||
Mixer m = AudioSystem.getMixer(infos[i]);
|
||||
run(m);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
if (success > 0) {
|
||||
out("No crash -> Test passed");
|
||||
} else {
|
||||
System.err.println("Test could not execute: please install an audio device");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void out(String s) {
|
||||
/*long t = System.nanoTime() / 1000000l;
|
||||
String ts = ""+(t % 1000);
|
||||
while (ts.length() < 3) ts = "0"+ts;
|
||||
System.out.println(""+(t/1000)+":"+ts+" "+s);
|
||||
System.out.flush();*/
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
private abstract static class AT extends Thread {
|
||||
protected boolean terminated = false;
|
||||
protected Clip clip;
|
||||
private int waitTime;
|
||||
|
||||
public AT(Clip clip, String name, int waitTime) {
|
||||
super(name);
|
||||
this.clip = clip;
|
||||
this.waitTime = waitTime;
|
||||
}
|
||||
|
||||
public abstract void doAction() throws Exception;
|
||||
|
||||
public void run() {
|
||||
log("start");
|
||||
while (!terminated) {
|
||||
try {
|
||||
synchronized(this) {
|
||||
wait(waitTime);
|
||||
}
|
||||
if (!terminated) {
|
||||
doAction();
|
||||
}
|
||||
} catch(Exception e) {
|
||||
log("exception: "+e);
|
||||
}
|
||||
}
|
||||
log("exit");
|
||||
}
|
||||
|
||||
public synchronized void terminate() {
|
||||
log("terminate");
|
||||
terminated = true;
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
protected void log(String s) {
|
||||
//out(" "+Thread.currentThread().getId()+" "+getName()+": "+s);
|
||||
out(" "+getName()+": "+s);
|
||||
}
|
||||
}
|
||||
}
|
||||
126
jdk/test/javax/sound/sampled/Clip/Drain/ClipDrain.java
Normal file
126
jdk/test/javax/sound/sampled/Clip/Drain/ClipDrain.java
Normal file
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4732218
|
||||
* @summary Clip.drain does not actually block until all I/O is complete as
|
||||
* documented.
|
||||
*/
|
||||
public class ClipDrain {
|
||||
static int successfulTests = 0;
|
||||
static AudioFormat format = new AudioFormat(8000, 16, 1, true, false);
|
||||
// create a 10-second file
|
||||
static byte[] soundData = new byte[(int) (format.getFrameRate() * format.getFrameSize() * 10)];
|
||||
|
||||
static int TOLERANCE_MS = 2500; // how many milliseconds too short is tolerated...
|
||||
|
||||
private static void doMixerClip(Mixer mixer) throws Exception {
|
||||
boolean waitedEnough=false;
|
||||
try {
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format);
|
||||
Clip clip = (Clip) mixer.getLine(info);
|
||||
clip.open(format, soundData, 0, soundData.length);
|
||||
|
||||
// sanity
|
||||
if (clip.getMicrosecondLength()/1000 < 9900) {
|
||||
throw new Exception("clip's microsecond length should be at least 9900000, but it is "+clip.getMicrosecondLength());
|
||||
}
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
System.out.println(" ---------- start --------");
|
||||
clip.start();
|
||||
// give time to actually start it. ALSA implementation needs that...
|
||||
Thread.sleep(300);
|
||||
System.out.println("drain ... ");
|
||||
clip.drain();
|
||||
long elapsedTime = System.currentTimeMillis() - start;
|
||||
System.out.println("close ... ");
|
||||
clip.close();
|
||||
System.out.println("... done");
|
||||
System.out.println("Playback duration: "+elapsedTime+" milliseconds.");
|
||||
waitedEnough = elapsedTime >= ((clip.getMicrosecondLength() / 1000) - TOLERANCE_MS);
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
return;
|
||||
}
|
||||
if (!waitedEnough) {
|
||||
throw new Exception("Drain did not wait long enough to play entire clip.");
|
||||
}
|
||||
successfulTests++;
|
||||
}
|
||||
|
||||
|
||||
private static void doAll() throws Exception {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
for (int i=0; i<mixers.length; i++) {
|
||||
Mixer mixer = AudioSystem.getMixer(mixers[i]);
|
||||
System.out.println("--------------");
|
||||
System.out.println("Testing mixer: "+mixers[i]);
|
||||
doMixerClip(mixer);
|
||||
}
|
||||
if (mixers.length==0) {
|
||||
System.out.println("No mixers available!");
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (!isSoundcardInstalled()) {
|
||||
return;
|
||||
}
|
||||
doAll();
|
||||
if (successfulTests==0) {
|
||||
System.out.println("Could not execute any of the tests. Test NOT failed.");
|
||||
} else {
|
||||
System.out.println("Test PASSED.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
131
jdk/test/javax/sound/sampled/Clip/Duration/ClipDuration.java
Normal file
131
jdk/test/javax/sound/sampled/Clip/Duration/ClipDuration.java
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4237703
|
||||
* @summary Check that Clip.getMicrosecondLength() returns correct value.
|
||||
*/
|
||||
public class ClipDuration {
|
||||
|
||||
public static int run(Mixer m) {
|
||||
int res=1; // failed
|
||||
int frameCount = 441000; // lets say 10 seconds
|
||||
AudioFormat f = new AudioFormat(44100.0f, 16, 2, true, false);
|
||||
AudioInputStream audioInputStream =
|
||||
new AudioInputStream(new ByteArrayInputStream(new byte[frameCount * f.getFrameSize()]),
|
||||
f, frameCount);
|
||||
AudioFormat format = audioInputStream.getFormat();
|
||||
Clip m_clip = null;
|
||||
try {
|
||||
if (m == null) {
|
||||
m_clip = (Clip) AudioSystem.getClip();
|
||||
} else {
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format, AudioSystem.NOT_SPECIFIED);
|
||||
m_clip = (Clip) m.getLine(info);
|
||||
}
|
||||
System.out.println("Got clip: "+m_clip);
|
||||
m_clip.open(audioInputStream);
|
||||
long microseconds=m_clip.getMicrosecondLength();
|
||||
System.out.println("getFrameLength()="+m_clip.getFrameLength()+" frames");
|
||||
System.out.println("getMicrosecondLength()="+microseconds+" us");
|
||||
if (Math.abs(microseconds-10000000)<50) {
|
||||
System.out.println("->Clip OK");
|
||||
res=0; // passes if less than 50us error
|
||||
}
|
||||
} catch (LineUnavailableException luae) {
|
||||
System.err.println(luae);
|
||||
res = 3; // line not available, test not failed
|
||||
} catch (Throwable t) {
|
||||
System.out.println("->Exception:"+t);
|
||||
t.printStackTrace();
|
||||
res=2; // exception
|
||||
}
|
||||
if (m_clip != null) {
|
||||
m_clip.close();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (isSoundcardInstalled()) {
|
||||
int res=3;
|
||||
res = run(null);
|
||||
Mixer.Info[] infos = AudioSystem.getMixerInfo();
|
||||
for (int i = 0; i<infos.length; i++) {
|
||||
try {
|
||||
Mixer m = AudioSystem.getMixer(infos[i]);
|
||||
int r = run(m);
|
||||
if (r == 1) res = 1;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
if (res!=1) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
if (res==2) {
|
||||
System.err.println("Test could not execute: test threw unexpected Exception.");
|
||||
throw new Exception("Test threw exception");
|
||||
}
|
||||
else if (res==3) {
|
||||
System.err.println("Test could not execute: please install an audio device");
|
||||
return;
|
||||
}
|
||||
throw new Exception("Test returned wrong length");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
115
jdk/test/javax/sound/sampled/Clip/Endpoint/ClipSetEndPoint.java
Normal file
115
jdk/test/javax/sound/sampled/Clip/Endpoint/ClipSetEndPoint.java
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4385928
|
||||
* @summary Verify that an endpoint -1 in Clip does not throw an exception
|
||||
*/
|
||||
//public class test048 extends TRTest
|
||||
public class ClipSetEndPoint {
|
||||
|
||||
private Clip theClip;
|
||||
|
||||
boolean testPassed = true;
|
||||
|
||||
//_______________________________________________
|
||||
// Method: runTest
|
||||
//_______________________________________________
|
||||
public boolean runTest() {
|
||||
AudioInputStream theAudioInputStream = new AudioInputStream(
|
||||
new ByteArrayInputStream(new byte[2000]),
|
||||
new AudioFormat(8000.0f, 8, 1, false, false), 2000); //
|
||||
|
||||
AudioFormat theAudioFormat = theAudioInputStream.getFormat();
|
||||
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, theAudioFormat,
|
||||
AudioSystem.NOT_SPECIFIED);
|
||||
try {
|
||||
theClip = (Clip) AudioSystem.getLine(info);
|
||||
theClip.open(theAudioInputStream);
|
||||
|
||||
int theStartLoopPoint = 0;
|
||||
int theEndLoopPoint = -1; // -1 signifies the last frame
|
||||
|
||||
theClip.setLoopPoints(theStartLoopPoint, theEndLoopPoint);
|
||||
//theClip.start();
|
||||
} catch (LineUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
testPassed = true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
testPassed = false;
|
||||
}
|
||||
return testPassed;
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
// Method: main
|
||||
//_______________________________________________
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (isSoundcardInstalled()) {
|
||||
ClipSetEndPoint thisTest = new ClipSetEndPoint();
|
||||
boolean testResult = thisTest.runTest();
|
||||
if (testResult) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
System.out.println("Test failed");
|
||||
throw new Exception("Test failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: " + e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println(
|
||||
"Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println(
|
||||
"This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
81
jdk/test/javax/sound/sampled/Clip/Open/ClipOpenBug.java
Normal file
81
jdk/test/javax/sound/sampled/Clip/Open/ClipOpenBug.java
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.FloatControl;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4479444
|
||||
* @summary Verify that the error string of Clip.open() is meaningful
|
||||
*/
|
||||
public class ClipOpenBug {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
boolean res = true;
|
||||
try {
|
||||
AudioInputStream ais = new AudioInputStream(
|
||||
new ByteArrayInputStream(new byte[2000]),
|
||||
new AudioFormat(8000.0f, 8, 1, false, false), 2000); //
|
||||
AudioFormat format = ais.getFormat();
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format,
|
||||
((int) ais.getFrameLength()
|
||||
* format
|
||||
.getFrameSize()));
|
||||
Clip clip = (Clip) AudioSystem.getLine(info);
|
||||
clip.open();
|
||||
FloatControl rateControl = (FloatControl) clip.getControl(
|
||||
FloatControl.Type.SAMPLE_RATE);
|
||||
int c = 0;
|
||||
while (c++ < 10) {
|
||||
clip.stop();
|
||||
clip.setFramePosition(0);
|
||||
clip.start();
|
||||
for (float frq = 22000; frq < 44100; frq = frq + 100) {
|
||||
try {
|
||||
Thread.currentThread().sleep(20);
|
||||
} catch (Exception e) {
|
||||
break;
|
||||
}
|
||||
rateControl.setValue(frq);
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
res = ex.getMessage().indexOf(
|
||||
"This method should not have been invoked!") < 0;
|
||||
}
|
||||
if (res) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
System.out.println("Test failed");
|
||||
throw new Exception("Test failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
107
jdk/test/javax/sound/sampled/Clip/bug5070081.java
Normal file
107
jdk/test/javax/sound/sampled/Clip/bug5070081.java
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 5070081
|
||||
* @summary Tests that javax.sound.sampled.Clip does not loses position through
|
||||
* stop/start
|
||||
* @key headful
|
||||
*/
|
||||
public class bug5070081 {
|
||||
|
||||
static AudioFormat format = new AudioFormat(22050, 8, 1, false, false);
|
||||
// create a 3-second file
|
||||
static byte[] soundData = new byte[(int) (format.getFrameRate() * format.getFrameSize() * 3)];
|
||||
|
||||
static final int LOOP_COUNT = 5;
|
||||
|
||||
static boolean test() throws Exception {
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format);
|
||||
Clip clip = (Clip)AudioSystem.getLine(info);
|
||||
clip.open(format, soundData, 0, soundData.length);
|
||||
|
||||
boolean bSuccess = true;
|
||||
|
||||
long nLengthMS = clip.getMicrosecondLength()/1000;
|
||||
|
||||
System.out.println(" Clip length:");
|
||||
System.out.println(" frames: " + clip.getFrameLength());
|
||||
System.out.println(" seconds: " + nLengthMS/1000.0);
|
||||
|
||||
clip.start(); // start playing
|
||||
Thread.sleep(1000); // wait a sec
|
||||
long time1 = System.currentTimeMillis();
|
||||
long pos1 = clip.getFramePosition(); // store the position
|
||||
System.out.println(" Position before stop: " + pos1);
|
||||
clip.stop(); // and then stop
|
||||
long pos2 = clip.getFramePosition(); // 2nd try
|
||||
long time2 = System.currentTimeMillis();
|
||||
System.out.println(" Position after stop: " + pos2);
|
||||
|
||||
System.out.println(" d(time): " + Math.abs(time2-time1) + " ms;"
|
||||
+ "d(clip pos): " + Math.abs(pos2 - pos1) + " ms.");
|
||||
|
||||
long nDerivation = Math.abs(pos2 - pos1) - Math.abs(time2-time1);
|
||||
// add 50 ms for deviation (delay for stopping and errors due timer precision)
|
||||
if (nDerivation > 50) {
|
||||
System.out.println(" ERROR(1): The deviation is too much: " + nDerivation + " ms");
|
||||
bSuccess = false;
|
||||
}
|
||||
|
||||
Thread.sleep(1000);
|
||||
clip.start(); // start again
|
||||
Thread.sleep(100);
|
||||
while(clip.isRunning()); // wait for the sound to finish
|
||||
|
||||
int nEndPos = clip.getFramePosition();
|
||||
System.out.println(" Position at end: " + nEndPos);
|
||||
if (nEndPos > clip.getFrameLength()) {
|
||||
System.out.println(" ERROR(2): end position if out of range");
|
||||
bSuccess = false;
|
||||
}
|
||||
|
||||
clip.close();
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (int count=1; count <= LOOP_COUNT; count++)
|
||||
{
|
||||
System.out.println("loop " + count + "/" + LOOP_COUNT);
|
||||
if (!test())
|
||||
{
|
||||
System.out.println("Test FAILED");
|
||||
throw new RuntimeException("Test FAILED.");
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Test passed sucessfully");
|
||||
}
|
||||
}
|
||||
138
jdk/test/javax/sound/sampled/Clip/bug6251460.java
Normal file
138
jdk/test/javax/sound/sampled/Clip/bug6251460.java
Normal file
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineEvent;
|
||||
import javax.sound.sampled.LineListener;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6251460 8047222
|
||||
* @requires (os.family == "windows" | os.family == "mac")
|
||||
* @summary Tests that JavaSound plays short sounds (less then 1 second)
|
||||
*/
|
||||
public class bug6251460 {
|
||||
private static final class MutableBoolean {
|
||||
public boolean value;
|
||||
|
||||
public MutableBoolean(boolean initialValue) {
|
||||
value = initialValue;
|
||||
}
|
||||
}
|
||||
|
||||
// static helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
return System.nanoTime() / 1000000L;
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " " + s);
|
||||
}
|
||||
|
||||
|
||||
static private int countErrors = 0;
|
||||
static private final int LOOP_COUNT = 30;
|
||||
|
||||
static AudioFormat format = new AudioFormat(8000, 16, 1, true, false);
|
||||
// create a 250-ms clip
|
||||
static byte[] soundData = new byte[(int) (format.getFrameRate() * format.getFrameSize() * 0.25)];
|
||||
|
||||
static protected void test()
|
||||
throws LineUnavailableException, InterruptedException {
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, format);
|
||||
Clip clip = (Clip)AudioSystem.getLine(info);
|
||||
final MutableBoolean clipStoppedEvent = new MutableBoolean(false);
|
||||
clip.addLineListener(new LineListener() {
|
||||
@Override
|
||||
public void update(LineEvent event) {
|
||||
if (event.getType() == LineEvent.Type.STOP) {
|
||||
synchronized (clipStoppedEvent) {
|
||||
clipStoppedEvent.value = true;
|
||||
clipStoppedEvent.notifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
clip.open(format, soundData, 0, soundData.length);
|
||||
|
||||
long lengthClip = clip.getMicrosecondLength() / 1000;
|
||||
log("Clip length " + lengthClip + " ms");
|
||||
log("Playing...");
|
||||
for (int i=1; i<=LOOP_COUNT; i++) {
|
||||
long startTime = currentTimeMillis();
|
||||
log(" Loop " + i);
|
||||
clip.start();
|
||||
|
||||
synchronized (clipStoppedEvent) {
|
||||
while (!clipStoppedEvent.value) {
|
||||
clipStoppedEvent.wait();
|
||||
}
|
||||
clipStoppedEvent.value = false;
|
||||
}
|
||||
|
||||
long endTime = currentTimeMillis();
|
||||
long lengthPlayed = endTime - startTime;
|
||||
|
||||
if (lengthClip > lengthPlayed + 20) {
|
||||
log(" ERR: Looks like sound didn't play: played " + lengthPlayed + " ms instead " + lengthClip);
|
||||
countErrors++;
|
||||
} else {
|
||||
log(" OK: played " + lengthPlayed + " ms");
|
||||
}
|
||||
clip.setFramePosition(0);
|
||||
|
||||
}
|
||||
log("Played " + LOOP_COUNT + " times, " + countErrors + " errors detected.");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
try {
|
||||
test();
|
||||
} catch (LineUnavailableException | IllegalArgumentException
|
||||
| IllegalStateException ignored) {
|
||||
System.out.println("Test is not applicable. Automatically passed");
|
||||
return;
|
||||
}
|
||||
if (countErrors > 0) {
|
||||
throw new RuntimeException(
|
||||
"Test FAILED: " + countErrors + " error detected (total "
|
||||
+ LOOP_COUNT + ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* 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 javax.sound.sampled.CompoundControl;
|
||||
import javax.sound.sampled.Control;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4629190
|
||||
* @summary CompoundControl: getMemberControls() and toString() throw
|
||||
* NullPointerException
|
||||
*/
|
||||
public class ToString {
|
||||
public static void main(String args[]) throws Exception {
|
||||
System.out.println();
|
||||
System.out.println();
|
||||
System.out.println("4629190: CompoundControl: getMemberControls() and toString() throw NullPointerException");
|
||||
|
||||
String firstControlTypeName = "first_Control_Type_Name";
|
||||
String secondControlTypeName = "second_Control_Type_Name";
|
||||
String thirdControlTypeName = "third_Control_Type_Name";
|
||||
|
||||
Control.Type firstControlType = new TestControlType(firstControlTypeName);
|
||||
Control.Type secondControlType = new TestControlType(secondControlTypeName);
|
||||
Control.Type thirdControlType = new TestControlType(thirdControlTypeName);
|
||||
|
||||
Control firstControl = new TestControl(firstControlType);
|
||||
Control secondControl = new TestControl(secondControlType);
|
||||
Control thirdControl = new TestControl(thirdControlType);
|
||||
|
||||
String testCompoundControlTypeName = "CompoundControl_Type_Name";
|
||||
CompoundControl.Type testCompoundControlType
|
||||
= new TestCompoundControlType(testCompoundControlTypeName);
|
||||
|
||||
Control[] setControls = { firstControl, secondControl, thirdControl };
|
||||
CompoundControl testedCompoundControl
|
||||
= new TestCompoundControl(testCompoundControlType, setControls);
|
||||
|
||||
// this may throw exception if bug applies
|
||||
Control[] producedControls = testedCompoundControl.getMemberControls();
|
||||
System.out.println("Got "+producedControls.length+" member controls.");
|
||||
|
||||
// this may throw exception if bug applies
|
||||
String producedString = testedCompoundControl.toString();
|
||||
System.out.println("toString() returned: "+producedString);
|
||||
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class TestControl extends Control {
|
||||
|
||||
TestControl(Control.Type type) {
|
||||
super(type);
|
||||
}
|
||||
}
|
||||
|
||||
class TestControlType extends Control.Type {
|
||||
|
||||
TestControlType(String name) {
|
||||
super(name);
|
||||
}
|
||||
}
|
||||
|
||||
class TestCompoundControl extends CompoundControl {
|
||||
|
||||
TestCompoundControl(CompoundControl.Type type, Control[] memberControls) {
|
||||
super(type, memberControls);
|
||||
}
|
||||
}
|
||||
|
||||
class TestCompoundControlType extends CompoundControl.Type {
|
||||
|
||||
TestCompoundControlType(String name) {
|
||||
super(name);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 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.io.ByteArrayInputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.FloatControl;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4385654
|
||||
* @summary Check that the MASTER_GAIN control has a valid precision
|
||||
*/
|
||||
//public class test047 extends TRTest
|
||||
public class FloatControlBug {
|
||||
|
||||
private Clip theClip;
|
||||
|
||||
boolean testPassed = true;
|
||||
|
||||
private AudioFormat.Encoding theEncoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
|
||||
private float theSampleRate = 44100;
|
||||
|
||||
private int theSampleSize = 16;
|
||||
|
||||
private int theNumberOfChannels = 1;
|
||||
|
||||
private int theFrameSize = 2;
|
||||
|
||||
private float theFrameRate = 44100;
|
||||
|
||||
private boolean isBigEndian = false;
|
||||
|
||||
//_______________________________________________
|
||||
// Method: runTest
|
||||
//_______________________________________________
|
||||
public boolean runTest() {
|
||||
AudioInputStream theAudioInputStream = new AudioInputStream(
|
||||
new ByteArrayInputStream(new byte[0]),
|
||||
new AudioFormat(44100.0f, 16, 2, true, false), 441000);
|
||||
|
||||
AudioFormat theAudioFormat = theAudioInputStream.getFormat();
|
||||
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, theAudioFormat,
|
||||
AudioSystem.NOT_SPECIFIED);
|
||||
try {
|
||||
theClip = (Clip) AudioSystem.getLine(info);
|
||||
theClip.open(theAudioInputStream);
|
||||
FloatControl theFloatControl = (FloatControl) (theClip.getControl(
|
||||
FloatControl.Type.MASTER_GAIN));
|
||||
float theFloatControlPrecision = theFloatControl.getPrecision();
|
||||
System.out.println(
|
||||
"theFloatControlPrecision: " + theFloatControlPrecision);
|
||||
System.out.println("Minimum: " + theFloatControl.getMinimum());
|
||||
System.out.println("Maximum: " + theFloatControl.getMaximum());
|
||||
System.out.println("Value : " + theFloatControl.getValue());
|
||||
testPassed = theFloatControlPrecision > 0;
|
||||
} catch (LineUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
testPassed = true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
testPassed = false;
|
||||
}
|
||||
return testPassed;
|
||||
}
|
||||
|
||||
//_______________________________________________
|
||||
// Method: main
|
||||
//_______________________________________________
|
||||
public static void main(String[] args) throws Exception {
|
||||
//test047 thisTest = new test047();
|
||||
if (isSoundcardInstalled()) {
|
||||
FloatControlBug thisTest = new FloatControlBug();
|
||||
boolean testResult = thisTest.runTest();
|
||||
if (testResult) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
System.out.println("Test failed");
|
||||
throw new Exception("Test failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: " + e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println(
|
||||
"Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println(
|
||||
"This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.Mixer;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5021234
|
||||
* @summary Using -2 for buffer size will fail retrieval of lines
|
||||
*/
|
||||
public class DataLineInfoNegBufferSize {
|
||||
|
||||
/**
|
||||
* returns:
|
||||
* 0: OK
|
||||
* 1: IAE
|
||||
* 2: other exception
|
||||
* 3: line not available
|
||||
*/
|
||||
public static int run(Mixer m, int bufferSize) {
|
||||
int res;
|
||||
int frameCount = 441000; // lets say 10 seconds
|
||||
AudioFormat f = new AudioFormat(44100.0f, 16, 2, true, false);
|
||||
Clip clip = null;
|
||||
try {
|
||||
System.out.println("Requesting clip from Mixer "
|
||||
+(m==null?"default":m.toString())
|
||||
+" with bufferSize"+bufferSize);
|
||||
DataLine.Info info = new DataLine.Info(Clip.class, f, bufferSize);
|
||||
if (m==null) {
|
||||
clip = (Clip) AudioSystem.getLine(info);
|
||||
} else {
|
||||
clip = (Clip) m.getLine(info);
|
||||
}
|
||||
System.out.println("Got clip: "+clip+" with Buffer size "+clip.getBufferSize());
|
||||
|
||||
res = 0;
|
||||
} catch (LineUnavailableException luae) {
|
||||
System.out.println(luae);
|
||||
res = 3; // line not available
|
||||
} catch (IllegalArgumentException iae) {
|
||||
System.out.println(iae);
|
||||
res = 1;
|
||||
} catch (Throwable t) {
|
||||
System.out.println("->Exception:"+t);
|
||||
t.printStackTrace();
|
||||
res=2; // other exception
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (isSoundcardInstalled()) {
|
||||
int res=0;
|
||||
int count = 0;
|
||||
Mixer.Info[] infos = AudioSystem.getMixerInfo();
|
||||
for (int i = -1; i<infos.length; i++) {
|
||||
try {
|
||||
Mixer m;
|
||||
if (i == -1) {
|
||||
m = null;
|
||||
} else {
|
||||
m = AudioSystem.getMixer(infos[i]);
|
||||
}
|
||||
int r = run(m, AudioSystem.NOT_SPECIFIED);
|
||||
// only continue if successful
|
||||
if (r == 0) {
|
||||
count++;
|
||||
r = run(m, -2);
|
||||
if (r == 1) {
|
||||
// only fail if IAE was thrown
|
||||
System.out.println("#FAILED: using -2 for buffer size does not work!");
|
||||
res = 1;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
if (res!=1) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
if (count == 0) {
|
||||
System.err.println("Test could not execute -- no suitable mixers installed. NOT failed");
|
||||
}
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one soundcard is correctly installed
|
||||
* on the system.
|
||||
*/
|
||||
public static boolean isSoundcardInstalled() {
|
||||
boolean result = false;
|
||||
try {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
if (mixers.length > 0) {
|
||||
result = AudioSystem.getSourceDataLine(null) != null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Exception occured: "+e);
|
||||
}
|
||||
if (!result) {
|
||||
System.err.println("Soundcard does not exist or sound drivers not installed!");
|
||||
System.err.println("This test requires sound drivers for execution.");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
172
jdk/test/javax/sound/sampled/DataLine/LineDefFormat.java
Normal file
172
jdk/test/javax/sound/sampled/DataLine/LineDefFormat.java
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.Mixer;
|
||||
import javax.sound.sampled.SourceDataLine;
|
||||
import javax.sound.sampled.TargetDataLine;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5053380
|
||||
* @summary Verify that getting a line initializes it with the format in
|
||||
* DataLine.Info
|
||||
*/
|
||||
public class LineDefFormat {
|
||||
|
||||
final static int samplerate = 22050;
|
||||
static int passed = 0;
|
||||
static int failed = 0;
|
||||
|
||||
private static void doLine1(DataLine line, AudioFormat format) {
|
||||
try {
|
||||
System.out.println(" - got line: "+line);
|
||||
System.out.println(" - line has format: "+line.getFormat());
|
||||
if (!line.getFormat().matches(format)) {
|
||||
System.out.println(" ## Error: expected this format: "+format);
|
||||
failed++;
|
||||
} else {
|
||||
passed++;
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static void doLine2(DataLine line, AudioFormat format) {
|
||||
try {
|
||||
System.out.println(" - call to open()");
|
||||
line.open();
|
||||
try {
|
||||
System.out.println(" - line has format: "+line.getFormat());
|
||||
if (!line.getFormat().matches(format)) {
|
||||
System.out.println("## Error: expected this format: "+format);
|
||||
failed++;
|
||||
} else {
|
||||
passed++;
|
||||
}
|
||||
} finally {
|
||||
line.close();
|
||||
System.out.println(" - closed");
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static void doMixerClip(Mixer mixer, AudioFormat format) {
|
||||
if (mixer==null) return;
|
||||
try {
|
||||
System.out.println("Clip from mixer "+mixer+":");
|
||||
System.out.println(" "+mixer.getMixerInfo());
|
||||
DataLine.Info info = new DataLine.Info(
|
||||
Clip.class,
|
||||
format);
|
||||
|
||||
if (mixer.isLineSupported(info)) {
|
||||
Clip clip = (Clip) mixer.getLine(info);
|
||||
doLine1(clip, format);
|
||||
} else {
|
||||
System.out.println(" - Line not supported");
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static void doMixerSDL(Mixer mixer, AudioFormat format) {
|
||||
if (mixer==null) return;
|
||||
try {
|
||||
System.out.println("SDL from mixer "+mixer+":");
|
||||
DataLine.Info info = new DataLine.Info(
|
||||
SourceDataLine.class,
|
||||
format);
|
||||
|
||||
if (mixer.isLineSupported(info)) {
|
||||
SourceDataLine sdl = (SourceDataLine) mixer.getLine(info);
|
||||
doLine1(sdl, format);
|
||||
doLine2(sdl, format);
|
||||
} else {
|
||||
System.out.println(" - Line not supported");
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static void doMixerTDL(Mixer mixer, AudioFormat format) {
|
||||
if (mixer==null) return;
|
||||
try {
|
||||
System.out.println("TDL from mixer "+mixer+":");
|
||||
DataLine.Info info = new DataLine.Info(
|
||||
TargetDataLine.class,
|
||||
format);
|
||||
if (mixer.isLineSupported(info)) {
|
||||
TargetDataLine tdl = (TargetDataLine) mixer.getLine(info);
|
||||
doLine1(tdl, format);
|
||||
doLine2(tdl, format);
|
||||
} else {
|
||||
System.out.println(" - Line not supported");
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
System.out.println(" - Caught exception. Not failed.");
|
||||
System.out.println(" - "+t.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static void doAll() throws Exception {
|
||||
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
|
||||
AudioFormat pcm;
|
||||
for (int i=0; i<mixers.length; i++) {
|
||||
Mixer mixer = AudioSystem.getMixer(mixers[i]);
|
||||
pcm = new AudioFormat(samplerate, 16, 1, true, false);
|
||||
doMixerClip(mixer, pcm);
|
||||
pcm = new AudioFormat(samplerate, 8, 1, false, false);
|
||||
doMixerSDL(mixer, pcm);
|
||||
pcm = new AudioFormat(samplerate, 16, 2, true, true);
|
||||
doMixerTDL(mixer, pcm);
|
||||
}
|
||||
if (mixers.length==0) {
|
||||
System.out.println("No mixers available!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String args[]) throws Exception{
|
||||
doAll();
|
||||
if (passed==0 && failed==0) {
|
||||
System.out.println("Could not execute any of the tests. Test NOT failed.");
|
||||
} else if (failed == 0) {
|
||||
System.out.println("Test PASSED.");
|
||||
} else {
|
||||
throw new Exception("Test FAILED!");
|
||||
}
|
||||
}
|
||||
}
|
||||
70
jdk/test/javax/sound/sampled/DataLine/LongFramePosition.java
Normal file
70
jdk/test/javax/sound/sampled/DataLine/LongFramePosition.java
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.SourceDataLine;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5049129
|
||||
* @summary DataLine.getLongFramePosition
|
||||
* @key headful
|
||||
*/
|
||||
public class LongFramePosition {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean failed = false;
|
||||
try {
|
||||
AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false);
|
||||
SourceDataLine sdl = AudioSystem.getSourceDataLine(format);
|
||||
try {
|
||||
sdl.open(format);
|
||||
sdl.start();
|
||||
sdl.write(new byte[16384], 0, 16384);
|
||||
Thread.sleep(1000);
|
||||
int intPos = sdl.getFramePosition();
|
||||
long longPos = sdl.getLongFramePosition();
|
||||
System.out.println("After 1 second: getFramePosition() = "+intPos);
|
||||
System.out.println(" getLongFramePosition() = "+longPos);
|
||||
if (intPos <= 0 || longPos <= 0) {
|
||||
failed = true;
|
||||
System.out.println("## FAILED: frame position did not advance, or negative!");
|
||||
}
|
||||
if (Math.abs(intPos - longPos) > 100) {
|
||||
failed = true;
|
||||
System.out.println("## FAILED: frame positions are not the same!");
|
||||
}
|
||||
} finally {
|
||||
sdl.close();
|
||||
}
|
||||
} catch(LineUnavailableException e){
|
||||
System.out.println(e);
|
||||
System.out.println("Cannot execute test.");
|
||||
return;
|
||||
}
|
||||
if (failed) throw new Exception("Test FAILED!");
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.SourceDataLine;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 5001959
|
||||
* @summary Short tick sound after finished playing with SourceDataLine
|
||||
* @run main/manual TickAtEndOfPlay
|
||||
*/
|
||||
public class TickAtEndOfPlay {
|
||||
|
||||
static boolean WorkAround1 = false;
|
||||
static boolean WorkAround2 = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("This test should only be run on Windows.");
|
||||
System.out.println("Make sure that the speakers are connected and the volume is up.");
|
||||
System.out.println("Close all other programs that may use the soundcard.");
|
||||
|
||||
System.out.println("You'll hear a 2-second tone. when the tone finishes,");
|
||||
System.out.println(" there should be no noise. If you hear a short tick/noise,");
|
||||
System.out.println(" the bug still applies.");
|
||||
|
||||
System.out.println("Press ENTER to continue.");
|
||||
System.in.read();
|
||||
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (args[i].equals("1")) WorkAround1 = true;
|
||||
if (args[i].equals("2")) WorkAround2 = true;
|
||||
}
|
||||
if (WorkAround1) System.out.println("Using work around1: appending silence");
|
||||
if (WorkAround2) System.out.println("Using work around2: waiting before close");
|
||||
|
||||
int zerolen = 0; // how many 0-bytes will be appended to playback
|
||||
if (WorkAround1) zerolen = 1000;
|
||||
int seconds = 2;
|
||||
int sampleRate = 8000;
|
||||
double frequency = 1000.0;
|
||||
double RAD = 2.0 * Math.PI;
|
||||
AudioFormat af = new AudioFormat((float)sampleRate,8,1,true,true);
|
||||
System.out.println("Format: "+af);
|
||||
DataLine.Info info = new DataLine.Info(SourceDataLine.class,af);
|
||||
SourceDataLine source = (SourceDataLine)AudioSystem.getLine(info);
|
||||
System.out.println("Line: "+source);
|
||||
if (source.toString().indexOf("MixerSourceLine")>=0) {
|
||||
System.out.println("This test only applies to non-Java Sound Audio Engine!");
|
||||
return;
|
||||
}
|
||||
System.out.println("Opening...");
|
||||
source.open(af);
|
||||
System.out.println("Starting...");
|
||||
source.start();
|
||||
int datalen = sampleRate * seconds;
|
||||
byte[] buf = new byte[datalen+zerolen];
|
||||
for (int i=0; i<datalen; i++) {
|
||||
buf[i] = (byte)(Math.sin(RAD*frequency/sampleRate*i)*127.0);
|
||||
}
|
||||
System.out.println("Writing...");
|
||||
source.write(buf,0,buf.length);
|
||||
System.out.println("Draining...");
|
||||
source.drain();
|
||||
System.out.println("Stopping...");
|
||||
source.stop();
|
||||
if (WorkAround2) {
|
||||
System.out.println("Waiting 200 millis...");
|
||||
Thread.sleep(200);
|
||||
}
|
||||
System.out.println("Closing...");
|
||||
source.close();
|
||||
System.out.println("Done.");
|
||||
}
|
||||
}
|
||||
381
jdk/test/javax/sound/sampled/DirectAudio/bug6372428.java
Normal file
381
jdk/test/javax/sound/sampled/DirectAudio/bug6372428.java
Normal file
@ -0,0 +1,381 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 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 javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.DataLine;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.sound.sampled.SourceDataLine;
|
||||
import javax.sound.sampled.TargetDataLine;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6372428
|
||||
* @summary playback and capture doesn't interrupt after terminating thread that
|
||||
* calls start()
|
||||
* @run main bug6372428
|
||||
* @key headful
|
||||
*/
|
||||
public class bug6372428 {
|
||||
public bug6372428() {
|
||||
}
|
||||
|
||||
public static void main(final String[] args) {
|
||||
bug6372428 pThis = new bug6372428();
|
||||
boolean failed1 = false;
|
||||
boolean failed2 = false;
|
||||
log("");
|
||||
log("****************************************************************");
|
||||
log("*** Playback Test");
|
||||
log("****************************************************************");
|
||||
log("");
|
||||
try {
|
||||
pThis.testPlayback();
|
||||
} catch (IllegalArgumentException | LineUnavailableException e) {
|
||||
System.out.println("Playback test is not applicable. Skipped");
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
failed1 = true;
|
||||
}
|
||||
log("");
|
||||
log("");
|
||||
log("****************************************************************");
|
||||
log("*** Capture Test");
|
||||
log("****************************************************************");
|
||||
log("");
|
||||
try {
|
||||
pThis.testRecord();
|
||||
} catch (IllegalArgumentException | LineUnavailableException e) {
|
||||
System.out.println("Record test is not applicable. Skipped");
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
failed2 = true;
|
||||
}
|
||||
log("");
|
||||
log("");
|
||||
log("****************************************************************");
|
||||
if (failed1 || failed2) {
|
||||
String s = "";
|
||||
if (failed1 && failed2)
|
||||
s = "playback and capture";
|
||||
else if (failed1)
|
||||
s = "playback only";
|
||||
else
|
||||
s = "capture only";
|
||||
throw new RuntimeException("Test FAILED (" + s + ")");
|
||||
}
|
||||
log("*** All tests passed successfully.");
|
||||
}
|
||||
|
||||
final static int DATA_LENGTH = 15; // in seconds
|
||||
final static int PLAYTHREAD_DELAY = 5; // in seconds
|
||||
|
||||
// playback test classes/routines
|
||||
|
||||
class PlayThread extends Thread {
|
||||
SourceDataLine line;
|
||||
public PlayThread(SourceDataLine line) {
|
||||
this.line = line;
|
||||
this.setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
log("PlayThread: starting...");
|
||||
line.start();
|
||||
log("PlayThread: delaying " + (PLAYTHREAD_DELAY * 1000) + "ms...");
|
||||
delay(PLAYTHREAD_DELAY * 1000);
|
||||
log("PlayThread: exiting...");
|
||||
}
|
||||
}
|
||||
|
||||
class WriteThread extends Thread {
|
||||
SourceDataLine line;
|
||||
byte[] data;
|
||||
volatile int remaining;
|
||||
volatile boolean stopRequested = false;
|
||||
public WriteThread(SourceDataLine line, byte[] data) {
|
||||
this.line = line;
|
||||
this.data = data;
|
||||
remaining = data.length;
|
||||
this.setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
while (remaining > 0 && !stopRequested) {
|
||||
int avail = line.available();
|
||||
if (avail > 0) {
|
||||
if (avail > remaining)
|
||||
avail = remaining;
|
||||
int written = line.write(data, data.length - remaining, avail);
|
||||
remaining -= written;
|
||||
log("WriteThread: " + written + " bytes written");
|
||||
} else {
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
if (remaining == 0) {
|
||||
log("WriteThread: all data has been written, draining");
|
||||
line.drain();
|
||||
} else {
|
||||
log("WriteThread: stop requested");
|
||||
}
|
||||
log("WriteThread: stopping");
|
||||
line.stop();
|
||||
log("WriteThread: exiting");
|
||||
}
|
||||
|
||||
public boolean isCompleted() {
|
||||
return (remaining <= 0);
|
||||
}
|
||||
|
||||
public void requestStop() {
|
||||
stopRequested = true;
|
||||
}
|
||||
}
|
||||
|
||||
void testPlayback() throws LineUnavailableException {
|
||||
// prepare audio data
|
||||
AudioFormat format = new AudioFormat(22050, 8, 1, false, false);
|
||||
byte[] soundData = new byte[(int) (format.getFrameRate() * format.getFrameSize() * DATA_LENGTH)];
|
||||
|
||||
// create & open source data line
|
||||
//SourceDataLine line = AudioSystem.getSourceDataLine(format);
|
||||
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
|
||||
SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
|
||||
|
||||
line.open(format);
|
||||
|
||||
// start write data thread
|
||||
WriteThread p1 = new WriteThread(line, soundData);
|
||||
p1.start();
|
||||
|
||||
// start line
|
||||
PlayThread p2 = new PlayThread(line);
|
||||
p2.start();
|
||||
|
||||
// monitor line
|
||||
long lineTime1 = line.getMicrosecondPosition() / 1000;
|
||||
long realTime1 = currentTimeMillis();
|
||||
while (true) {
|
||||
delay(500);
|
||||
if (!line.isActive()) {
|
||||
log("audio data played completely");
|
||||
break;
|
||||
}
|
||||
long lineTime2 = line.getMicrosecondPosition() / 1000;
|
||||
long realTime2 = currentTimeMillis();
|
||||
long dLineTime = lineTime2 - lineTime1;
|
||||
long dRealTime = realTime2 - realTime1;
|
||||
log("line pos: " + lineTime2 + "ms" + ", thread is " + (p2.isAlive() ? "alive" : "DIED"));
|
||||
if (dLineTime < 0) {
|
||||
throw new RuntimeException("ERROR: line position have decreased from " + lineTime1 + " to " + lineTime2);
|
||||
}
|
||||
if (dRealTime < 450) {
|
||||
// delay() has been interrupted?
|
||||
continue;
|
||||
}
|
||||
lineTime1 = lineTime2;
|
||||
realTime1 = realTime2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// recording test classes/routines
|
||||
|
||||
class RecordThread extends Thread {
|
||||
TargetDataLine line;
|
||||
public RecordThread(TargetDataLine line) {
|
||||
this.line = line;
|
||||
this.setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
log("RecordThread: starting...");
|
||||
line.start();
|
||||
log("RecordThread: delaying " + (PLAYTHREAD_DELAY * 1000) + "ms...");
|
||||
delay(PLAYTHREAD_DELAY * 1000);
|
||||
log("RecordThread: exiting...");
|
||||
}
|
||||
}
|
||||
|
||||
class ReadThread extends Thread {
|
||||
TargetDataLine line;
|
||||
byte[] data;
|
||||
volatile int remaining;
|
||||
public ReadThread(TargetDataLine line, byte[] data) {
|
||||
this.line = line;
|
||||
this.data = data;
|
||||
remaining = data.length;
|
||||
this.setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
log("ReadThread: buffer size is " + data.length + " bytes");
|
||||
delay(200);
|
||||
while ((remaining > 0) && line.isOpen()) {
|
||||
int avail = line.available();
|
||||
if (avail > 0) {
|
||||
if (avail > remaining)
|
||||
avail = remaining;
|
||||
int read = line.read(data, data.length - remaining, avail);
|
||||
remaining -= read;
|
||||
log("ReadThread: " + read + " bytes read");
|
||||
} else {
|
||||
delay(100);
|
||||
}
|
||||
if (remaining <= 0) {
|
||||
log("ReadThread: record buffer is full, exiting");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (remaining > 0) {
|
||||
log("ReadThread: line has been stopped, exiting");
|
||||
}
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return data.length - remaining;
|
||||
}
|
||||
public boolean isCompleted() {
|
||||
return (remaining <= 0);
|
||||
}
|
||||
}
|
||||
|
||||
void testRecord() throws LineUnavailableException {
|
||||
// prepare audio data
|
||||
AudioFormat format = new AudioFormat(22050, 8, 1, false, false);
|
||||
|
||||
// create & open target data line
|
||||
//TargetDataLine line = AudioSystem.getTargetDataLine(format);
|
||||
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
|
||||
TargetDataLine line = (TargetDataLine)AudioSystem.getLine(info);
|
||||
|
||||
line.open(format);
|
||||
|
||||
// start read data thread
|
||||
byte[] data = new byte[(int) (format.getFrameRate() * format.getFrameSize() * DATA_LENGTH)];
|
||||
ReadThread p1 = new ReadThread(line, data);
|
||||
p1.start();
|
||||
|
||||
// start line
|
||||
//new RecordThread(line).start();
|
||||
RecordThread p2 = new RecordThread(line);
|
||||
p2.start();
|
||||
|
||||
// monitor line
|
||||
long endTime = currentTimeMillis() + DATA_LENGTH * 1000;
|
||||
|
||||
long realTime1 = currentTimeMillis();
|
||||
long lineTime1 = line.getMicrosecondPosition() / 1000;
|
||||
|
||||
while (realTime1 < endTime && !p1.isCompleted()) {
|
||||
delay(100);
|
||||
long lineTime2 = line.getMicrosecondPosition() / 1000;
|
||||
long realTime2 = currentTimeMillis();
|
||||
long dLineTime = lineTime2 - lineTime1;
|
||||
long dRealTime = realTime2 - realTime1;
|
||||
log("line pos: " + lineTime2 + "ms" + ", thread is " + (p2.isAlive() ? "alive" : "DIED"));
|
||||
if (dLineTime < 0) {
|
||||
line.stop();
|
||||
line.close();
|
||||
throw new RuntimeException("ERROR: line position have decreased from " + lineTime1 + " to " + lineTime2);
|
||||
}
|
||||
if (dRealTime < 450) {
|
||||
// delay() has been interrupted?
|
||||
continue;
|
||||
}
|
||||
lineTime1 = lineTime2;
|
||||
realTime1 = realTime2;
|
||||
}
|
||||
log("stopping line...");
|
||||
line.stop();
|
||||
line.close();
|
||||
|
||||
/*
|
||||
log("");
|
||||
log("");
|
||||
log("");
|
||||
log("recording completed, delaying 5 sec");
|
||||
log("recorded " + p1.getCount() + " bytes, " + DATA_LENGTH + " seconds: " + (p1.getCount() * 8 / DATA_LENGTH) + " bit/sec");
|
||||
log("");
|
||||
log("");
|
||||
log("");
|
||||
delay(5000);
|
||||
log("starting playing...");
|
||||
playRecorded(format, data);
|
||||
*/
|
||||
}
|
||||
|
||||
void playRecorded(AudioFormat format, byte[] data) throws Exception {
|
||||
//SourceDataLine line = AudioSystem.getSourceDataLine(format);
|
||||
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
|
||||
SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
|
||||
|
||||
line.open();
|
||||
line.start();
|
||||
|
||||
int remaining = data.length;
|
||||
while (remaining > 0) {
|
||||
int avail = line.available();
|
||||
if (avail > 0) {
|
||||
if (avail > remaining)
|
||||
avail = remaining;
|
||||
int written = line.write(data, data.length - remaining, avail);
|
||||
remaining -= written;
|
||||
log("Playing: " + written + " bytes written");
|
||||
} else {
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
line.drain();
|
||||
line.stop();
|
||||
}
|
||||
|
||||
// helper routines
|
||||
static long startTime = currentTimeMillis();
|
||||
static long currentTimeMillis() {
|
||||
//return System.nanoTime() / 1000000L;
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
static void log(String s) {
|
||||
long time = currentTimeMillis() - startTime;
|
||||
long ms = time % 1000;
|
||||
time /= 1000;
|
||||
long sec = time % 60;
|
||||
time /= 60;
|
||||
long min = time % 60;
|
||||
time /= 60;
|
||||
System.out.println(""
|
||||
+ (time < 10 ? "0" : "") + time
|
||||
+ ":" + (min < 10 ? "0" : "") + min
|
||||
+ ":" + (sec < 10 ? "0" : "") + sec
|
||||
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms
|
||||
+ " (" + Thread.currentThread().getName() + ") " + s);
|
||||
}
|
||||
static void delay(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 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 javax.sound.sampled.AudioFileFormat;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4300529
|
||||
* @summary Filename extension test. The filename extensions for file types
|
||||
* AIFF-C, SND, and WAVE should not include a ".".
|
||||
*/
|
||||
public class FileTypeExtensionTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
AudioFileFormat.Type[] types = { AudioFileFormat.Type.AIFC,
|
||||
AudioFileFormat.Type.AIFF,
|
||||
AudioFileFormat.Type.AU,
|
||||
AudioFileFormat.Type.SND,
|
||||
AudioFileFormat.Type.WAVE };
|
||||
|
||||
boolean failed = false;
|
||||
|
||||
System.out.println("\nDefined file types and extensions:");
|
||||
|
||||
for (int i = 0; i < types.length; i++) {
|
||||
System.out.println("\n");
|
||||
System.out.println(" file type: " + types[i]);
|
||||
System.out.println(" extension: " + types[i].getExtension());
|
||||
if( types[i].getExtension().charAt(0) == '.' ) {
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
System.err.println("Failed!");
|
||||
throw new Exception("File type extensions begin with .");
|
||||
} else {
|
||||
System.err.println("Passed!");
|
||||
}
|
||||
}
|
||||
}
|
||||
177
jdk/test/javax/sound/sampled/LineEvent/LineInfoNPE.java
Normal file
177
jdk/test/javax/sound/sampled/LineEvent/LineInfoNPE.java
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
* 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 javax.sound.sampled.Control;
|
||||
import javax.sound.sampled.Line;
|
||||
import javax.sound.sampled.LineEvent;
|
||||
import javax.sound.sampled.LineListener;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4672865
|
||||
* @summary LineEvent.toString() throws unexpected NullPointerException
|
||||
*/
|
||||
public class LineInfoNPE {
|
||||
|
||||
static final int STATUS_PASSED = 0;
|
||||
static final int STATUS_FAILED = 2;
|
||||
static final int STATUS_TEMP = 95;
|
||||
|
||||
public static void main(String argv[]) throws Exception {
|
||||
int testExitStatus = run(argv, System.out);
|
||||
if (testExitStatus != STATUS_PASSED) {
|
||||
throw new Exception("test FAILED!");
|
||||
}
|
||||
}
|
||||
|
||||
public static int run(String argv[], java.io.PrintStream out) {
|
||||
int testResult = STATUS_PASSED;
|
||||
|
||||
out.println("\n==> Test for LineEvent class:");
|
||||
|
||||
Line testLine = new TestLine();
|
||||
Line nullLine = null;
|
||||
|
||||
LineEvent.Type testLineEventType = LineEvent.Type.OPEN;
|
||||
LineEvent.Type nullLineEventType = null;
|
||||
|
||||
LineEvent testedLineEvent = null;
|
||||
out.println("\n>> LineEvent constructor for Line = null: ");
|
||||
try {
|
||||
testedLineEvent =
|
||||
new LineEvent(nullLine, // the source Line of this event
|
||||
testLineEventType, // LineEvent.Type - the event type
|
||||
(long) 1000 // position - the number processed of sample frames
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedLineEvent.getType():");
|
||||
try {
|
||||
Line producedLine = testedLineEvent.getLine();
|
||||
out.println("> PASSED: producedLine = " + producedLine);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedLineEvent.toString():");
|
||||
try {
|
||||
String producedString = testedLineEvent.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
out.println("\n>> LineEvent constructor for LineEvent.Type = null: ");
|
||||
try {
|
||||
testedLineEvent =
|
||||
new LineEvent(testLine, // the source Line of this event
|
||||
nullLineEventType, // LineEvent.Type - the event type
|
||||
(long) 1000 // position - the number processed of sample frames
|
||||
);
|
||||
out.println("> No any Exception was thrown!");
|
||||
out.println("> testedLineEvent.getType():");
|
||||
try {
|
||||
LineEvent.Type producedType = testedLineEvent.getType();
|
||||
out.println("> PASSED: producedType = " + producedType);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
out.println("> testedLineEvent.toString():");
|
||||
try {
|
||||
String producedString = testedLineEvent.toString();
|
||||
out.println("> PASSED: producedString = " + producedString);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
} catch (IllegalArgumentException illegArgExcept) {
|
||||
out.println("> PASSED: expected IllegalArgumentException was thrown:");
|
||||
illegArgExcept.printStackTrace(out);
|
||||
} catch (NullPointerException nullPE) {
|
||||
out.println("> PASSED: expected NullPointerException was thrown:");
|
||||
nullPE.printStackTrace(out);
|
||||
} catch (Throwable thrown) {
|
||||
out.println("## FAILED: unexpected Exception was thrown:");
|
||||
thrown.printStackTrace(out);
|
||||
testResult = STATUS_FAILED;
|
||||
}
|
||||
|
||||
if ( testResult == STATUS_FAILED ) {
|
||||
out.println("\n==> test FAILED!");
|
||||
} else {
|
||||
out.println("\n==> test PASSED!");
|
||||
}
|
||||
return testResult;
|
||||
}
|
||||
} // end of test class
|
||||
|
||||
class TestLine implements Line {
|
||||
|
||||
public void addLineListener(LineListener listener) {
|
||||
}
|
||||
|
||||
public void close() {
|
||||
}
|
||||
|
||||
public Control getControl(Control.Type control) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Control[] getControls() {
|
||||
return new Control[0];
|
||||
}
|
||||
|
||||
public Line.Info getLineInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isOpen() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isControlSupported(Control.Type control) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void open() {
|
||||
}
|
||||
|
||||
public void removeLineListener(LineListener listener) {
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user