de.jarnbjo.ogg.UncachedUrlStream Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sound Show documentation
Show all versions of sound Show documentation
Etyl's default sound module
The newest version!
/*
* $ProjectName$
* $ProjectRevision$
* -----------------------------------------------------------
* $Id: UncachedUrlStream.java,v 1.1 2003/04/10 19:48:22 jarnbjo Exp $
* -----------------------------------------------------------
*
* $Author: jarnbjo $
*
* Description:
*
* Copyright 2002-2003 Tor-Einar Jarnbjo
* -----------------------------------------------------------
*
* Change History
* -----------------------------------------------------------
* $Log: UncachedUrlStream.java,v $
* Revision 1.1 2003/04/10 19:48:22 jarnbjo
* no message
*
*/
package de.jarnbjo.ogg;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* Implementation of the PhysicalOggStream
interface for reading
* an Ogg stream from a URL. This class performs only the necessary caching
* to provide continous playback. Seeking within the stream is not supported.
*/
public class UncachedUrlStream implements PhysicalOggStream {
private boolean closed=false;
private URLConnection source;
private InputStream sourceStream;
private Object drainLock=new Object();
private LinkedList pageCache = new LinkedList();
private long numberOfSamples = -1;
private Map logicalStreams=new HashMap();
private LoaderThread loaderThread;
private static final int PAGECACHE_SIZE = 10;
/** Creates an instance of the PhysicalOggStream
interface
* suitable for reading an Ogg stream from a URL.
*/
public UncachedUrlStream(URL source) throws OggFormatException, IOException {
this.source=source.openConnection();
this.sourceStream=this.source.getInputStream();
loaderThread=new LoaderThread(sourceStream, pageCache);
new Thread(loaderThread).start();
while(!loaderThread.isBosDone() || pageCache.size() pageCache;
private RandomAccessFile drain;
private byte[] memoryCache;
private boolean bosDone=false;
private int pageNumber;
public LoaderThread(InputStream source, LinkedList pageCache) {
this.source=source;
this.pageCache=pageCache;
}
public void run() {
try {
boolean eos=false;
byte[] buffer=new byte[8192];
while(!eos) {
OggPage op=OggPage.create(source);
synchronized (drainLock) {
pageCache.add(op);
}
if(!op.isBos()) {
bosDone=true;
}
if(op.isEos()) {
eos=true;
}
LogicalOggStreamImpl los=(LogicalOggStreamImpl)getLogicalStream(op.getStreamSerialNumber());
if(los==null) {
los=new LogicalOggStreamImpl(UncachedUrlStream.this, op.getStreamSerialNumber());
logicalStreams.put(new Integer(op.getStreamSerialNumber()), los);
los.checkFormat(op);
}
//los.addPageNumberMapping(pageNumber);
//los.addGranulePosition(op.getAbsoluteGranulePosition());
pageNumber++;
while(pageCache.size()>PAGECACHE_SIZE) {
try {
Thread.sleep(200);
}
catch (InterruptedException ex) {
}
}
}
}
catch(EndOfOggStreamException e) {
// ok
}
catch(IOException e) {
e.printStackTrace();
}
}
public boolean isBosDone() {
return bosDone;
}
}
/**
* @return always false
*/
public boolean isSeekable() {
return false;
}
}