jdk/test/javax/sound/sampled/Mixers/BothEndiansAndSigns.java
author serb
Mon, 31 Oct 2016 14:50:09 +0300
changeset 41905 e8e5df013c6e
permissions -rw-r--r--
8167615: Opensource unit/regression tests for JavaSound Reviewed-by: amenkov

/*
 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Line;
import javax.sound.sampled.Mixer;

/**
 * @test
 * @bug 4936397
 * @summary Verify that there'll for a given endianness, there's also the little
 *          endian version
 */
public class BothEndiansAndSigns {
    static boolean failed = false;
    static int testedFormats = 0;

    public static void main(String[] args) throws Exception {
        out("4936397: Verify that there'll for a given endianness, there's also the little endian version");
        out("         and the same for signed'ness for 8-bit formats");

        Mixer.Info[] aInfos = AudioSystem.getMixerInfo();
        for (int i = 0; i < aInfos.length; i++) {
            try {
                Mixer mixer = AudioSystem.getMixer(aInfos[i]);
                out("Mixer "+aInfos[i]);
                checkLines(mixer, mixer.getSourceLineInfo());
                checkLines(mixer, mixer.getTargetLineInfo());
            } catch (Exception e) {
                out("Unexpected exception when getting a mixer: "+e);
            }
        }
        if (testedFormats == 0) {
            out("[No appropriate lines available] - cannot exercise this test.");
        } else {
            if (failed) {
                throw new Exception("Test FAILED!");
            }
            out("Test passed");
        }
    }

    public static void checkLines(Mixer mixer, Line.Info[] infos) {
        for (int i = 0; i<infos.length; i++) {
            try {
                if (infos[i] instanceof DataLine.Info) {
                    DataLine.Info info = (DataLine.Info) infos[i];
                    System.out.println(" Line "+info+" (max. "+mixer.getMaxLines(info)+" simultaneously): ");
                    AudioFormat[] formats = info.getFormats();
                    for (int f = 0; f < formats.length; f++) {
                        try {
                            AudioFormat otherEndianOrSign = getOtherEndianOrSign(formats[f]);
                            if (otherEndianOrSign != null) {
                                checkFormat(formats, otherEndianOrSign);
                            }
                        } catch (Exception e1) {
                            out("  Unexpected exception when getting a format: "+e1);
                        }
                    }
                }
            } catch (Exception e) {
                out(" Unexpected exception when getting a line: "+e);
            }
        }
    }

    public static void checkFormat(AudioFormat[] formats, AudioFormat format) {
        for (int i = 0; i < formats.length; i++) {
            testedFormats++;
            if (formats[i].matches(format)) {
                return;
            }
        }
        out("  ## expected this format: "+format
            +" ("+format.getChannels()+" channels, "
            +"frameSize="+format.getFrameSize()+", "
            +(format.isBigEndian()?"big endian":"little endian")
            +")");
        failed = true;
    }

    public static AudioFormat getOtherEndianOrSign(AudioFormat format) {
        AudioFormat.Encoding newEnc = null;
        boolean newEndian = format.isBigEndian();
        boolean isSigned = format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED);
        boolean isUnsigned = format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED);
        if ((isSigned || isUnsigned) && format.getSampleSizeInBits() > 0) {
            if (format.getSampleSizeInBits() == 8) {
                // return the other signed'ness
                if (isSigned) {
                    newEnc = AudioFormat.Encoding.PCM_UNSIGNED;
                } else {
                    newEnc = AudioFormat.Encoding.PCM_SIGNED;
                }
            } else {
                newEnc = format.getEncoding();
                newEndian = !newEndian;
            }
            if (newEnc != null) {
                return new AudioFormat(newEnc, format.getSampleRate(),
                                       format.getSampleSizeInBits(),
                                       format.getChannels(),
                                       format.getFrameSize(),
                                       format.getFrameRate(),
                                       newEndian);
            }
        }
        return null;
    }

    static void out(String s) {
        System.out.println(s); System.out.flush();
    }
}