/* * @(#)ElapseTime.java 1.5 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.util; import javax.media.*; import javax.media.format.*; /** * A utility class to keep track of the passage of time as data * buffers are being processed. */ public class ElapseTime { public long value = 0; public void setValue(long t) { value = t; } public long getValue() { return value; } public boolean update(int len, long ts, Format f) { if (f instanceof AudioFormat) { long t; if ((t = ((AudioFormat)f).computeDuration(len)) > 0) value += t; else if (ts > 0) value = ts; else return false; } else if (ts > 0) value = ts; else return false; return true; } /** * Convert audio: length (bytes) to duration (nanoseconds). */ static public long audioLenToTime(long len, AudioFormat af) { return af.computeDuration(len); } /** * Convert audio: duration (nanoseconds) to length (bytes). */ static public long audioTimeToLen(long duration, AudioFormat af) { long units, bytesPerSec; if (af.getSampleSizeInBits() > 0) { units = (long)(af.getSampleSizeInBits() * af.getChannels()); bytesPerSec = (long)((units * af.getSampleRate()) / 8); } else if (af.getFrameSizeInBits() != Format.NOT_SPECIFIED && af.getFrameRate() != Format.NOT_SPECIFIED) { units = af.getFrameSizeInBits(); bytesPerSec = (long)((units * af.getFrameRate()) / 8); } else { units = bytesPerSec = 0; } // The length returned needs to be in multiples of audio sample // chunk unit. return (bytesPerSec == 0 ? 0 : (long)((duration * bytesPerSec) / 1000000000) / units * units); } }