/* * @(#)MediaTimeBase.java 1.3 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import javax.media.*; /** * This is the abstract base class to create a time base * out of the media time of a component. * e.g., this can be used to generate a time base from an audio * device with reports time ticks as samples are played. * A TimeBase ticks even when the media has stopped. This class * takes care of that by internally maintaining a system time base * that takes over when the media has ended. * A TimeBase needs to be monotonically increasing. If the media * time is set or wrapped around, this class will takes care of that. */ abstract public class MediaTimeBase implements TimeBase { long origin = 0; long offset = 0; long time = 0; TimeBase systemTimeBase = null; public MediaTimeBase() { mediaStopped(); } public Time getTime() { return new Time(getNanoseconds()); } public synchronized long getNanoseconds() { long t; if (systemTimeBase != null) time = origin + systemTimeBase.getNanoseconds() - offset; else time = origin + getMediaTime() - offset; return time; } abstract public long getMediaTime(); public synchronized void mediaStarted() { systemTimeBase = null; offset = getMediaTime(); origin = time; } public synchronized void mediaStopped() { systemTimeBase = new SystemTimeBase(); offset = systemTimeBase.getNanoseconds(); origin = time; } }