72 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			2.1 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.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| 
 | |
| /**
 | |
|  * The LoopingAudioStream class provides an AudioStream that loops indefinitely over the provided InputStream.
 | |
|  */
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class LoopingAudioStream implements AudioStream {
 | |
| 	private final LoopingAudioStream.AudioStreamProvider provider;
 | |
| 	private AudioStream stream;
 | |
| 	private final BufferedInputStream bufferedInputStream;
 | |
| 
 | |
| 	public LoopingAudioStream(LoopingAudioStream.AudioStreamProvider provider, InputStream inputStream) throws IOException {
 | |
| 		this.provider = provider;
 | |
| 		this.bufferedInputStream = new BufferedInputStream(inputStream);
 | |
| 		this.bufferedInputStream.mark(Integer.MAX_VALUE);
 | |
| 		this.stream = provider.create(new LoopingAudioStream.NoCloseBuffer(this.bufferedInputStream));
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public AudioFormat getFormat() {
 | |
| 		return this.stream.getFormat();
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public ByteBuffer read(int size) throws IOException {
 | |
| 		ByteBuffer byteBuffer = this.stream.read(size);
 | |
| 		if (!byteBuffer.hasRemaining()) {
 | |
| 			this.stream.close();
 | |
| 			this.bufferedInputStream.reset();
 | |
| 			this.stream = this.provider.create(new LoopingAudioStream.NoCloseBuffer(this.bufferedInputStream));
 | |
| 			byteBuffer = this.stream.read(size);
 | |
| 		}
 | |
| 
 | |
| 		return byteBuffer;
 | |
| 	}
 | |
| 
 | |
| 	public void close() throws IOException {
 | |
| 		this.stream.close();
 | |
| 		this.bufferedInputStream.close();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * A functional interface for providing an {@linkplain AudioStream} from an {@linkplain InputStream}.
 | |
| 	 */
 | |
| 	@FunctionalInterface
 | |
| 	@Environment(EnvType.CLIENT)
 | |
| 	public interface AudioStreamProvider {
 | |
| 		AudioStream create(InputStream inputStream) throws IOException;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * A {@linkplain FilterInputStream} that does not close the underlying {@linkplain InputStream}.
 | |
| 	 */
 | |
| 	@Environment(EnvType.CLIENT)
 | |
| 	static class NoCloseBuffer extends FilterInputStream {
 | |
| 		NoCloseBuffer(InputStream inputStream) {
 | |
| 			super(inputStream);
 | |
| 		}
 | |
| 
 | |
| 		public void close() {
 | |
| 		}
 | |
| 	}
 | |
| }
 |