From 9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e Mon Sep 17 00:00:00 2001 From: Michiel Van Der Kolk Date: Mon, 11 Jul 2005 15:42:37 +0000 Subject: Songdb java version, source. only 1.5 compatible git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7101 a1c6a512-1295-4272-9138-f99709370657 --- .../tritonus/share/sampled/mixer/TDataLine.java | 304 +++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 songdbj/org/tritonus/share/sampled/mixer/TDataLine.java (limited to 'songdbj/org/tritonus/share/sampled/mixer/TDataLine.java') diff --git a/songdbj/org/tritonus/share/sampled/mixer/TDataLine.java b/songdbj/org/tritonus/share/sampled/mixer/TDataLine.java new file mode 100644 index 0000000000..a493bac6c5 --- /dev/null +++ b/songdbj/org/tritonus/share/sampled/mixer/TDataLine.java @@ -0,0 +1,304 @@ +/* + * 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 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 ***/ + -- cgit v1.2.3