| 1 7 8 package javax.sound.sampled; 9 10 import java.io.File ; 11 import java.io.InputStream ; 12 import java.io.IOException ; 13 import java.io.OutputStream ; 14 import java.net.URL ; 15 16 import java.util.HashSet ; 17 import java.util.List ; 18 import java.util.Set ; 19 import java.util.Vector ; 20 import java.util.ArrayList ; 21 22 import javax.sound.sampled.spi.AudioFileWriter ; 23 import javax.sound.sampled.spi.AudioFileReader ; 24 import javax.sound.sampled.spi.FormatConversionProvider ; 25 import javax.sound.sampled.spi.MixerProvider ; 26 27 import com.sun.media.sound.JDK13Services; 28 29 32 33 34 151 public class AudioSystem { 152 153 162 public static final int NOT_SPECIFIED = -1; 163 164 167 private AudioSystem() { 168 } 169 170 171 178 public static Mixer.Info [] getMixerInfo() { 179 180 List infos = getMixerInfoList(); 181 Mixer.Info [] allInfos = (Mixer.Info []) infos.toArray(new Mixer.Info [infos.size()]); 182 return allInfos; 183 } 184 185 186 197 public static Mixer getMixer(Mixer.Info info) { 198 199 Mixer mixer = null; 200 List providers = getMixerProviders(); 201 202 for(int i = 0; i < providers.size(); i++ ) { 203 204 try { 205 return ((MixerProvider )providers.get(i)).getMixer(info); 206 207 } catch (IllegalArgumentException e) { 208 } catch (NullPointerException e) { 209 } 216 } 217 218 if (info == null) { 220 for(int i = 0; i < providers.size(); i++ ) { 221 try { 222 MixerProvider provider = (MixerProvider ) providers.get(i); 223 Mixer.Info [] infos = provider.getMixerInfo(); 224 for (int ii = 0; ii < infos.length; ii++) { 226 try { 227 return provider.getMixer(infos[ii]); 228 } catch (IllegalArgumentException e) { 229 } 231 } 232 } catch (IllegalArgumentException e) { 233 } catch (NullPointerException e) { 234 } 235 } 236 } 237 238 239 throw new IllegalArgumentException ("Mixer not supported: " 240 + (info!=null?info.toString():"null")); 241 } 242 243 244 256 public static Line.Info [] getSourceLineInfo(Line.Info info) { 257 258 Vector vector = new Vector (); 259 Line.Info [] currentInfoArray; 260 261 Mixer mixer; 262 Line.Info fullInfo = null; 263 Mixer.Info [] infoArray = getMixerInfo(); 264 265 for (int i = 0; i < infoArray.length; i++) { 266 267 mixer = getMixer(infoArray[i]); 268 269 currentInfoArray = mixer.getSourceLineInfo(info); 270 for (int j = 0; j < currentInfoArray.length; j++) { 271 vector.addElement(currentInfoArray[j]); 272 } 273 } 274 275 Line.Info [] returnedArray = new Line.Info [vector.size()]; 276 277 for (int i = 0; i < returnedArray.length; i++) { 278 returnedArray[i] = (Line.Info )vector.get(i); 279 } 280 281 return returnedArray; 282 } 283 284 285 296 public static Line.Info [] getTargetLineInfo(Line.Info info) { 297 298 Vector vector = new Vector (); 299 Line.Info [] currentInfoArray; 300 301 Mixer mixer; 302 Line.Info fullInfo = null; 303 Mixer.Info [] infoArray = getMixerInfo(); 304 305 for (int i = 0; i < infoArray.length; i++) { 306 307 mixer = getMixer(infoArray[i]); 308 309 currentInfoArray = mixer.getTargetLineInfo(info); 310 for (int j = 0; j < currentInfoArray.length; j++) { 311 vector.addElement(currentInfoArray[j]); 312 } 313 } 314 315 Line.Info [] returnedArray = new Line.Info [vector.size()]; 316 317 for (int i = 0; i < returnedArray.length; i++) { 318 returnedArray[i] = (Line.Info )vector.get(i); 319 } 320 321 return returnedArray; 322 } 323 324 325 335 public static boolean isLineSupported(Line.Info info) { 336 337 Mixer mixer; 338 Mixer.Info [] infoArray = getMixerInfo(); 339 340 for (int i = 0; i < infoArray.length; i++) { 341 342 if( infoArray[i] != null ) { 343 mixer = getMixer(infoArray[i]); 344 if (mixer.isLineSupported(info)) { 345 return true; 346 } 347 } 348 } 349 350 return false; 351 } 352 353 390 public static Line getLine(Line.Info info) throws LineUnavailableException { 391 LineUnavailableException lue = null; 392 List providers = getMixerProviders(); 393 394 395 try { 397 Mixer mixer = getDefaultMixer(providers, info); 398 if (mixer != null && mixer.isLineSupported(info)) { 399 return mixer.getLine(info); 400 } 401 } catch (LineUnavailableException e) { 402 lue = e; 403 } catch (IllegalArgumentException iae) { 404 } 407 408 409 for(int i = 0; i < providers.size(); i++) { 411 MixerProvider provider = (MixerProvider ) providers.get(i); 412 Mixer.Info [] infos = provider.getMixerInfo(); 413 414 for (int j = 0; j < infos.length; j++) { 415 try { 416 Mixer mixer = provider.getMixer(infos[j]); 417 if (isAppropriateMixer(mixer, info, true)) { 419 return mixer.getLine(info); 420 } 421 } catch (LineUnavailableException e) { 422 lue = e; 423 } catch (IllegalArgumentException iae) { 424 } 427 } 428 } 429 430 431 for(int i = 0; i < providers.size(); i++) { 433 MixerProvider provider = (MixerProvider ) providers.get(i); 434 Mixer.Info [] infos = provider.getMixerInfo(); 435 for (int j = 0; j < infos.length; j++) { 436 try { 437 Mixer mixer = provider.getMixer(infos[j]); 438 if (isAppropriateMixer(mixer, info, false)) { 440 return mixer.getLine(info); 441 } 442 } catch (LineUnavailableException e) { 443 lue = e; 444 } catch (IllegalArgumentException iae) { 445 } 448 } 449 } 450 451 if (lue != null) { 454 throw lue; 455 } 456 457 throw new IllegalArgumentException ("No line matching " + 460 info.toString() + " is supported."); 461 } 462 463 464 497 public static Clip getClip() throws LineUnavailableException { 498 AudioFormat format = new AudioFormat (AudioFormat.Encoding.PCM_SIGNED, 499 AudioSystem.NOT_SPECIFIED, 500 16, 2, 4, 501 AudioSystem.NOT_SPECIFIED, true); 502 DataLine.Info info = new DataLine.Info (Clip .class, format); 503 return (Clip ) AudioSystem.getLine(info); 504 } 505 506 507 532 public static Clip getClip(Mixer.Info mixerInfo) throws LineUnavailableException { 533 AudioFormat format = new AudioFormat (AudioFormat.Encoding.PCM_SIGNED, 534 AudioSystem.NOT_SPECIFIED, 535 16, 2, 4, 536 AudioSystem.NOT_SPECIFIED, true); 537 DataLine.Info info = new DataLine.Info (Clip .class, format); 538 Mixer mixer = AudioSystem.getMixer(mixerInfo); 539 return (Clip ) mixer.getLine(info); 540 } 541 542 543 584 public static SourceDataLine getSourceDataLine(AudioFormat format) 585 throws LineUnavailableException { 586 DataLine.Info info = new DataLine.Info (SourceDataLine .class, format); 587 return (SourceDataLine ) AudioSystem.getLine(info); 588 } 589 590 591 628 public static SourceDataLine getSourceDataLine(AudioFormat format, 629 Mixer.Info mixerinfo) 630 throws LineUnavailableException { 631 DataLine.Info info = new DataLine.Info (SourceDataLine .class, format); 632 Mixer mixer = AudioSystem.getMixer(mixerinfo); 633 return (SourceDataLine ) mixer.getLine(info); 634 } 635 636 637 673 public static TargetDataLine getTargetDataLine(AudioFormat format) 674 throws LineUnavailableException { 675 676 DataLine.Info info = new DataLine.Info (TargetDataLine .class, format); 677 return (TargetDataLine ) AudioSystem.getLine(info); 678 } 679 680 681 682 725 public static TargetDataLine getTargetDataLine(AudioFormat format, 726 Mixer.Info mixerinfo) 727 throws LineUnavailableException { 728 729 DataLine.Info info = new DataLine.Info (TargetDataLine .class, format); 730 Mixer mixer = AudioSystem.getMixer(mixerinfo); 731 return (TargetDataLine ) mixer.getLine(info); 732 } 733 734 735 746 public static AudioFormat.Encoding [] getTargetEncodings(AudioFormat.Encoding sourceEncoding) { 747 748 List codecs = getFormatConversionProviders(); 749 Vector encodings = new Vector (); 750 751 AudioFormat.Encoding encs[] = null; 752 753 for(int i=0; i<codecs.size(); i++ ) { 755 FormatConversionProvider codec = (FormatConversionProvider ) codecs.get(i); 756 if( codec.isSourceEncodingSupported( sourceEncoding ) ) { 757 encs = codec.getTargetEncodings(); 758 for (int j = 0; j < encs.length; j++) { 759 encodings.addElement( encs[j] ); 760 } 761 } 762 } 763 AudioFormat.Encoding encs2[] = (AudioFormat.Encoding []) encodings.toArray(new AudioFormat.Encoding [0]); 764 return encs2; 765 } 766 767 768 769 780 public static AudioFormat.Encoding [] getTargetEncodings(AudioFormat sourceFormat) { 781 782 783 List codecs = getFormatConversionProviders(); 784 Vector encodings = new Vector (); 785 786 int size = 0; 787 int index = 0; 788 AudioFormat.Encoding encs[] = null; 789 790 792 for(int i=0; i<codecs.size(); i++ ) { 793 encs = ((FormatConversionProvider ) codecs.get(i)).getTargetEncodings(sourceFormat); 794 size += encs.length; 795 encodings.addElement( encs ); 796 } 797 798 800 AudioFormat.Encoding encs2[] = new AudioFormat.Encoding [size]; 801 for(int i=0; i<encodings.size(); i++ ) { 802 encs = (AudioFormat.Encoding [])(encodings.get(i)); 803 for(int j=0; j<encs.length; j++ ) { 804 encs2[index++] = encs[j]; 805 } 806 } 807 return encs2; 808 } 809 810 811 820 public static boolean isConversionSupported(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { 821 822 823 List codecs = getFormatConversionProviders(); 824 825 for(int i=0; i<codecs.size(); i++ ) { 826 FormatConversionProvider codec = (FormatConversionProvider ) codecs.get(i); 827 if(codec.isConversionSupported(targetEncoding,sourceFormat) ) { 828 return true; 829 } 830 } 831 return false; 832 } 833 834 835 847 public static AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, 848 AudioInputStream sourceStream) { 849 850 List codecs = getFormatConversionProviders(); 851 852 for(int i = 0; i < codecs.size(); i++) { 853 FormatConversionProvider codec = (FormatConversionProvider ) codecs.get(i); 854 if( codec.isConversionSupported( targetEncoding, sourceStream.getFormat() ) ) { 855 return codec.getAudioInputStream( targetEncoding, sourceStream ); 856 } 857 } 858 throw new IllegalArgumentException ("Unsupported conversion: " + targetEncoding + " from " + sourceStream.getFormat()); 860 } 861 862 863 872 public static AudioFormat [] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat  |