| 1 7 8 package javax.sound.midi; 9 10 import java.io.FileInputStream ; 11 import java.io.File ; 12 import java.io.InputStream ; 13 import java.io.OutputStream ; 14 import java.io.IOException ; 15 16 import java.util.ArrayList ; 17 import java.util.HashSet ; 18 import java.util.Iterator ; 19 import java.util.List ; 20 import java.util.Set ; 21 22 import java.net.URL ; 23 24 import javax.sound.midi.spi.MidiFileWriter ; 25 import javax.sound.midi.spi.MidiFileReader ; 26 import javax.sound.midi.spi.SoundbankReader ; 27 import javax.sound.midi.spi.MidiDeviceProvider ; 28 29 import com.sun.media.sound.JDK13Services; 30 import com.sun.media.sound.ReferenceCountingDevice; 31 import com.sun.media.sound.AutoConnectSequencer; 32 33 34 147 public class MidiSystem { 148 149 152 private MidiSystem() { 153 } 154 155 156 167 public static MidiDevice.Info [] getMidiDeviceInfo() { 168 List allInfos = new ArrayList (); 169 List providers = getMidiDeviceProviders(); 170 171 for(int i = 0; i < providers.size(); i++) { 172 MidiDeviceProvider provider = (MidiDeviceProvider ) providers.get(i); 173 MidiDevice.Info [] tmpinfo = provider.getDeviceInfo(); 174 for (int j = 0; j < tmpinfo.length; j++) { 175 allInfos.add( tmpinfo[j] ); 176 } 177 } 178 MidiDevice.Info [] infosArray = (MidiDevice.Info []) allInfos.toArray(new MidiDevice.Info [0]); 179 return infosArray; 180 } 181 182 183 194 public static MidiDevice getMidiDevice(MidiDevice.Info info) throws MidiUnavailableException { 195 List providers = getMidiDeviceProviders(); 196 197 for(int i = 0; i < providers.size(); i++) { 198 MidiDeviceProvider provider = (MidiDeviceProvider ) providers.get(i); 199 if (provider.isDeviceSupported(info)) { 200 MidiDevice device = provider.getDevice(info); 201 return device; 202 } 203 } 204 throw new IllegalArgumentException ("Requested device not installed: " + info); 205 } 206 207 208 238 public static Receiver getReceiver() throws MidiUnavailableException { 239 MidiDevice device = getDefaultDeviceWrapper(Receiver .class); 241 Receiver receiver; 242 if (device instanceof ReferenceCountingDevice) { 243 receiver = ((ReferenceCountingDevice) device).getReceiverReferenceCounting(); 244 } else { 245 receiver = device.getReceiver(); 246 } 247 return receiver; 248 } 249 250 251 278 public static Transmitter getTransmitter() throws MidiUnavailableException { 279 MidiDevice device = getDefaultDeviceWrapper(Transmitter .class); 281 Transmitter transmitter; 282 if (device instanceof ReferenceCountingDevice) { 283 transmitter = ((ReferenceCountingDevice) device).getTransmitterReferenceCounting(); 284 } else { 285 transmitter = device.getTransmitter(); 286 } 287 return transmitter; 288 } 289 290 291 305 public static Synthesizer getSynthesizer() throws MidiUnavailableException { 306 return (Synthesizer ) getDefaultDeviceWrapper(Synthesizer .class); 308 } 309 310 311 347 public static Sequencer getSequencer() throws MidiUnavailableException { 348 return getSequencer(true); 349 } 350 351 352 353 396 public static Sequencer getSequencer(boolean connected) 397 throws MidiUnavailableException { 398 Sequencer seq = (Sequencer ) getDefaultDeviceWrapper(Sequencer .class); 399 400 if (connected) { 401 407 Receiver rec = null; 408 MidiUnavailableException mue = null; 409 410 try { 412 Synthesizer synth = getSynthesizer(); 413 if (synth instanceof ReferenceCountingDevice) { 414 rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting(); 415 if (synth.getClass().toString().contains("com.sun.media.sound.MixerSynth") 417 && (synth.getDefaultSoundbank() == null)) { 418 rec = null; 420 synth.close(); 421 } 422 } else { 423 synth.open(); 424 try { 425 rec = synth.getReceiver(); 426 } finally { 427 if (rec == null) { 429 synth.close(); 430 } 431 } 432 } 433 } catch (MidiUnavailableException e) { 434 if (e instanceof MidiUnavailableException ) { 436 mue = (MidiUnavailableException ) e; 437 } 438 } 439 if (rec == null) { 440 try { 442 rec = MidiSystem.getReceiver(); 443 } catch (Exception e) { 444 if (e instanceof MidiUnavailableException ) { 446 mue = (MidiUnavailableException ) e; 447 } 448 } 449 } 450 if (rec != null) { 451 seq.getTransmitter().setReceiver(rec); 452 if (seq instanceof AutoConnectSequencer) { 453 ((AutoConnectSequencer) seq).setAutoConnect(rec); 454 } 455 } else { 456 if (mue != null) { 457 throw mue; 458 } 459 throw new MidiUnavailableException ("no receiver available"); 460 } 461 } 462 return seq; 463 } 464 465 466 467 468 486 public static Soundbank getSoundbank(InputStream stream) 487 throws InvalidMidiDataException , IOException { 488 489 SoundbankReader sp = null; 490 Soundbank s = null; 491 492 List providers = getSoundbankReaders(); 493 494 for(int i = 0; i < providers.size(); i++) { 495 sp = (SoundbankReader )providers.get(i); 496 s = sp.getSoundbank(stream); 497 498 if( s!= null) { 499 return s; 500 } 501 } 502 throw new InvalidMidiDataException ("cannot get soundbank from stream"); 503 504 } 505 506 507 517 public static Soundbank getSoundbank(URL url) 518 throws InvalidMidiDataException , IOException { 519 520 SoundbankReader sp = null; 521 Soundbank s = null; 522 523 List providers = getSoundbankReaders(); 524 525 for(int i = 0; i < providers.size(); i++) { 526 sp = (SoundbankReader )providers.get(i); 527 s = sp.getSoundbank(url); 528 529 if( s!= null) { 530 return s; 531 } 532 } 533 throw new InvalidMidiDataException ("cannot get soundbank from stream"); 534 535 } 536 537 538 549 public static Soundbank getSoundbank(File file) 550 throws InvalidMidiDataException , IOException { 551 552 SoundbankReader sp = null; 553 Soundbank s = null; 554 555 List providers = getSoundbankReaders(); 556 557 for(int i = 0; i < providers.size(); i++) { 558 sp = (SoundbankReader )providers.get(i); 559 s = sp.getSoundbank(file); 560 561 if( s!= null) { 562 return s; 563 } 564 } 565 throw new InvalidMidiDataException ("cannot get soundbank from stream"); 566 } 567 568 569 570 602 public static MidiFileFormat getMidiFileFormat(InputStream stream) 603 throws InvalidMidiDataException , IOException { 604 605 List providers = getMidiFileReaders(); 606 MidiFileFormat format = null; 607 608 for(int i = 0; i < providers.size(); i++) { 609 MidiFileReader reader = (MidiFileReader ) providers.get(i); 610 try { 611 format = reader.getMidiFileFormat( stream ); break; 613 } catch (InvalidMidiDataException e) { 614 continue; 615 } 616 } 617 618 if( format==null ) { 619 throw new InvalidMidiDataException ("input stream is not a supported file type"); 620 } else { 621 return format; 622 } 623 } 624 625 626 648 public static MidiFileFormat getMidiFileFormat(URL url) 649 throws InvalidMidiDataException , IOException { 650 651 List providers = getMidiFileReaders(); 652 MidiFileFormat format = null; 653 654 for(int i = 0; i < providers.size(); i++) { 655 MidiFileReader reader = (MidiFileReader ) providers.get(i); 656 try { 657 format = reader.getMidiFileFormat( url ); break; 659 } catch (InvalidMidiDataException e) { 660 continue; 661 } 662 } 663 664 if( format==null ) { 665 throw new InvalidMidiDataException ("url is not a supported file type"); 666 } else { 667 return format; 668 } 669 } 670 671 672 694 public static MidiFileFormat getMidiFileFormat(File file) 695 throws InvalidMidiDataException , IOException { 696 697 List providers = getMidiFileReaders(); 698 MidiFileFormat format = null; 699 700 for(int i = 0; i < providers.size(); i++) { 701 MidiFileReader reader = (MidiFileReader ) providers.get(i); 702 try { 703 format = reader.getMidiFileFormat( file ); break; 705 } catch (InvalidMidiDataException e) { 706 continue; 707 } 708 } 709 710 if( format==null ) { 711 throw new InvalidMidiDataException ("file is not a supported file type"); 712 } else { 713 return format; 714 } 715 } 716 717 718 749 public static Sequence getSequence(InputStream stream) 750 throws InvalidMidiDataException , IOException { 751 752 List providers = getMidiFileReaders(); 753 Sequence sequence = null; 754 755 for(int i = 0; i < providers.size(); i++) { 756 MidiFileReader reader = (MidiFileReader ) providers.get(i); 757 try { 758 sequence = reader.getSequence( stream ); break; 760 } catch (InvalidMidiDataException e) { 761 continue; 762 } 763 } 764 765 if( sequence==null ) { 766 throw new InvalidMidiDataException ("could not get sequence from input stream"); 767 } else { 768 return sequence; 769 } 770 } 771 772 773 793 public static Sequence getSequence(URL url) 794 throws InvalidMidiDataException , IOException { 795 796 List providers = getMidiFileReaders(); 797 Sequence sequence = null; 798 799 for(int i = 0; i < providers.size(); i++) { 800 MidiFileReader reader = (MidiFileReader ) providers.get(i); 801 try { 802 sequence = reader.getSequence( url ); break; 804 } catch (InvalidMidiDataException e) { 805 continue; 806 } 807 } 808 809 if( sequence==null ) { 810 throw new InvalidMidiDataException ("could not get sequence from URL"); 811 } else { 812 return sequence; 813 } 814 } 815 816 817 837 public static Sequence getSequence(File file) 838 throws InvalidMidiDataException , IOException { 839 840 List providers = getMidiFileReaders(); 841 Sequence sequence = null; 842 843 for(int i = 0; i < providers.size(); i++) { 844 MidiFileReader reader = (MidiFileReader ) providers.get(i); 845 try { 846 sequence = reader.getSequence( file ); break; 848 } catch (InvalidMidiDataException e) { 849 continue; 850 } 851 } 852 853 if( sequence==null ) { 854 throw new InvalidMidiDataException ("could not get sequence from file"); 855 } else { 856 return sequence; 857 } 858 } 859 860 861 867 public static int[] getMidiFileTypes() { 868 869 List providers = getMidiFileWriters(); 870 Set allTypes = new HashSet (); 871 872 874 for (int i = 0; i < providers.size(); i++ ) { 875 MidiFileWriter writer = (MidiFileWriter ) providers.get(i); 876 int[] types = writer.getMidiFileTypes(); 877 for (int j = 0; j < types.length; j++ ) { 878 allTypes.add(new Integer (types[j])); 879 } 880 } 881 int resultTypes[] = new int[allTypes.size()]; 882 int index = 0; 8
|