package com.pugh.sockso.music.stream;
import com.pugh.sockso.Utils;
import com.pugh.sockso.music.Track;
import com.pugh.sockso.web.Response;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.Logger;
/**
*
* @author Nathan Perrier
*/
public class SimpleStream extends AbstractMusicStream {
private static final Logger log = Logger.getLogger(SimpleStream.class);
public SimpleStream( final Track track ) {
super(track);
}
@Override
public void setHeaders( final Response response ) {
super.setHeaders(response);
final long length = new File(this.track.getPath()).length();
response.addHeader("Content-Length", Long.toString(length));
response.addHeader("Accept-Ranges", "bytes");
}
public void sendAudioStream( final DataOutputStream client ) throws IOException {
final DataInputStream audio = getAudioStream();
final long contentLength = new File(track.getPath()).length();
final byte[] buffer = new byte[STREAM_BUFFER_SIZE];
int readBlock = STREAM_BUFFER_SIZE;
long totalBytes = 0;
try {
int nextRead = -1;
for ( int bytesRead = 0; bytesRead >= 0 && totalBytes < contentLength; bytesRead = audio.read(buffer, 0, readBlock) ) {
totalBytes += bytesRead;
if ( totalBytes + readBlock > contentLength ) {
readBlock = (int) (contentLength - totalBytes);
}
client.write(buffer, 0, bytesRead);
if ( totalBytes > nextRead ) {
nextRead += STREAM_BUFFER_SIZE * 12; // print ~every 100 KB
log.debug(String.format("Sent %2d%%", bytesRead));
}
}
} finally {
Utils.close(audio);
Utils.close(client);
}
}
}