/* * 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; 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; /** * @test * @bug 4515126 * @summary Verify that the buffer passed to SourceDataLine.write() and * Clip.open() will not be changed */ public class ChangingBuffer { final static int samplerate = 44100; final static byte[] buffer = new byte[16384]; static int successfulTests = 0; private static void makeBuffer() { for (int i=0; i<buffer.length; i++) { buffer[i] = (byte) (i % 128); } } private static void checkBufferSDL() throws Exception { successfulTests++; for (int i=0; i<buffer.length; i++) { if (buffer[i] != ((byte) (i % 128))) { throw new Exception("Buffer was changed by SourceDataLine.write()!. Test FAILED"); } } System.out.println(" -> passed for this line"); System.out.println(""); } private static void checkBufferClip() throws Exception { for (int i=0; i<buffer.length; i++) { if (buffer[i] != (i % 128)) { throw new Exception("Buffer was changed by Clip.open()!. Test FAILED"); } } System.out.println(" -> passed for this clip"); System.out.println(""); } private static boolean doMixerClip(Mixer mixer, AudioFormat format) { if (mixer==null) return false; try { System.out.println("Trying mixer "+mixer+":"); DataLine.Info info = new DataLine.Info( Clip.class, format, (int) samplerate); Clip clip = (Clip) mixer.getLine(info); System.out.println(" - got clip: "+clip); System.out.println(" - open with format "+format); clip.open(format, buffer, 0, buffer.length); System.out.println(" - playing..."); clip.start(); System.out.println(" - waiting while it's active..."); while (clip.isActive()) Thread.sleep(100); System.out.println(" - waiting 100millis"); Thread.sleep(100); System.out.println(" - drain1"); clip.drain(); System.out.println(" - drain2"); clip.drain(); System.out.println(" - stop"); clip.stop(); System.out.println(" - close"); clip.close(); System.out.println(" - closed"); } catch (Throwable t) { System.out.println(" - Caught exception. Not failed."); System.out.println(" - "+t.toString()); return false; } return true; } private static boolean doMixerSDL(Mixer mixer, AudioFormat format) { if (mixer==null) return false; try { System.out.println("Trying mixer "+mixer+":"); DataLine.Info info = new DataLine.Info( SourceDataLine.class, format, (int) samplerate); SourceDataLine sdl = (SourceDataLine) mixer.getLine(info); System.out.println(" - got sdl: "+sdl); System.out.println(" - open with format "+format); sdl.open(format); System.out.println(" - start..."); sdl.start(); System.out.println(" - write..."); sdl.write(buffer, 0, buffer.length); Thread.sleep(200); System.out.println(" - drain..."); sdl.drain(); System.out.println(" - stop..."); sdl.stop(); System.out.println(" - close..."); sdl.close(); System.out.println(" - closed"); } catch (Throwable t) { System.out.println(" - Caught exception. Not failed."); System.out.println(" - "+t.toString()); return false; } return true; } private static void doAll(boolean bigEndian) throws Exception { AudioFormat pcm = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, samplerate, 16, 1, 2, samplerate, bigEndian); Mixer.Info[] mixers = AudioSystem.getMixerInfo(); for (int i=0; i<mixers.length; i++) { Mixer mixer = AudioSystem.getMixer(mixers[i]); makeBuffer(); if (doMixerClip(mixer, pcm)) checkBufferClip(); makeBuffer(); if (doMixerSDL(mixer, pcm)) checkBufferSDL(); } if (mixers.length==0) { System.out.println("No mixers available!"); } } public static void main(String args[]) throws Exception{ doAll(true); doAll(false); if (successfulTests==0) { System.out.println("Could not execute any of the tests. Test NOT failed."); } else { System.out.println("Test PASSED."); } } }