package org.terasology.audio; import org.terasology.asset.AssetUri; import org.terasology.utilities.OggReader; import java.io.IOException; import java.net.URL; import java.nio.ByteBuffer; import java.util.logging.Level; import java.util.logging.Logger; public class OggStreamingSound extends AbstractStreamingSound { private ByteBuffer dataBuffer = ByteBuffer.allocateDirect(4096 * 8); private OggReader file = null; private Logger logger = Logger.getLogger(getClass().getName()); public OggStreamingSound(AssetUri uri, URL source) { super(uri, source); } @Override public int getBufferBits() { return 16; // Ogg is always 16-bit } @Override public int getLength() { return -1; // not supported } @Override public int getChannels() { return file.getChannels(); } @Override public int getSamplingRate() { return file.getRate(); } @Override public void reset() { if (file != null) { try { file.close(); } catch (IOException e) { logger.log(Level.WARNING, "Failed to close streaming sound: " + getURI(), e); } } try { file = new OggReader(audioSource.openStream()); } catch (IOException e) { logger.log(Level.SEVERE, "Failed to load streaming sound: " + getURI(), e); } } @Override protected ByteBuffer fetchData() { try { int read = file.read(dataBuffer, 0, dataBuffer.capacity()); dataBuffer.rewind(); // do something :D if (read <= 0) { // end of datastream return null; } return dataBuffer; } catch (IOException e) { throw new RuntimeException(e); } } }