1 /* 2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import javax.sound.sampled.AudioFormat; 25 import javax.sound.sampled.AudioSystem; 26 import javax.sound.sampled.Line; 27 import javax.sound.sampled.LineUnavailableException; 28 import javax.sound.sampled.Mixer; 29 import javax.sound.sampled.SourceDataLine; 30 31 /** 32 * @test 33 * @bug 4680710 34 * @summary SourceDataLine.write() behavior is not correct for not open or not 35 * started lines 36 */ 37 public class SDLwrite { 38 39 static final int STATUS_PASSED = 0; 40 static final int STATUS_FAILED = 2; 41 42 public static void main(String argv[]) throws Exception { 43 int testExitStatus = run(argv, System.out); 44 if (testExitStatus != STATUS_PASSED) { 45 throw new Exception("test FAILED!"); 46 } 47 } 48 49 public static int run(String argv[], java.io.PrintStream out) { 50 int testResult = STATUS_PASSED; 51 52 out.println 53 ("\n==> Test for SourceDataLine.write() method for not open and not started line:"); 54 55 Mixer.Info[] installedMixersInfo = AudioSystem.getMixerInfo(); 56 57 if ( installedMixersInfo == null ) { 58 out.println("## AudioSystem.getMixerInfo() returned unexpected result:"); 59 out.println("# expected: an array of Mixer.Info objects (may be array of length 0);"); 60 out.println("# produced: null;"); 61 return STATUS_FAILED; 62 } 63 64 if ( installedMixersInfo.length == 0 ) { 65 // there are no mixers installed on the system - so this testcase can not be tested 66 return STATUS_PASSED; 67 } 68 69 Mixer testedMixer = null; 70 for (int i=0; i < installedMixersInfo.length; i++) { 71 try { 72 testedMixer = AudioSystem.getMixer(installedMixersInfo[i]); 73 } catch (SecurityException securityException) { 74 // installed Mixer is unavailable because of security restrictions 75 continue; 76 } catch (Throwable thrown) { 77 out.println("## AudioSystem.getMixer() threw unexpected exception:"); 78 thrown.printStackTrace(out); 79 testResult = STATUS_FAILED; 80 continue; 81 } 82 83 try { 84 testedMixer.open(); 85 } catch (LineUnavailableException lineUnavailableException) { 86 // testedMixer is not available due to resource restrictions 87 continue; 88 } catch (SecurityException securityException) { 89 // testedMixer is not available due to security restrictions 90 continue; 91 } catch (Throwable thrown) { 92 out.println("## Mixer.open() threw unexpected exception:"); 93 out.println("# Mixer = " + testedMixer); 94 thrown.printStackTrace(out); 95 testResult = STATUS_FAILED; 96 continue; 97 } 98 Line.Info supportedSourceLineInfo[] = null; 99 try { 100 supportedSourceLineInfo = testedMixer.getSourceLineInfo(); 101 } catch (Throwable thrown) { 102 out.println("## Mixer.getSourceLineInfo() threw unexpected exception:"); 103 out.println("# Mixer = " + testedMixer); 104 thrown.printStackTrace(out); 105 testResult = STATUS_FAILED; 106 testedMixer.close(); 107 continue; 108 } 109 if ( supportedSourceLineInfo == null ) { 110 out.println("## Mixer.getSourceLineInfo() returned null array"); 111 out.println("# Mixer = " + testedMixer); 112 testResult = STATUS_FAILED; 113 testedMixer.close(); 114 continue; 115 } 116 out.println("\n>>> testedMixer["+i+"] = " + testedMixer); 117 out.println("\n>> supportedSourceLineInfo.length = " + supportedSourceLineInfo.length); 118 119 for (int j=0; j < supportedSourceLineInfo.length; j++) { 120 Line.Info testSourceLineInfo = supportedSourceLineInfo[j]; 121 122 Line testSourceLine = null; 123 try { 124 testSourceLine = testedMixer.getLine(testSourceLineInfo); 125 } catch (LineUnavailableException lineUnavailableException) { 126 // line is not available due to resource restrictions 127 continue; 128 } catch (SecurityException securityException) { 129 // line is not available due to security restrictions 130 continue; 131 } catch (Throwable thrown) { 132 out.println("## Mixer.getLine(Line.Info) threw unexpected Exception:"); 133 out.println("# Mixer = " + testedMixer); 134 out.println("# Line.Info = " + testSourceLineInfo); 135 thrown.printStackTrace(out); 136 testResult = STATUS_FAILED; 137 continue; 138 } 139 140 out.println("\n> testSourceLineInfo["+j+"] = " + testSourceLineInfo); 141 out.println("> testSourceLine = " + testSourceLine); 142 if ( ! (testSourceLine instanceof SourceDataLine) ) { 143 out.println("> testSourceLine is not SourceDataLine"); 144 continue; 145 } 146 147 SourceDataLine testedSourceLine = (SourceDataLine)testSourceLine; 148 AudioFormat lineAudioFormat = testedSourceLine.getFormat(); 149 150 int bufferSizeToWrite = 1; 151 if ( lineAudioFormat.getSampleSizeInBits() != AudioSystem.NOT_SPECIFIED ) { 152 bufferSizeToWrite = lineAudioFormat.getSampleSizeInBits()/8; 153 if ( lineAudioFormat.getSampleSizeInBits()%8 != 0 ) { 154 bufferSizeToWrite++; 155 } 156 } 157 if ( lineAudioFormat.getFrameSize() != AudioSystem.NOT_SPECIFIED ) { 158 bufferSizeToWrite = lineAudioFormat.getFrameSize(); 159 } 160 byte[] dataToWrite = new byte[bufferSizeToWrite]; 161 for (int k=0; k < bufferSizeToWrite; k++) { 162 dataToWrite[k] = (byte)1; 163 } 164 int offsetToWrite = 0; 165 166 out.println 167 ("\n> check SourceDataLine.write() for not open line with correct length of data:"); 168 int writtenBytes = -1; 169 try { 170 writtenBytes = testedSourceLine.write(dataToWrite, offsetToWrite, bufferSizeToWrite); 171 out.println("> Bytes written: number of written bytes = " + writtenBytes); 172 } catch (Throwable thrown) { 173 out.println("## SourceDataLine.write(byte[] b, int off, int len) failed:"); 174 out.println("# Unexpected Exception is thrown"); 175 out.println("# Mixer = " + testedMixer); 176 out.println("# SourceDataLine = " + testedSourceLine); 177 thrown.printStackTrace(out); 178 testResult = STATUS_FAILED; 179 } 180 181 out.println 182 ("\n> check SourceDataLine.write() for not open line with incorrect length of data:"); 183 writtenBytes = -1; 184 bufferSizeToWrite--; 185 try { 186 writtenBytes = testedSourceLine.write(dataToWrite, offsetToWrite, bufferSizeToWrite); 187 out.println("> Bytes written: number of written bytes = " + writtenBytes); 188 } catch (IllegalArgumentException illegalArgumentException) { 189 out.println("> Permissible IllegalArgumentException for the present instance is thrown:"); 190 illegalArgumentException.printStackTrace(out); 191 } catch (Throwable thrown) { 192 out.println("## SourceDataLine.write(byte[] b, int off, int len) failed:"); 193 out.println("# Unexpected Exception is thrown"); 194 out.println("# Mixer = " + testedMixer); 195 out.println("# SourceDataLine = " + testedSourceLine); 196 thrown.printStackTrace(out); 197 testResult = STATUS_FAILED; 198 } 199 200 out.println 201 ("\n> open tested line:"); 202 bufferSizeToWrite++; 203 try { 204 testedSourceLine.open(lineAudioFormat, bufferSizeToWrite); 205 out.println("> OK - line is opened"); 206 } catch (LineUnavailableException lineUnavailableException) { 207 out.println("> Line is not available due to resource restrictions:"); 208 lineUnavailableException.printStackTrace(out); 209 continue; 210 } catch (SecurityException securityException) { 211 out.println("> Line is not available due to security restrictions:"); 212 securityException.printStackTrace(out); 213 continue; 214 } catch (Throwable thrown) { 215 out.println("## SourceDataLine.open(AudioFormat format) failed:"); 216 out.println("# Unexpected Exception is thrown"); 217 out.println("# Mixer = " + testedMixer); 218 out.println("# SourceDataLine = " + testedSourceLine); 219 thrown.printStackTrace(out); 220 testResult = STATUS_FAILED; 221 continue; 222 } 223 224 out.println 225 ("\n> check SourceDataLine.write() for not started line with correct length of data:"); 226 writtenBytes = -1; 227 try { 228 writtenBytes = testedSourceLine.write(dataToWrite, offsetToWrite, bufferSizeToWrite); 229 out.println("> Bytes written: number of written bytes = " + writtenBytes); 230 } catch (Throwable thrown) { 231 out.println("## SourceDataLine.write(byte[] b, int off, int len) failed:"); 232 out.println("# Unexpected Exception is thrown"); 233 out.println("# Mixer = " + testedMixer); 234 out.println("# SourceDataLine = " + testedSourceLine); 235 thrown.printStackTrace(out); 236 testResult = STATUS_FAILED; 237 } 238 239 out.println 240 ("\n> check SourceDataLine.write() for not started line with incorrect length of data:"); 241 writtenBytes = -1; 242 bufferSizeToWrite--; 243 try { 244 writtenBytes = testedSourceLine.write(dataToWrite, offsetToWrite, bufferSizeToWrite); 245 out.println("> Bytes written: number of written bytes = " + writtenBytes); 246 } catch (IllegalArgumentException illegalArgumentException) { 247 out.println("> Permissible IllegalArgumentException for the present instance is thrown:"); 248 illegalArgumentException.printStackTrace(out); 249 } catch (Throwable thrown) { 250 out.println("## SourceDataLine.write(byte[] b, int off, int len) failed:"); 251 out.println("# Unexpected Exception is thrown"); 252 out.println("# Mixer = " + testedMixer); 253 out.println("# SourceDataLine = " + testedSourceLine); 254 thrown.printStackTrace(out); 255 testResult = STATUS_FAILED; 256 } 257 testedSourceLine.close(); 258 259 } // for (int j=0; j < supportedSourceLineInfo.length; j++) 260 testedMixer.close(); 261 262 } // for (int i=0; i < installedMixersInfo.length; i++) 263 264 if ( testResult == STATUS_FAILED ) { 265 out.println("\n==> test FAILED!"); 266 } else { 267 out.println("\n==> test PASSED!"); 268 } 269 return testResult; 270 } 271 }