mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-09 21:31:51 +09:00
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
106 lines
2.5 KiB
Java
106 lines
2.5 KiB
Java
package org.newdawn.slick.openal;
|
|
|
|
import ibxm.Module;
|
|
import ibxm.OpenALMODPlayer;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.IntBuffer;
|
|
|
|
import org.lwjgl.BufferUtils;
|
|
import org.lwjgl.openal.AL10;
|
|
|
|
/**
|
|
* A sound as a MOD file - can only be played as music
|
|
*
|
|
* @author Kevin Glass
|
|
*/
|
|
public class MODSound extends AudioImpl {
|
|
/** The MOD play back system */
|
|
private static OpenALMODPlayer player = new OpenALMODPlayer();
|
|
|
|
/** The module to play back */
|
|
private Module module;
|
|
/** The sound store this belongs to */
|
|
private SoundStore store;
|
|
|
|
/**
|
|
* Create a mod sound to be played back
|
|
*
|
|
* @param store The store this sound belongs to
|
|
* @param in The input stream to read the data from
|
|
* @throws IOException Indicates a failure to load a sound
|
|
*/
|
|
public MODSound(SoundStore store, InputStream in) throws IOException {
|
|
this.store = store;
|
|
module = OpenALMODPlayer.loadModule(in);
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.openal.AudioImpl#playAsMusic(float, float, boolean)
|
|
*/
|
|
public int playAsMusic(float pitch, float gain, boolean loop) {
|
|
cleanUpSource();
|
|
|
|
player.play(module, store.getSource(0), loop, SoundStore.get().isMusicOn());
|
|
player.setup(pitch, 1.0f);
|
|
store.setCurrentMusicVolume(gain);
|
|
|
|
store.setMOD(this);
|
|
|
|
return store.getSource(0);
|
|
}
|
|
|
|
/**
|
|
* Clean up the buffers applied to the sound source
|
|
*/
|
|
private void cleanUpSource() {
|
|
AL10.alSourceStop(store.getSource(0));
|
|
IntBuffer buffer = BufferUtils.createIntBuffer(1);
|
|
int queued = AL10.alGetSourcei(store.getSource(0), AL10.AL_BUFFERS_QUEUED);
|
|
|
|
while (queued > 0)
|
|
{
|
|
AL10.alSourceUnqueueBuffers(store.getSource(0), buffer);
|
|
queued--;
|
|
}
|
|
|
|
AL10.alSourcei(store.getSource(0), AL10.AL_BUFFER, 0);
|
|
}
|
|
|
|
/**
|
|
* Poll the streaming on the MOD
|
|
*/
|
|
public void poll() {
|
|
player.update();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.openal.AudioImpl#playAsSoundEffect(float, float, boolean)
|
|
*/
|
|
public int playAsSoundEffect(float pitch, float gain, boolean loop) {
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.openal.AudioImpl#stop()
|
|
*/
|
|
public void stop() {
|
|
store.setMOD(null);
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.openal.AudioImpl#getPosition()
|
|
*/
|
|
public float getPosition() {
|
|
throw new RuntimeException("Positioning on modules is not currently supported");
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.openal.AudioImpl#setPosition(float)
|
|
*/
|
|
public boolean setPosition(float position) {
|
|
throw new RuntimeException("Positioning on modules is not currently supported");
|
|
}
|
|
}
|