1 /* 2 * Copyright (c) 1999, 2018, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javax.sound.midi.spi; 27 28 import java.io.File; 29 import java.io.IOException; 30 import java.io.OutputStream; 31 import java.util.Arrays; 32 33 import javax.sound.midi.Sequence; 34 35 /** 36 * A {@code MidiFileWriter} supplies MIDI file-writing services. Classes that 37 * implement this interface can write one or more types of MIDI file from a 38 * {@link Sequence} object. 39 * 40 * @author Kara Kytle 41 * @since 1.3 42 */ 43 public abstract class MidiFileWriter { 44 45 /** 46 * Obtains the set of MIDI file types for which file writing support is 47 * provided by this file writer. 48 * 49 * @return array of file types. If no file types are supported, an array of 50 * length 0 is returned. 51 */ 52 public abstract int[] getMidiFileTypes(); 53 54 /** 55 * Obtains the file types that this file writer can write from the sequence 56 * specified. 57 * 58 * @param sequence the sequence for which MIDI file type support is queried 59 * @return array of file types. If no file types are supported, returns an 60 * array of length 0. 61 * @throws NullPointerException if {@code sequence} is {@code null} 62 */ 63 public abstract int[] getMidiFileTypes(Sequence sequence); 64 65 /** 66 * Indicates whether file writing support for the specified MIDI file type 67 * is provided by this file writer. 68 * 69 * @param fileType the file type for which write capabilities are queried 70 * @return {@code true} if the file type is supported, otherwise 71 * {@code false} 72 */ 73 public boolean isFileTypeSupported(final int fileType) { 74 return Arrays.stream(getMidiFileTypes()) 75 .anyMatch(type -> fileType == type); 76 } 77 78 /** 79 * Indicates whether a MIDI file of the file type specified can be written 80 * from the sequence indicated. 81 * 82 * @param fileType the file type for which write capabilities are queried 83 * @param sequence the sequence for which file writing support is queried 84 * @return {@code true} if the file type is supported for this sequence, 85 * otherwise {@code false} 86 * @throws NullPointerException if {@code sequence} is {@code null} 87 */ 88 public boolean isFileTypeSupported(final int fileType, 89 final Sequence sequence) { 90 return Arrays.stream(getMidiFileTypes(sequence)) 91 .anyMatch(type -> fileType == type); 92 } 93 94 /** 95 * Writes a stream of bytes representing a MIDI file of the file type 96 * indicated to the output stream provided. 97 * 98 * @param in sequence containing MIDI data to be written to the file 99 * @param fileType type of the file to be written to the output stream 100 * @param out stream to which the file data should be written 101 * @return the number of bytes written to the output stream 102 * @throws IOException if an I/O exception occurs 103 * @throws IllegalArgumentException if the file type is not supported by 104 * this file writer 105 * @throws NullPointerException if {@code in} or {@code out} are 106 * {@code null} 107 * @see #isFileTypeSupported(int, Sequence) 108 * @see #getMidiFileTypes(Sequence) 109 */ 110 public abstract int write(Sequence in, int fileType, OutputStream out) 111 throws IOException; 112 113 /** 114 * Writes a stream of bytes representing a MIDI file of the file type 115 * indicated to the external file provided. 116 * 117 * @param in sequence containing MIDI data to be written to the external 118 * file 119 * @param fileType type of the file to be written to the external file 120 * @param out external file to which the file data should be written 121 * @return the number of bytes written to the file 122 * @throws IOException if an I/O exception occurs 123 * @throws IllegalArgumentException if the file type is not supported by 124 * this file writer 125 * @throws NullPointerException if {@code in} or {@code out} are 126 * {@code null} 127 * @see #isFileTypeSupported(int, Sequence) 128 * @see #getMidiFileTypes(Sequence) 129 */ 130 public abstract int write(Sequence in, int fileType, File out) 131 throws IOException; 132 }