jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramAndBankChange.java
author yan
Tue, 23 Jun 2015 11:59:27 +0300
changeset 31448 1066345d2a8a
parent 23010 6dadb192ad81
permissions -rw-r--r--
8076468: Add @modules to tests in jdk_desktop test group Reviewed-by: yan, alexsch

/*
 * Copyright (c) 2010, 2015, 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.
 */

/* @test
   @summary Test SoftChannel program and bank change
   @modules java.desktop/com.sun.media.sound
*/

import java.io.IOException;

import javax.sound.midi.*;
import javax.sound.sampled.*;

import com.sun.media.sound.*;

public class ProgramAndBankChange {

    private static SimpleInstrument generateTestInstrument(Patch patch) {
        ModelOscillator osc = new ModelOscillator() {
            public float getAttenuation() {
                return 0;
            }

            public int getChannels() {
                return 1;
            }

            public ModelOscillatorStream open(float samplerate) {
                return new ModelOscillatorStream() {
                    public void close() throws IOException {
                    }

                    public void noteOff(int velocity) {
                    }

                    public void noteOn(MidiChannel channel, VoiceStatus voice,
                            int noteNumber, int velocity) {
                    }

                    public int read(float[][] buffer, int offset, int len)
                            throws IOException {
                        return len;
                    }

                    public void setPitch(float ipitch) {
                    }
                };
            }
        };
        ModelPerformer performer = new ModelPerformer();
        performer.getOscillators().add(osc);
        SimpleInstrument testinstrument = new SimpleInstrument();
        testinstrument.setPatch(patch);
        testinstrument.add(performer);
        return testinstrument;
    }

    private static void assertTrue(boolean value) throws Exception {
        if (!value)
            throw new RuntimeException("assertTrue fails!");
    }

    private static void testProgramAndBank(SoftSynthesizer soft,
            AudioInputStream stream, Patch patch) throws Exception {

        int program = patch.getProgram();
        int bank = patch.getBank();

        MidiChannel channel = soft.getChannels()[0];
        byte[] buff = new byte[2048];

        channel.programChange(bank, program);
        channel.noteOn(64, 64);
        stream.read(buff, 0, buff.length);

        int foundprogram = -1;
        int foundbank = -1;
        VoiceStatus[] vstatus = soft.getVoiceStatus();
        for (int i = 0; i < vstatus.length; i++) {
            if (vstatus[i].active) {
                foundprogram = vstatus[i].program;
                foundbank = vstatus[i].bank;
                break;
            }
        }

        assertTrue(foundprogram == program);
        assertTrue(foundbank == bank);

        channel.noteOn(64, 0);
        stream.read(buff, 0, buff.length);

        channel = soft.getChannels()[1];
        // Send MSB Bank
        channel.controlChange(0x00, bank / 128);
        // Send LSB Bank
        channel.controlChange(0x20, bank % 128);
        // Send Program Change
        channel.programChange(program);
        channel.noteOn(64, 64);
        stream.read(buff, 0, buff.length);

        foundprogram = -1;
        foundbank = -1;
        vstatus = soft.getVoiceStatus();
        for (int i = 0; i < vstatus.length; i++) {
            if (vstatus[i].active) {
                foundprogram = vstatus[i].program;
                foundbank = vstatus[i].bank;
                break;
            }
        }
        assertTrue(foundprogram == program);
        assertTrue(foundbank == bank);
        channel.noteOn(64, 0);
        stream.read(buff, 0, buff.length);
    }

    public static void main(String[] args) throws Exception {
        SoftSynthesizer soft = new SoftSynthesizer();
        AudioInputStream stream = soft.openStream(null, null);
        soft.unloadAllInstruments(soft.getDefaultSoundbank());

        soft.loadInstrument(generateTestInstrument(new Patch(0, 0)));
        soft.loadInstrument(generateTestInstrument(new Patch(7, 0)));
        soft.loadInstrument(generateTestInstrument(new Patch(20, 10)));
        soft.loadInstrument(generateTestInstrument(new Patch(3678, 15)));
        soft.loadInstrument(generateTestInstrument(new Patch(4678, 15)));

        testProgramAndBank(soft, stream, new Patch(0, 0));
        testProgramAndBank(soft, stream, new Patch(7, 0));
        testProgramAndBank(soft, stream, new Patch(20, 10));
        testProgramAndBank(soft, stream, new Patch(3678, 15));
        testProgramAndBank(soft, stream, new Patch(4678, 15));

        soft.close();
    }
}