mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 12:34:32 +02:00
6821030: Merge OpenJDK Gervill with upstream sources, Q1CY2009
Reviewed-by: darcy, amenkov
This commit is contained in:
parent
9a0763bf6b
commit
b136abc344
9 changed files with 283 additions and 37 deletions
|
@ -54,6 +54,7 @@ public class SoftAudioPusher implements Runnable {
|
||||||
return;
|
return;
|
||||||
active = true;
|
active = true;
|
||||||
audiothread = new Thread(this);
|
audiothread = new Thread(this);
|
||||||
|
audiothread.setDaemon(true);
|
||||||
audiothread.setPriority(Thread.MAX_PRIORITY);
|
audiothread.setPriority(Thread.MAX_PRIORITY);
|
||||||
audiothread.start();
|
audiothread.start();
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer {
|
||||||
dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth)
|
dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth)
|
||||||
dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay)
|
dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay)
|
||||||
dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined)
|
dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined)
|
||||||
|
dontResetControls[84] = true; // Portamento Controller
|
||||||
dontResetControls[120] = true; // All Sound Off
|
dontResetControls[120] = true; // All Sound Off
|
||||||
dontResetControls[121] = true; // Reset All Controllers
|
dontResetControls[121] = true; // Reset All Controllers
|
||||||
dontResetControls[122] = true; // Local Control On/Off
|
dontResetControls[122] = true; // Local Control On/Off
|
||||||
|
@ -556,6 +557,18 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer {
|
||||||
&& voices[i].releaseTriggered == false) {
|
&& voices[i].releaseTriggered == false) {
|
||||||
voices[i].noteOff(velocity);
|
voices[i].noteOff(velocity);
|
||||||
}
|
}
|
||||||
|
// We must also check stolen voices
|
||||||
|
if (voices[i].stealer_channel == this && voices[i].stealer_noteNumber == noteNumber) {
|
||||||
|
SoftVoice v = voices[i];
|
||||||
|
v.stealer_releaseTriggered = false;
|
||||||
|
v.stealer_channel = null;
|
||||||
|
v.stealer_performer = null;
|
||||||
|
v.stealer_voiceID = -1;
|
||||||
|
v.stealer_noteNumber = 0;
|
||||||
|
v.stealer_velocity = 0;
|
||||||
|
v.stealer_extendedConnectionBlocks = null;
|
||||||
|
v.stealer_channelmixer = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try play back note-off triggered voices,
|
// Try play back note-off triggered voices,
|
||||||
|
@ -1385,6 +1398,10 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer {
|
||||||
controlChange(i, 0);
|
controlChange(i, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Portamento Controller (0x54) has to reset
|
||||||
|
// to -1 which mean that Portamento Controller is off
|
||||||
|
portamento_control_note = -1;
|
||||||
|
|
||||||
controlChange(71, 64); // Filter Resonance
|
controlChange(71, 64); // Filter Resonance
|
||||||
controlChange(72, 64); // Release Time
|
controlChange(72, 64); // Release Time
|
||||||
controlChange(73, 64); // Attack Time
|
controlChange(73, 64); // Attack Time
|
||||||
|
|
|
@ -38,11 +38,11 @@ public class SoftChorus implements SoftAudioProcessor {
|
||||||
|
|
||||||
private float[] delaybuffer;
|
private float[] delaybuffer;
|
||||||
private int rovepos = 0;
|
private int rovepos = 0;
|
||||||
private volatile float gain = 1;
|
private float gain = 1;
|
||||||
private volatile float rgain = 0;
|
private float rgain = 0;
|
||||||
private volatile float delay = 0;
|
private float delay = 0;
|
||||||
private float lastdelay = 0;
|
private float lastdelay = 0;
|
||||||
private volatile float feedback = 0;
|
private float feedback = 0;
|
||||||
|
|
||||||
public VariableDelay(int maxbuffersize) {
|
public VariableDelay(int maxbuffersize) {
|
||||||
delaybuffer = new float[maxbuffersize];
|
delaybuffer = new float[maxbuffersize];
|
||||||
|
@ -115,10 +115,8 @@ public class SoftChorus implements SoftAudioProcessor {
|
||||||
|
|
||||||
private static class LFODelay {
|
private static class LFODelay {
|
||||||
|
|
||||||
private volatile double c_cos_delta;
|
private double phase = 1;
|
||||||
private volatile double c_sin_delta;
|
private double phase_step = 0;
|
||||||
private double c_cos = 1;
|
|
||||||
private double c_sin = 0;
|
|
||||||
private double depth = 0;
|
private double depth = 0;
|
||||||
private VariableDelay vdelay;
|
private VariableDelay vdelay;
|
||||||
private double samplerate;
|
private double samplerate;
|
||||||
|
@ -139,13 +137,11 @@ public class SoftChorus implements SoftAudioProcessor {
|
||||||
|
|
||||||
public void setRate(double rate) {
|
public void setRate(double rate) {
|
||||||
double g = (Math.PI * 2) * (rate / controlrate);
|
double g = (Math.PI * 2) * (rate / controlrate);
|
||||||
c_cos_delta = Math.cos(g);
|
phase_step = g;
|
||||||
c_sin_delta = Math.sin(g);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPhase(double phase) {
|
public void setPhase(double phase) {
|
||||||
c_cos = Math.cos(phase);
|
this.phase = phase;
|
||||||
c_sin = Math.sin(phase);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFeedBack(float feedback) {
|
public void setFeedBack(float feedback) {
|
||||||
|
@ -161,16 +157,16 @@ public class SoftChorus implements SoftAudioProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processMix(float[] in, float[] out, float[] rout) {
|
public void processMix(float[] in, float[] out, float[] rout) {
|
||||||
c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta;
|
phase += phase_step;
|
||||||
c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta;
|
while(phase > (Math.PI * 2)) phase -= (Math.PI * 2);
|
||||||
vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2)));
|
vdelay.setDelay((float) (depth * 0.5 * (Math.cos(phase) + 2)));
|
||||||
vdelay.processMix(in, out, rout);
|
vdelay.processMix(in, out, rout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processReplace(float[] in, float[] out, float[] rout) {
|
public void processReplace(float[] in, float[] out, float[] rout) {
|
||||||
c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta;
|
phase += phase_step;
|
||||||
c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta;
|
while(phase > (Math.PI * 2)) phase -= (Math.PI * 2);
|
||||||
vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2)));
|
vdelay.setDelay((float) (depth * 0.5 * (Math.cos(phase) + 2)));
|
||||||
vdelay.processReplace(in, out, rout);
|
vdelay.processReplace(in, out, rout);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -543,8 +543,6 @@ public class SoftFilter {
|
||||||
|
|
||||||
public void filter1(SoftAudioBuffer sbuffer) {
|
public void filter1(SoftAudioBuffer sbuffer) {
|
||||||
|
|
||||||
float[] buffer = sbuffer.array();
|
|
||||||
|
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
filter1calc();
|
filter1calc();
|
||||||
dirty = false;
|
dirty = false;
|
||||||
|
@ -559,6 +557,7 @@ public class SoftFilter {
|
||||||
|
|
||||||
if (wet > 0 || last_wet > 0) {
|
if (wet > 0 || last_wet > 0) {
|
||||||
|
|
||||||
|
float[] buffer = sbuffer.array();
|
||||||
int len = buffer.length;
|
int len = buffer.length;
|
||||||
float a0 = this.last_a0;
|
float a0 = this.last_a0;
|
||||||
float q = this.last_q;
|
float q = this.last_q;
|
||||||
|
@ -577,14 +576,16 @@ public class SoftFilter {
|
||||||
q += q_delta;
|
q += q_delta;
|
||||||
gain += gain_delta;
|
gain += gain_delta;
|
||||||
wet += wet_delta;
|
wet += wet_delta;
|
||||||
y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i];
|
float ga0 = (1 - q * a0);
|
||||||
y2 = (1 - q * a0) * y2 + (a0) * y1;
|
y1 = ga0 * y1 + (a0) * (buffer[i] - y2);
|
||||||
|
y2 = ga0 * y2 + (a0) * y1;
|
||||||
buffer[i] = y2 * gain * wet + buffer[i] * (1 - wet);
|
buffer[i] = y2 * gain * wet + buffer[i] * (1 - wet);
|
||||||
}
|
}
|
||||||
} else if (a0_delta == 0 && q_delta == 0) {
|
} else if (a0_delta == 0 && q_delta == 0) {
|
||||||
|
float ga0 = (1 - q * a0);
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i];
|
y1 = ga0 * y1 + (a0) * (buffer[i] - y2);
|
||||||
y2 = (1 - q * a0) * y2 + (a0) * y1;
|
y2 = ga0 * y2 + (a0) * y1;
|
||||||
buffer[i] = y2 * gain;
|
buffer[i] = y2 * gain;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -592,8 +593,9 @@ public class SoftFilter {
|
||||||
a0 += a0_delta;
|
a0 += a0_delta;
|
||||||
q += q_delta;
|
q += q_delta;
|
||||||
gain += gain_delta;
|
gain += gain_delta;
|
||||||
y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i];
|
float ga0 = (1 - q * a0);
|
||||||
y2 = (1 - q * a0) * y2 + (a0) * y1;
|
y1 = ga0 * y1 + (a0) * (buffer[i] - y2);
|
||||||
|
y2 = ga0 * y2 + (a0) * y1;
|
||||||
buffer[i] = y2 * gain;
|
buffer[i] = y2 * gain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,6 +216,7 @@ public class SoftJitterCorrector extends AudioInputStream {
|
||||||
};
|
};
|
||||||
|
|
||||||
thread = new Thread(runnable);
|
thread = new Thread(runnable);
|
||||||
|
thread.setDaemon(true);
|
||||||
thread.setPriority(Thread.MAX_PRIORITY);
|
thread.setPriority(Thread.MAX_PRIORITY);
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,16 +48,18 @@ public class SoftMainMixer {
|
||||||
|
|
||||||
public final static int CHANNEL_LEFT = 0;
|
public final static int CHANNEL_LEFT = 0;
|
||||||
public final static int CHANNEL_RIGHT = 1;
|
public final static int CHANNEL_RIGHT = 1;
|
||||||
public final static int CHANNEL_EFFECT1 = 2;
|
public final static int CHANNEL_MONO = 2;
|
||||||
public final static int CHANNEL_EFFECT2 = 3;
|
public final static int CHANNEL_EFFECT1 = 3;
|
||||||
public final static int CHANNEL_EFFECT3 = 4;
|
public final static int CHANNEL_EFFECT2 = 4;
|
||||||
public final static int CHANNEL_EFFECT4 = 5;
|
public final static int CHANNEL_EFFECT3 = 5;
|
||||||
|
public final static int CHANNEL_EFFECT4 = 6;
|
||||||
public final static int CHANNEL_LEFT_DRY = 10;
|
public final static int CHANNEL_LEFT_DRY = 10;
|
||||||
public final static int CHANNEL_RIGHT_DRY = 11;
|
public final static int CHANNEL_RIGHT_DRY = 11;
|
||||||
public final static int CHANNEL_SCRATCH1 = 12;
|
public final static int CHANNEL_SCRATCH1 = 12;
|
||||||
public final static int CHANNEL_SCRATCH2 = 13;
|
public final static int CHANNEL_SCRATCH2 = 13;
|
||||||
public final static int CHANNEL_CHANNELMIXER_LEFT = 14;
|
public final static int CHANNEL_CHANNELMIXER_LEFT = 14;
|
||||||
public final static int CHANNEL_CHANNELMIXER_RIGHT = 15;
|
public final static int CHANNEL_CHANNELMIXER_RIGHT = 15;
|
||||||
|
public final static int CHANNEL_CHANNELMIXER_MONO = 16;
|
||||||
protected boolean active_sensing_on = false;
|
protected boolean active_sensing_on = false;
|
||||||
private long msec_last_activity = -1;
|
private long msec_last_activity = -1;
|
||||||
private boolean pusher_silent = false;
|
private boolean pusher_silent = false;
|
||||||
|
@ -485,8 +487,10 @@ public class SoftMainMixer {
|
||||||
// to channelmixer left,right input/output
|
// to channelmixer left,right input/output
|
||||||
SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT];
|
SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT];
|
||||||
SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT];
|
SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT];
|
||||||
|
SoftAudioBuffer monobak = buffers[CHANNEL_MONO];
|
||||||
buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT];
|
buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT];
|
||||||
buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_LEFT];
|
buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_RIGHT];
|
||||||
|
buffers[CHANNEL_MONO] = buffers[CHANNEL_CHANNELMIXER_MONO];
|
||||||
|
|
||||||
int bufferlen = buffers[CHANNEL_LEFT].getSize();
|
int bufferlen = buffers[CHANNEL_LEFT].getSize();
|
||||||
|
|
||||||
|
@ -503,6 +507,7 @@ public class SoftMainMixer {
|
||||||
for (ModelChannelMixer cmixer : act_registeredMixers) {
|
for (ModelChannelMixer cmixer : act_registeredMixers) {
|
||||||
for (int i = 0; i < cbuffer.length; i++)
|
for (int i = 0; i < cbuffer.length; i++)
|
||||||
Arrays.fill(cbuffer[i], 0);
|
Arrays.fill(cbuffer[i], 0);
|
||||||
|
buffers[CHANNEL_MONO].clear();
|
||||||
boolean hasactivevoices = false;
|
boolean hasactivevoices = false;
|
||||||
for (int i = 0; i < voicestatus.length; i++)
|
for (int i = 0; i < voicestatus.length; i++)
|
||||||
if (voicestatus[i].active)
|
if (voicestatus[i].active)
|
||||||
|
@ -517,6 +522,26 @@ public class SoftMainMixer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!buffers[CHANNEL_MONO].isSilent())
|
||||||
|
{
|
||||||
|
float[] mono = buffers[CHANNEL_MONO].array();
|
||||||
|
float[] left = buffers[CHANNEL_LEFT].array();
|
||||||
|
if (nrofchannels != 1) {
|
||||||
|
float[] right = buffers[CHANNEL_RIGHT].array();
|
||||||
|
for (int i = 0; i < bufferlen; i++) {
|
||||||
|
float v = mono[i];
|
||||||
|
left[i] += v;
|
||||||
|
right[i] += v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < bufferlen; i++) {
|
||||||
|
left[i] += mono[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < cbuffer.length; i++) {
|
for (int i = 0; i < cbuffer.length; i++) {
|
||||||
float[] cbuff = cbuffer[i];
|
float[] cbuff = cbuffer[i];
|
||||||
float[] obuff = obuffer[i];
|
float[] obuff = obuffer[i];
|
||||||
|
@ -539,6 +564,7 @@ public class SoftMainMixer {
|
||||||
|
|
||||||
buffers[CHANNEL_LEFT] = leftbak;
|
buffers[CHANNEL_LEFT] = leftbak;
|
||||||
buffers[CHANNEL_RIGHT] = rightbak;
|
buffers[CHANNEL_RIGHT] = rightbak;
|
||||||
|
buffers[CHANNEL_MONO] = monobak;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,6 +573,27 @@ public class SoftMainMixer {
|
||||||
if (voicestatus[i].channelmixer == null)
|
if (voicestatus[i].channelmixer == null)
|
||||||
voicestatus[i].processAudioLogic(buffers);
|
voicestatus[i].processAudioLogic(buffers);
|
||||||
|
|
||||||
|
if(!buffers[CHANNEL_MONO].isSilent())
|
||||||
|
{
|
||||||
|
float[] mono = buffers[CHANNEL_MONO].array();
|
||||||
|
float[] left = buffers[CHANNEL_LEFT].array();
|
||||||
|
int bufferlen = buffers[CHANNEL_LEFT].getSize();
|
||||||
|
if (nrofchannels != 1) {
|
||||||
|
float[] right = buffers[CHANNEL_RIGHT].array();
|
||||||
|
for (int i = 0; i < bufferlen; i++) {
|
||||||
|
float v = mono[i];
|
||||||
|
left[i] += v;
|
||||||
|
right[i] += v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < bufferlen; i++) {
|
||||||
|
left[i] += mono[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Run effects
|
// Run effects
|
||||||
if (synth.chorus_on)
|
if (synth.chorus_on)
|
||||||
chorus.processAudio();
|
chorus.processAudio();
|
||||||
|
@ -665,7 +712,7 @@ public class SoftMainMixer {
|
||||||
/ synth.getControlRate());
|
/ synth.getControlRate());
|
||||||
|
|
||||||
control_mutex = synth.control_mutex;
|
control_mutex = synth.control_mutex;
|
||||||
buffers = new SoftAudioBuffer[16];
|
buffers = new SoftAudioBuffer[17];
|
||||||
for (int i = 0; i < buffers.length; i++) {
|
for (int i = 0; i < buffers.length; i++) {
|
||||||
buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat());
|
buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat());
|
||||||
}
|
}
|
||||||
|
|
|
@ -782,6 +782,7 @@ public class SoftVoice extends VoiceStatus {
|
||||||
|
|
||||||
SoftAudioBuffer left = buffer[SoftMainMixer.CHANNEL_LEFT];
|
SoftAudioBuffer left = buffer[SoftMainMixer.CHANNEL_LEFT];
|
||||||
SoftAudioBuffer right = buffer[SoftMainMixer.CHANNEL_RIGHT];
|
SoftAudioBuffer right = buffer[SoftMainMixer.CHANNEL_RIGHT];
|
||||||
|
SoftAudioBuffer mono = buffer[SoftMainMixer.CHANNEL_MONO];
|
||||||
SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1];
|
SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1];
|
||||||
SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2];
|
SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2];
|
||||||
SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY];
|
SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY];
|
||||||
|
@ -803,6 +804,14 @@ public class SoftVoice extends VoiceStatus {
|
||||||
mixAudioStream(rightdry, left, last_out_mixer_left,
|
mixAudioStream(rightdry, left, last_out_mixer_left,
|
||||||
out_mixer_left);
|
out_mixer_left);
|
||||||
} else {
|
} else {
|
||||||
|
if(rightdry == null &&
|
||||||
|
last_out_mixer_left == last_out_mixer_right &&
|
||||||
|
out_mixer_left == out_mixer_right)
|
||||||
|
{
|
||||||
|
mixAudioStream(leftdry, mono, last_out_mixer_left, out_mixer_left);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left);
|
mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left);
|
||||||
if (rightdry != null)
|
if (rightdry != null)
|
||||||
mixAudioStream(rightdry, right, last_out_mixer_right,
|
mixAudioStream(rightdry, right, last_out_mixer_right,
|
||||||
|
@ -811,6 +820,7 @@ public class SoftVoice extends VoiceStatus {
|
||||||
mixAudioStream(leftdry, right, last_out_mixer_right,
|
mixAudioStream(leftdry, right, last_out_mixer_right,
|
||||||
out_mixer_right);
|
out_mixer_right);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (rightdry == null) {
|
if (rightdry == null) {
|
||||||
mixAudioStream(leftdry, eff1, last_out_mixer_effect1,
|
mixAudioStream(leftdry, eff1, last_out_mixer_effect1,
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2007 Sun Microsystems, Inc. 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. Sun designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Sun in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @test
|
||||||
|
@summary Test SoftChannel noteOn/noteOff overflow test */
|
||||||
|
|
||||||
|
import javax.sound.midi.MidiChannel;
|
||||||
|
import javax.sound.midi.VoiceStatus;
|
||||||
|
import javax.sound.sampled.AudioFormat;
|
||||||
|
import javax.sound.sampled.AudioInputStream;
|
||||||
|
|
||||||
|
import com.sun.media.sound.AudioSynthesizer;
|
||||||
|
import com.sun.media.sound.SoftSynthesizer;
|
||||||
|
|
||||||
|
public class NoteOverFlowTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
AudioSynthesizer synth = new SoftSynthesizer();
|
||||||
|
AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
|
||||||
|
AudioInputStream stream = synth.openStream(format, null);
|
||||||
|
|
||||||
|
// Make all voices busy, e.g.
|
||||||
|
// send midi on and midi off on all available voices
|
||||||
|
MidiChannel ch1 = synth.getChannels()[0];
|
||||||
|
ch1.programChange(48); // Use contionus instrument like string ensemble
|
||||||
|
for (int i = 0; i < synth.getMaxPolyphony(); i++) {
|
||||||
|
ch1.noteOn(64, 64);
|
||||||
|
ch1.noteOff(64);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now send single midi on, and midi off message
|
||||||
|
ch1.noteOn(64, 64);
|
||||||
|
ch1.noteOff(64);
|
||||||
|
|
||||||
|
// Read 10 sec from stream, by this time all voices should be inactvie
|
||||||
|
stream.skip(format.getFrameSize() * ((int)(format.getFrameRate() * 20)));
|
||||||
|
|
||||||
|
// If no voice are active, then this test will pass
|
||||||
|
VoiceStatus[] v = synth.getVoiceStatus();
|
||||||
|
for (int i = 0; i < v.length; i++) {
|
||||||
|
if(v[i].active)
|
||||||
|
{
|
||||||
|
throw new RuntimeException("Not all voices are inactive!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the synthesizer after use
|
||||||
|
synth.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Sun in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @test
|
||||||
|
@summary Test SoftFilter processAudio method */
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import javax.sound.sampled.*;
|
||||||
|
|
||||||
|
import com.sun.media.sound.*;
|
||||||
|
|
||||||
|
public class TestProcessAudio {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
|
||||||
|
SoftAudioBuffer sbuffer = new SoftAudioBuffer(3600, format);
|
||||||
|
SoftFilter filter = new SoftFilter(format.getSampleRate());
|
||||||
|
Random random = new Random(42);
|
||||||
|
|
||||||
|
|
||||||
|
for (int t = 0; t <= 6; t++)
|
||||||
|
{
|
||||||
|
if(t == 0) filter.setFilterType(SoftFilter.FILTERTYPE_BP12);
|
||||||
|
if(t == 1) filter.setFilterType(SoftFilter.FILTERTYPE_HP12);
|
||||||
|
if(t == 2) filter.setFilterType(SoftFilter.FILTERTYPE_HP24);
|
||||||
|
if(t == 3) filter.setFilterType(SoftFilter.FILTERTYPE_LP12);
|
||||||
|
if(t == 4) filter.setFilterType(SoftFilter.FILTERTYPE_LP24);
|
||||||
|
if(t == 5) filter.setFilterType(SoftFilter.FILTERTYPE_LP6);
|
||||||
|
if(t == 6) filter.setFilterType(SoftFilter.FILTERTYPE_NP12);
|
||||||
|
|
||||||
|
|
||||||
|
// Try first by reseting always
|
||||||
|
for (int f = 1200; f < 3600; f+=100)
|
||||||
|
for (int r = 0; r <= 30; r+=5) {
|
||||||
|
filter.reset();
|
||||||
|
filter.setResonance(r);
|
||||||
|
filter.setFrequency(f);
|
||||||
|
float[] data = sbuffer.array();
|
||||||
|
int len = sbuffer.getSize();
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
data[i] = random.nextFloat() - 0.5f;
|
||||||
|
filter.processAudio(sbuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we skip reseting
|
||||||
|
// to test how changing frequency and resonance
|
||||||
|
// affect active filter
|
||||||
|
for (int f = 100; f < 12800; f+=1200)
|
||||||
|
for (int r = 0; r <= 30; r+=5) {
|
||||||
|
filter.setResonance(r);
|
||||||
|
filter.setFrequency(f);
|
||||||
|
float[] data = sbuffer.array();
|
||||||
|
int len = sbuffer.getSize();
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
data[i] = random.nextFloat() - 0.5f;
|
||||||
|
filter.processAudio(sbuffer);
|
||||||
|
}
|
||||||
|
for (int f = 12800; f >= 100; f-=1200)
|
||||||
|
for (int r = 30; r >= 0; r-=5) {
|
||||||
|
filter.setResonance(r);
|
||||||
|
filter.setFrequency(f);
|
||||||
|
float[] data = sbuffer.array();
|
||||||
|
int len = sbuffer.getSize();
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
data[i] = random.nextFloat() - 0.5f;
|
||||||
|
filter.processAudio(sbuffer);
|
||||||
|
}
|
||||||
|
filter.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue