Package net.sf.fmj.media

Source Code of net.sf.fmj.media.TrackInputStream

package net.sf.fmj.media;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;

import javax.media.Buffer;
import javax.media.Track;

import net.sf.fmj.utility.LoggerSingleton;

/**
* Implements InputStream by wrapping a Track.
* @author Ken Larson
*
*/
public class TrackInputStream extends InputStream
{
  private static final Logger logger = LoggerSingleton.logger;

  private final Track track;
  private Buffer buffer;
 
  public TrackInputStream(Track track)
  {
    super();
    this.track = track;
  }

  public Buffer getBuffer()
  {  return buffer;
  }
 
  private void fillBuffer()
  {
    if (buffer == null)
    { 
      buffer = new Buffer();
      buffer.setFormat(track.getFormat());
     
    }
   
   
    do
    {
      if (buffer.isEOM())
        return;
     
      if (buffer.getLength() > 0)
        return;   // still have data in buffer
      // TODO: any fields to set?

      track.readFrame(buffer);
      logger.fine("Read buffer from track: " + buffer.getLength());
     
    }
    while (buffer.isDiscard());
  }
 
  //@Override
  @Override
  public int read() throws IOException
  {
    // TODO: how do we detect IOException?
    fillBuffer();
    if (buffer.getLength() == 0 && buffer.isEOM()) // TODO: will always be EOM if length is 0
      return -1;
    final byte[] data = (byte[]) buffer.getData();
    final int result = data[buffer.getOffset()] & 0xff;
    buffer.setOffset(buffer.getOffset() + 1);
    buffer.setLength(buffer.getLength() - 1);
   
    return result;
   
  }

  //@Override
  @Override
  public int read(byte[] b, int off, int len) throws IOException
  {
   
    // TODO: how do we detect IOException?
    fillBuffer();
    if (buffer.getLength() == 0 && buffer.isEOM()) // TODO: will always be EOM if length is 0
      return -1;
    final byte[] data = (byte[]) buffer.getData();

    int lengthToCopy = buffer.getLength() < len ? buffer.getLength() : len;
    System.arraycopy(data, buffer.getOffset(), b, off, lengthToCopy);
    buffer.setOffset(buffer.getOffset() + lengthToCopy);
    buffer.setLength(buffer.getLength() - lengthToCopy);

    return lengthToCopy;
  }


}
TOP

Related Classes of net.sf.fmj.media.TrackInputStream

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.