jdk/test/javax/sound/sampled/FileWriter/WriterCloseInput.java
author amenkov
Mon, 28 Feb 2011 18:36:33 +0300
changeset 8525 08f98f5a11df
child 21596 0e3a39f29dbc
permissions -rw-r--r--
7013521: AudioSystem.write for AIFF files closes source audio stream Reviewed-by: dav
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8525
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     1
/**
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     2
 * @test
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     3
 * @bug 7013521
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     4
 * @summary AIFF/AU/WAVE writers close input audio stream
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     5
 * @author Alex Menkov
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     6
 */
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     7
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     8
import java.io.ByteArrayInputStream;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
     9
import java.io.File;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    10
import java.io.IOException;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    11
import java.io.InputStream;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    12
import java.io.OutputStream;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    13
import javax.sound.sampled.AudioFileFormat;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    14
import javax.sound.sampled.AudioFormat;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    15
import javax.sound.sampled.AudioInputStream;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    16
import javax.sound.sampled.AudioSystem;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    17
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    18
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    19
public class WriterCloseInput {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    20
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    21
    final static AudioFormat audioFormat = new AudioFormat(44100f, 16, 2, true, true);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    22
    //final static AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.ULAW, 44100f, 8, 2, 2, 44100f, true);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    23
    final static int frameLength = 44100 * 2; // 2 seconds
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    24
    final static byte[] dataBuffer
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    25
            = new byte[frameLength * (audioFormat.getSampleSizeInBits()/8)
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    26
                       * audioFormat.getChannels()];
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    27
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    28
    static int testTotal = 0;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    29
    static int testFailed = 0;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    30
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    31
    public static void main(String[] args) throws Exception {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    32
        test(AudioFileFormat.Type.AIFF);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    33
        test(AudioFileFormat.Type.AU);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    34
        test(AudioFileFormat.Type.WAVE);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    35
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    36
        if (testFailed == 0) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    37
            out("All tests passed.");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    38
        } else {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    39
            out("" + testFailed + " of " + testTotal + " tests FAILED.");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    40
            System.out.flush();
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    41
            throw new RuntimeException("Test FAILED.");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    42
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    43
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    44
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    45
    static void test(AudioFileFormat.Type fileType) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    46
        test(fileType, frameLength);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    47
        test(fileType, AudioSystem.NOT_SPECIFIED);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    48
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    49
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    50
    static void test(AudioFileFormat.Type fileType, int length) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    51
        test(fileType, length, false);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    52
        test(fileType, length, true);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    53
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    54
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    55
    static void test(AudioFileFormat.Type fileType, int length, boolean isFile) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    56
        testTotal++;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    57
        out("Testing fileType: " + fileType
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    58
                + ", frameLength: " + (length >= 0 ? length : "unspecified")
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    59
                + ", output: " + (isFile ? "File" : "OutputStream"));
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    60
        AudioInputStream inStream = new ThrowAfterCloseStream(
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    61
                new ByteArrayInputStream(dataBuffer), audioFormat, length);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    62
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    63
        AudioSystem.isFileTypeSupported(fileType, inStream);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    64
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    65
        try {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    66
            if (isFile) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    67
                File f = File.createTempFile("WriterCloseInput" + testTotal, "tmp");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    68
                AudioSystem.write(inStream, fileType, f);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    69
                f.delete();
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    70
            } else {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    71
                OutputStream outStream = new NullOutputStream();
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    72
                AudioSystem.write(inStream, fileType, outStream);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    73
            }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    74
        } catch (Exception ex) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    75
            // this is not failure
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    76
            out("SKIPPED (AudioSystem.write exception): " + ex.getMessage());
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    77
            //out(ex);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    78
            inStream = null;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    79
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    80
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    81
        if (inStream != null) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    82
            try {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    83
                // test if the stream is closed
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    84
                inStream.available();
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    85
                out("PASSED");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    86
            } catch (IOException ex) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    87
                testFailed++;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    88
                out("FAILED: " + ex.getMessage());
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    89
                //out(ex);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    90
            }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    91
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    92
        out("");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    93
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    94
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    95
    static class ThrowAfterCloseStream extends AudioInputStream {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    96
        private boolean closed = false;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    97
        public ThrowAfterCloseStream(InputStream in, AudioFormat format, long length) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    98
            super(in, format, length);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
    99
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   100
        @Override
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   101
        public void close() {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   102
            closed = true;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   103
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   104
        @Override
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   105
        public int available() throws IOException {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   106
            if (closed) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   107
                throw new IOException("The stream has been closed");
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   108
            }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   109
            return 1;
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   110
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   111
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   112
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   113
    static class NullOutputStream extends OutputStream {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   114
        @Override
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   115
        public void write(int b) throws IOException {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   116
            // nop
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   117
        }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   118
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   119
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   120
    static void out(String s) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   121
        System.out.println(s);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   122
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   123
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   124
    static void out(Exception ex) {
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   125
        ex.printStackTrace(System.out);
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   126
    }
08f98f5a11df 7013521: AudioSystem.write for AIFF files closes source audio stream
amenkov
parents:
diff changeset
   127
}