65 lines
2.0 KiB
Java
65 lines
2.0 KiB
Java
package net.minecraft.client.sounds;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.FilterInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.ByteBuffer;
|
|
import javax.sound.sampled.AudioFormat;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public class LoopingAudioStream implements AudioStream {
|
|
private final LoopingAudioStream.AudioStreamProvider provider;
|
|
private AudioStream stream;
|
|
private final BufferedInputStream bufferedInputStream;
|
|
|
|
public LoopingAudioStream(LoopingAudioStream.AudioStreamProvider p_120163_, InputStream p_120164_) throws IOException {
|
|
this.provider = p_120163_;
|
|
this.bufferedInputStream = new BufferedInputStream(p_120164_);
|
|
this.bufferedInputStream.mark(Integer.MAX_VALUE);
|
|
this.stream = p_120163_.create(new LoopingAudioStream.NoCloseBuffer(this.bufferedInputStream));
|
|
}
|
|
|
|
@Override
|
|
public AudioFormat getFormat() {
|
|
return this.stream.getFormat();
|
|
}
|
|
|
|
@Override
|
|
public ByteBuffer read(int p_120167_) throws IOException {
|
|
ByteBuffer bytebuffer = this.stream.read(p_120167_);
|
|
if (!bytebuffer.hasRemaining()) {
|
|
this.stream.close();
|
|
this.bufferedInputStream.reset();
|
|
this.stream = this.provider.create(new LoopingAudioStream.NoCloseBuffer(this.bufferedInputStream));
|
|
bytebuffer = this.stream.read(p_120167_);
|
|
}
|
|
|
|
return bytebuffer;
|
|
}
|
|
|
|
@Override
|
|
public void close() throws IOException {
|
|
this.stream.close();
|
|
this.bufferedInputStream.close();
|
|
}
|
|
|
|
@FunctionalInterface
|
|
@OnlyIn(Dist.CLIENT)
|
|
public interface AudioStreamProvider {
|
|
AudioStream create(InputStream p_120170_) throws IOException;
|
|
}
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
static class NoCloseBuffer extends FilterInputStream {
|
|
NoCloseBuffer(InputStream p_120172_) {
|
|
super(p_120172_);
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
}
|
|
}
|
|
} |