Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
exch-bms2 committed Nov 23, 2017
2 parents 89d2ee2 + fd35d53 commit 37fbd3d
Show file tree
Hide file tree
Showing 10 changed files with 162 additions and 51 deletions.
23 changes: 19 additions & 4 deletions src/bms/player/beatoraja/audio/ASIODriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,13 @@ protected PCM getKeySound(PCM pcm) {
}

@Override
protected synchronized void play(PCM id, float volume) {
mixer.put(id, volume, false);
protected synchronized void play(PCM pcm, int channel, float volume) {
mixer.put(pcm, channel, volume, false);
}

@Override
protected void play(AudioElement<PCM> id, float volume, boolean loop) {
id.id = mixer.put(id.audio, volume, loop);
id.id = mixer.put(id.audio, -1, volume, loop);
}

@Override
Expand All @@ -122,6 +122,11 @@ protected void stop(PCM id) {
mixer.stop(id);
}

@Override
protected void stop(PCM id, int channel) {
mixer.stop(id, channel);
}

@Override
protected void disposeKeySound(PCM pcm) {
}
Expand Down Expand Up @@ -194,14 +199,15 @@ public AudioMixer(int channels) {
}
}

public long put(PCM pcm, float volume, boolean loop) {
public long put(PCM pcm, int channel, float volume, boolean loop) {
for (int i = 0; i < inputs.length; i++) {
if (inputs[i].pos == -1) {
inputs[i].pcm = pcm;
inputs[i].sample = pcm.getSample();
inputs[i].volume = volume;
inputs[i].loop = loop;
inputs[i].id = idcount++;
inputs[i].channel = channel;
inputs[i].pos = 0;
return inputs[i].id;
}
Expand All @@ -226,6 +232,14 @@ public void stop(PCM id) {
}
}

public void stop(PCM id, int channel) {
for (int i = 0; i < inputs.length; i++) {
if (inputs[i].pcm == id && inputs[i].channel == channel) {
inputs[i].pos = -1;
}
}
}

public void fillBuffer(float[][] buffer) {
final int size = buffer[0].length;
final int channel = buffer.length;
Expand Down Expand Up @@ -257,5 +271,6 @@ class MixerInput {
public int pos = -1;
public boolean loop;
public long id;
public int channel = -1;
}
}
27 changes: 20 additions & 7 deletions src/bms/player/beatoraja/audio/AbstractAudioDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,14 @@ public abstract class AbstractAudioDriver<T> implements AudioDriver {
/**
* キー音を再生する
*
* @param id
* @param wav
* 音源データ
* @param channel
* 定義番号/音声チャンネル番号
* @param volume
* ボリューム(0.0-1.0)
*/
protected abstract void play(T id, float volume);
protected abstract void play(T wav, int channel, float volume);

/**
* 効果音を再生する
Expand Down Expand Up @@ -110,6 +112,16 @@ public abstract class AbstractAudioDriver<T> implements AudioDriver {
*/
protected abstract void stop(T id);

/**
* 音源データが再生されていれば停止する
*
* @param id
* 音源データ
* @param channel
* 定義番号/音声チャンネル番号
*/
protected abstract void stop(T id, int channel);

public void play(String p, float volume, boolean loop) {
if (p == null || p.length() == 0) {
return;
Expand Down Expand Up @@ -299,13 +311,14 @@ private final void play0(Note n, float volume) {
if (starttime == 0 && duration == 0) {
final T wav = (T) wavmap[id];
if (wav != null) {
stop(wav);
play(wav, volume);
stop(wav, id);
play(wav, id, volume);
}
} else {
for (SliceWav<T> slice : slicesound[id]) {
if (slice.starttime == starttime && slice.duration == duration) {
play(slice.wav, volume);
stop(slice.wav, id);
play(slice.wav, id, volume);
// System.out.println("slice WAV play - ID:" + id +
// " start:" + starttime + " duration:" + duration);
break;
Expand Down Expand Up @@ -351,12 +364,12 @@ private final void stop0(Note n) {
if (starttime == 0 && duration == 0) {
final T sound = (T) wavmap[id];
if (sound != null) {
stop(sound);
stop(sound, id);
}
} else {
for (SliceWav<T> slice : slicesound[id]) {
if (slice.starttime == starttime && slice.duration == duration) {
stop((T) slice.wav);
stop((T) slice.wav, id);
break;
}
}
Expand Down
8 changes: 7 additions & 1 deletion src/bms/player/beatoraja/audio/GdxAudioDeviceDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ protected void disposeKeySound(Object pcm) {
}

@Override
protected void play(Object id, float volume) {
protected void play(Object wav, int channel, float volume) {
// TODO Auto-generated method stub

}
Expand All @@ -45,4 +45,10 @@ protected void stop(Object id) {
// TODO Auto-generated method stub

}

@Override
protected void stop(Object id, int channel) {
// TODO Auto-generated method stub

}
}
52 changes: 47 additions & 5 deletions src/bms/player/beatoraja/audio/GdxSoundDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,14 @@ public class GdxSoundDriver extends AbstractAudioDriver<Sound> {

private final boolean soundthread = false;

private SoundInstance[] sounds = new SoundInstance[256];
private int soundPos = 0;

public GdxSoundDriver() {
for (int i = 0; i < sounds.length; i++) {
sounds[i] = new SoundInstance();
}

if(soundthread) {
mixer = new SoundMixer();
mixer.start();
Expand Down Expand Up @@ -102,12 +109,15 @@ public OutputStream write(boolean overwrite) {


@Override
protected void play(Sound id, float volume) {
protected void play(Sound pcm, int channel, float volume) {
if(soundthread) {
mixer.put(id, volume);
mixer.put(pcm, channel, volume);
} else {
synchronized (lock) {
id.play(volume);
sounds[soundPos].sound = pcm;
sounds[soundPos].id = pcm.play(volume);
sounds[soundPos].channel = channel;
soundPos = (soundPos + 1) % sounds.length;
}
}
}
Expand All @@ -131,6 +141,20 @@ protected void stop(Sound id) {
id.stop();
}

@Override
protected void stop(Sound id, int channel) {
if (soundthread) {
mixer.stop(id, channel);
} else {
for (int i = 0; i < sounds.length; i++) {
if (sounds[i].sound == id && sounds[i].channel == channel) {
sounds[i].sound.stop(sounds[i].id);
sounds[i].sound = null;
}
}
}
}

@Override
protected void disposeKeySound(Sound pcm) {
pcm.dispose();
Expand All @@ -140,19 +164,31 @@ class SoundMixer extends Thread {

private Sound[] sound = new Sound[256];
private float[] volume = new float[256];
private int[] channels = new int[256];
private long[] ids = new long[256];
private int cpos;
private int pos;

public synchronized void put(Sound sound, float volume) {
public synchronized void put(Sound sound, int channel, float volume) {
this.sound[cpos] = sound;
this.volume[cpos] = volume;
this.channels[cpos] = channel;
cpos = (cpos + 1) % this.sound.length;
}

public synchronized void stop(Sound snd, int channel) {
for (int i = 0; i < sound.length; i++) {
if (sound[i] == snd && this.channels[i] == channel) {
sound[i].stop(ids[i]);
sound[i] = null;
}
}
}

public void run() {
for(;;) {
if(pos != cpos) {
sound[pos].play(this.volume[pos]);
ids[pos] = sound[pos].play(this.volume[pos]);
pos = (pos + 1) % this.sound.length;
} else {
try {
Expand All @@ -163,4 +199,10 @@ public void run() {
}
}
}

class SoundInstance {
public Sound sound;
public long id = -1;
public int channel = -1;
}
}
23 changes: 19 additions & 4 deletions src/bms/player/beatoraja/audio/PortAudioDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,13 @@ protected PCM getKeySound(PCM pcm) {
}

@Override
protected synchronized void play(PCM id, float volume) {
mixer.put(id, volume, false);
protected synchronized void play(PCM pcm, int channel, float volume) {
mixer.put(pcm, channel, volume, false);
}

@Override
protected void play(AudioElement<PCM> id, float volume, boolean loop) {
id.id = mixer.put(id.audio, volume, loop);
id.id = mixer.put(id.audio, -1, volume, loop);
}

@Override
Expand All @@ -142,6 +142,11 @@ protected void stop(PCM id) {
mixer.stop(id);
}

@Override
protected void stop(PCM id, int channel) {
mixer.stop(id, channel);
}

@Override
protected void disposeKeySound(PCM pcm) {
}
Expand Down Expand Up @@ -185,14 +190,15 @@ public AudioMixer(int channels) {
}
}

public long put(PCM pcm, float volume, boolean loop) {
public long put(PCM pcm, int channel, float volume, boolean loop) {
for (int i = 0; i < inputs.length; i++) {
if (inputs[i].pos == -1) {
inputs[i].pcm = pcm;
inputs[i].sample = pcm.getSample();
inputs[i].volume = volume;
inputs[i].loop = loop;
inputs[i].id = idcount++;
inputs[i].channel = channel;
inputs[i].pos = 0;
return inputs[i].id;
}
Expand All @@ -217,6 +223,14 @@ public void stop(PCM id) {
}
}

public void stop(PCM id, int channel) {
for (int i = 0; i < inputs.length; i++) {
if (inputs[i].pcm == id && inputs[i].channel == channel) {
inputs[i].pos = -1;
}
}
}

public void run() {
while(!stop) {
try {
Expand Down Expand Up @@ -253,5 +267,6 @@ class MixerInput {
public int pos = -1;
public boolean loop;
public long id;
public int channel = -1;
}
}
2 changes: 1 addition & 1 deletion src/bms/player/beatoraja/decide/MusicDecide.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void render() {
public void input() {
long nowtime = getNowTime();

if (getTimer()[TIMER_FADEOUT] == Long.MIN_VALUE && getTimer()[TIMER_STARTINPUT] != Long.MAX_VALUE) {
if (getTimer()[TIMER_FADEOUT] == Long.MIN_VALUE && getTimer()[TIMER_STARTINPUT] != Long.MIN_VALUE) {
BMSPlayerInputProcessor input = getMainController().getInputProcessor();
if (input.getKeystate()[0] || input.getKeystate()[2] || input.getKeystate()[4] || input.getKeystate()[6]) {
getTimer()[TIMER_FADEOUT] = nowtime;
Expand Down
2 changes: 0 additions & 2 deletions src/bms/player/beatoraja/input/MidiInputProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ public MidiInputProcessor(BMSPlayerInputProcessor inputProcessor) {
MidiDevice device = MidiSystem.getMidiDevice(info);
devices.add(device);
} catch (MidiUnavailableException e) {
Logger.getGlobal().warning("Cannot get MIDI device `" + info.getName() + "`: " + e.getMessage());
}
}

Expand All @@ -54,7 +53,6 @@ public void open() {
device.open();
device.getTransmitter().setReceiver(receiver);
} catch (MidiUnavailableException e) {
Logger.getGlobal().warning("Cannot open or receive events from MIDI device `" + device.getDeviceInfo().getName() + "`: " + e.getMessage());
}
}
}
Expand Down
Loading

0 comments on commit 37fbd3d

Please sign in to comment.