jdk/test/javax/sound/midi/Sequencer/Looping.java
changeset 41905 e8e5df013c6e
equal deleted inserted replaced
41904:524d908e49ea 41905:e8e5df013c6e
       
     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.midi.InvalidMidiDataException;
       
    25 import javax.sound.midi.MetaEventListener;
       
    26 import javax.sound.midi.MetaMessage;
       
    27 import javax.sound.midi.MidiDevice;
       
    28 import javax.sound.midi.MidiEvent;
       
    29 import javax.sound.midi.MidiSystem;
       
    30 import javax.sound.midi.Sequence;
       
    31 import javax.sound.midi.Sequencer;
       
    32 import javax.sound.midi.ShortMessage;
       
    33 import javax.sound.midi.Track;
       
    34 
       
    35 /**
       
    36  * @test
       
    37  * @bug 4204105
       
    38  * @summary RFE: add loop() method(s) to Sequencer
       
    39  * @key intermittent
       
    40  */
       
    41 public class Looping {
       
    42 
       
    43     public static void main(String[] args) throws Exception {
       
    44         out("4204105: RFE: add loop() method(s) to Sequencer");
       
    45         boolean passed = testAll();
       
    46         if (passed) {
       
    47             out("Test PASSED.");
       
    48         } else {
       
    49             throw new Exception("Test FAILED.");
       
    50         }
       
    51     }
       
    52 
       
    53     /**
       
    54      * Execute the test on all available Sequencers.
       
    55      *
       
    56      * @return true if the test passed for all Sequencers, false otherwise
       
    57      */
       
    58     private static boolean testAll() throws Exception {
       
    59         boolean result = true;
       
    60         MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
       
    61         for (int i = 0; i < devices.length; i++) {
       
    62             MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
       
    63             if (device instanceof Sequencer) {
       
    64                 result &= testSequencer((Sequencer) device);
       
    65             }
       
    66         }
       
    67         return result;
       
    68     }
       
    69 
       
    70     /**
       
    71      * Execute the test on the passed Sequencer.
       
    72      *
       
    73      * @return true if the test is passed this Sequencer, false otherwise
       
    74      */
       
    75     private static boolean testSequencer(Sequencer seq) throws Exception{
       
    76         boolean result = true;
       
    77         out("testing: " + seq);
       
    78 
       
    79         result &= testGetSet(seq);
       
    80 
       
    81         seq.setSequence(createSequence());
       
    82 
       
    83         result &= testGetSet(seq);
       
    84 
       
    85         result &= testPlay(seq);
       
    86 
       
    87         return result;
       
    88     }
       
    89 
       
    90     private static boolean testGetSet(Sequencer seq) {
       
    91         boolean result = true;
       
    92         Sequence sequence = seq.getSequence();
       
    93         boolean isSequenceLoaded = (sequence != null);
       
    94 
       
    95         out("TestGetSet");
       
    96 
       
    97         try {
       
    98             if (seq.getLoopStartPoint() != 0) {
       
    99                 out("start point", isSequenceLoaded,
       
   100                     "isn't 0!");
       
   101                 result = false;
       
   102             }
       
   103         } catch (IllegalArgumentException iae) {
       
   104             if (!isSequenceLoaded) {
       
   105                 out("Caught permissable IllegalArgumentException:");
       
   106             } else {
       
   107                 out("Threw unacceptable IllegalArgumentException! FAILED");
       
   108                 result = false;
       
   109             }
       
   110             out(iae.toString());
       
   111         }
       
   112 
       
   113         if (seq.getLoopEndPoint() != -1) {
       
   114             out("end point", isSequenceLoaded,
       
   115                 "isn't -1!");
       
   116             result = false;
       
   117         }
       
   118 
       
   119         try {
       
   120             seq.setLoopStartPoint(25);
       
   121             if (seq.getLoopStartPoint() != 25) {
       
   122                 out("setLoopStartPoint()", isSequenceLoaded,
       
   123                     "doesn't set the start point correctly!");
       
   124                 result = false;
       
   125             }
       
   126         } catch (IllegalArgumentException iae) {
       
   127             if (!isSequenceLoaded) {
       
   128                 out("Caught permissable IllegalArgumentException:");
       
   129             } else {
       
   130                 out("Threw unacceptable IllegalArgumentException! FAILED");
       
   131                 result = false;
       
   132             }
       
   133             out(iae.toString());
       
   134         }
       
   135 
       
   136         try {
       
   137             seq.setLoopEndPoint(26);
       
   138             if (seq.getLoopEndPoint() != 26) {
       
   139                 out("setLoopEndPoint()", isSequenceLoaded,
       
   140                     "doesn't set the end point correctly!");
       
   141                 result = false;
       
   142             }
       
   143         } catch (IllegalArgumentException iae) {
       
   144             if (!isSequenceLoaded) {
       
   145                 out("Caught permissable IllegalArgumentException:");
       
   146             } else {
       
   147                 out("Threw unacceptable IllegalArgumentException! FAILED");
       
   148                 result = false;
       
   149             }
       
   150             out(iae.toString());
       
   151         }
       
   152 
       
   153         try {
       
   154             seq.setLoopStartPoint(0);
       
   155             if (seq.getLoopStartPoint() != 0) {
       
   156                 out("setLoopStartPoint()", isSequenceLoaded,
       
   157                     "doesn't set the start point correctly!");
       
   158                 result = false;
       
   159             }
       
   160         } catch (IllegalArgumentException iae) {
       
   161             if (!isSequenceLoaded) {
       
   162                 out("Caught permissable IllegalArgumentException:");
       
   163             } else {
       
   164                 out("Threw unacceptable IllegalArgumentException! FAILED");
       
   165                 result = false;
       
   166             }
       
   167             out(iae.toString());
       
   168         }
       
   169 
       
   170         if (isSequenceLoaded) {
       
   171             seq.setLoopEndPoint(sequence.getTickLength());
       
   172             if (seq.getLoopEndPoint() != sequence.getTickLength()) {
       
   173                 out("setLoopEndPoint()", isSequenceLoaded,
       
   174                     "doesn't set the end point correctly!");
       
   175                 result = false;
       
   176             }
       
   177         } else {
       
   178             // fails
       
   179             seq.setLoopEndPoint(-1);
       
   180             if (seq.getLoopEndPoint() != -1) {
       
   181                 out("setLoopEndPoint()", isSequenceLoaded,
       
   182                     "doesn't set the end point correctly!");
       
   183                 result = false;
       
   184             }
       
   185         }
       
   186 
       
   187         if (seq.getLoopCount() != 0) {
       
   188             out("loop count", isSequenceLoaded,
       
   189                 "isn't 0!");
       
   190             result = false;
       
   191         }
       
   192 
       
   193         seq.setLoopCount(1001);
       
   194         if (seq.getLoopCount() != 1001) {
       
   195             out("setLoopCount()", isSequenceLoaded,
       
   196                 "doesn't set the loop count correctly!");
       
   197             result = false;
       
   198         }
       
   199 
       
   200         seq.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
       
   201         if (seq.getLoopCount() != Sequencer.LOOP_CONTINUOUSLY) {
       
   202             out("setLoopCount(Sequencer.LOOP_CONTINUOUSLY)", isSequenceLoaded,
       
   203                 "doesn't set the loop count correctly!");
       
   204             result = false;
       
   205         }
       
   206 
       
   207         try {
       
   208             seq.setLoopCount(-55);
       
   209             out("setLoopCount()", isSequenceLoaded,
       
   210                 "doesn't throw IllegalArgumentException on illegal value!");
       
   211             result = false;
       
   212         } catch (IllegalArgumentException e) {
       
   213             // EXCEPTION IS EXPECTED
       
   214             out("Caught permissable IAE");
       
   215         }
       
   216 
       
   217         seq.setLoopCount(0);
       
   218         if (seq.getLoopCount() != 0) {
       
   219             out("setLoopCount()", isSequenceLoaded,
       
   220                 "doesn't set the loop count correctly!");
       
   221             result = false;
       
   222         }
       
   223 
       
   224         return result;
       
   225     }
       
   226 
       
   227     private static boolean testPlay(Sequencer seq) {
       
   228         boolean result = true;
       
   229         long stopTime;
       
   230 
       
   231         out("TestPlay");
       
   232 
       
   233         TestMetaEventListener listener = new TestMetaEventListener();
       
   234         seq.addMetaEventListener(listener);
       
   235         long startTime = System.currentTimeMillis();
       
   236         try {
       
   237             seq.open();
       
   238             out("Playing sequence, length="+(seq.getMicrosecondLength()/1000)+"millis");
       
   239             seq.start();
       
   240             while (true) {
       
   241                 stopTime = listener.getStopTime();
       
   242                 if (stopTime != 0) {
       
   243                     break;
       
   244                 }
       
   245                 try {
       
   246                     Thread.sleep(100);
       
   247                 } catch (InterruptedException e) {
       
   248                 }
       
   249             }
       
   250             long measuredDuration = stopTime - startTime;
       
   251             out("play duration (us): " + measuredDuration);
       
   252         } catch (Exception e) {
       
   253             out("test not executed; exception:");
       
   254             e.printStackTrace();
       
   255         }
       
   256         seq.close();
       
   257         return result;
       
   258     }
       
   259 
       
   260     /**
       
   261      * Create a new Sequence for testing.
       
   262      *
       
   263      * @return a dummy Sequence, or null, if a problem occured while creating
       
   264      *         the Sequence
       
   265      */
       
   266     private static Sequence createSequence() {
       
   267         Sequence sequence = null;
       
   268         int lengthInSeconds = 2;
       
   269         long lengthInMicroseconds = lengthInSeconds * 1000000;
       
   270         int resolution = 480;
       
   271         long lengthInTicks = (lengthInMicroseconds * 120 * resolution) / 60000000l;
       
   272         out("length in ticks: " + lengthInTicks);
       
   273         try {
       
   274             sequence = new Sequence(Sequence.PPQ, resolution, 1);
       
   275             Track track = sequence.createTrack();
       
   276             ShortMessage mm = new ShortMessage();
       
   277             mm.setMessage(0xF6, 0, 0);
       
   278             MidiEvent me = new MidiEvent(mm, lengthInTicks);
       
   279             track.add(me);
       
   280         } catch (InvalidMidiDataException e) {
       
   281             // DO NOTHING
       
   282         }
       
   283         out("sequence length (ticks): " + sequence.getTickLength());
       
   284         out("sequence length (us): " + sequence.getMicrosecondLength());
       
   285         return sequence;
       
   286     }
       
   287 
       
   288 
       
   289     private static void out(String m1, boolean isSequenceLoaded, String m2) {
       
   290         out(m1 + (isSequenceLoaded ? " with Sequence " : " without Sequence ") + m2);
       
   291     }
       
   292 
       
   293     private static void out(String message) {
       
   294         System.out.println(message);
       
   295     }
       
   296 
       
   297     private static class TestMetaEventListener implements MetaEventListener {
       
   298         private long stopTime;
       
   299 
       
   300 
       
   301         public void meta(MetaMessage m) {
       
   302             System.out.print("  Got MetaMessage: ");
       
   303             if (m.getType() == 47) {
       
   304                 stopTime = System.currentTimeMillis();
       
   305                 System.out.println(" End Of Track -- OK");
       
   306             } else {
       
   307                 System.out.println(" unknown. Ignored.");
       
   308             }
       
   309         }
       
   310 
       
   311         public long getStopTime() {
       
   312             return stopTime;
       
   313         }
       
   314     }
       
   315 }