rockbox/songdbj/org/tritonus/share/sampled/mixer/TDataLine.java
Michiel Van Der Kolk 9fee0ec4ca Songdb java version, source. only 1.5 compatible
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7101 a1c6a512-1295-4272-9138-f99709370657
2005-07-11 15:42:37 +00:00

304 lines
4.9 KiB
Java

/*
* TDataLine.java
*
* This file is part of Tritonus: http://www.tritonus.org/
*/
/*
* Copyright (c) 1999 - 2004 by Matthias Pfisterer
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/*
|<--- this code is formatted to fit into 80 columns --->|
*/
package org.tritonus.share.sampled.mixer;
import java.util.Collection;
import java.util.EventListener;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Set;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Control;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.Line;
import org.tritonus.share.TDebug;
/** Base class for classes implementing DataLine.
*/
public abstract class TDataLine
extends TLine
implements DataLine
{
private static final int DEFAULT_BUFFER_SIZE = 128000;
private AudioFormat m_format;
private int m_nBufferSize;
private boolean m_bRunning;
// private boolean m_bActive;
public TDataLine(TMixer mixer,
DataLine.Info info)
{
super(mixer,
info);
init(info);
}
public TDataLine(TMixer mixer,
DataLine.Info info,
Collection<Control> controls)
{
super(mixer,
info,
controls);
init(info);
}
// IDEA: extract format and bufsize from info?
private void init(DataLine.Info info)
{
m_format = null;
m_nBufferSize = AudioSystem.NOT_SPECIFIED;
setRunning(false);
// setActive(false);
}
// not defined here:
// public void drain()
// public void flush()
public void start()
{
if (TDebug.TraceSourceDataLine)
{
TDebug.out("TDataLine.start(): called");
}
setRunning(true);
}
public void stop()
{
if (TDebug.TraceSourceDataLine)
{
TDebug.out("TDataLine.stop(): called");
}
setRunning(false);
}
public boolean isRunning()
{
return m_bRunning;
}
// TODO: recheck
protected void setRunning(boolean bRunning)
{
boolean bOldValue = isRunning();
m_bRunning = bRunning;
if (bOldValue != isRunning())
{
if (isRunning())
{
startImpl();
notifyLineEvent(LineEvent.Type.START);
}
else
{
stopImpl();
notifyLineEvent(LineEvent.Type.STOP);
}
}
}
protected void startImpl()
{
}
protected void stopImpl()
{
}
/**
* This implementation returns the status of isRunning().
* Subclasses should overwrite this method if there is more
* precise information about the status of the line available.
*/
public boolean isActive()
{
return isRunning();
}
/*
public boolean isStarted()
{
return m_bStarted;
}
*/
// TODO: should only ALLOW engaging in data I/O.
// actual START event should only be sent when line really becomes active
/*
protected void setStarted(boolean bStarted)
{
m_bStarted = bStarted;
if (!isRunning())
{
setActive(false);
}
}
*/
public AudioFormat getFormat()
{
return m_format;
}
protected void setFormat(AudioFormat format)
{
if (TDebug.TraceDataLine)
{
TDebug.out("TDataLine.setFormat(): setting: " + format);
}
m_format = format;
}
public int getBufferSize()
{
return m_nBufferSize;
}
protected void setBufferSize(int nBufferSize)
{
if (TDebug.TraceDataLine)
{
TDebug.out("TDataLine.setBufferSize(): setting: " + nBufferSize);
}
m_nBufferSize = nBufferSize;
}
// not defined here:
// public int available()
public int getFramePosition()
{
// TODO:
return -1;
}
public long getLongFramePosition()
{
// TODO:
return -1;
}
public long getMicrosecondPosition()
{
return (long) (getFramePosition() * getFormat().getFrameRate() * 1000000);
}
/*
* Has to be overridden to be useful.
*/
public float getLevel()
{
return AudioSystem.NOT_SPECIFIED;
}
protected void checkOpen()
{
if (getFormat() == null)
{
throw new IllegalStateException("format must be specified");
}
if (getBufferSize() == AudioSystem.NOT_SPECIFIED)
{
setBufferSize(getDefaultBufferSize());
}
}
protected int getDefaultBufferSize()
{
return DEFAULT_BUFFER_SIZE;
}
protected void notifyLineEvent(LineEvent.Type type)
{
notifyLineEvent(new LineEvent(this, type, getFramePosition()));
}
}
/*** TDataLine.java ***/