home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-09-28 | 4.8 KB | 118 lines | [TEXT/CWIE] |
- /*
- File: Throttle.java
-
- Author: Jens Alfke <jens@apple.com>
-
- Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
- ("Apple") in consideration of your agreement to the following terms, and your
- use, installation, modification or redistribution of this Apple software
- constitutes acceptance of these terms. If you do not agree with these terms,
- please do not use, install, modify or redistribute this Apple software.
-
- In consideration of your agreement to abide by the following terms, and subject
- to these terms, Apple grants you a personal, non-exclusive license, under Appleās
- copyrights in this original Apple software (the "Apple Software"), to use,
- reproduce, modify and redistribute the Apple Software, with or without
- modifications, in source and/or binary forms; provided that if you redistribute
- the Apple Software in its entirety and without modifications, you must retain
- this notice and the following text and disclaimers in all such redistributions of
- the Apple Software. Neither the name, trademarks, service marks or logos of
- Apple Computer, Inc. may be used to endorse or promote products derived from the
- Apple Software without specific prior written permission from Apple. Except as
- expressly stated in this notice, no other rights or licenses, express or implied,
- are granted by Apple herein, including but not limited to any patent rights that
- may be infringed by your derivative works or by other works in which the Apple
- Software may be incorporated.
-
- The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
- WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
- WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
- COMBINATION WITH YOUR PRODUCTS.
-
- IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
- OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
- (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Change History (most recent first):
-
- */
-
-
- package com.apple.jens.radio;
-
-
- /** A simple bandwidth manager that attempts to keep the current thread in sync with
- a "clock" such as the timing of MP3 data.
- This is used by Transmitter and by DJ implementations to keep themselves all running
- at the proper (bit-) rate so they don't trip over each other. */
- public class Throttle {
-
- public Throttle( String name ) {
- fName = name;
- resetTime();
- }
-
-
- /** Moves the target time ahead by a certain number of milliseconds,
- If the target time hasn't been reached yet, sleep until it's reached.
- If the target time is already past, start logging messages. */
- public void addTime( long millis ) throws InterruptedException {
- fTarget += millis;
- long snooze = fTarget - System.currentTimeMillis();
- if( snooze > 0 ) {
- // Ahead of schedule, so sleep:
- Radio.LOG(3,fName,"Snoozing for "+snooze+"ms to match MP3 bitrate");
- Thread.sleep(snooze);
- } else {
- // Behind schedule, uh-oh:
- long slip = -snooze;
- // If the slip is >100ms and has changed more than 10% since the last warning,
- // send another warning:
- if( slip > 100 && (fSlip==0 || Math.abs(slip-fSlip)/(float)fSlip >= 0.10) ) {
- Radio.LOG(1,fName,"I'm now "+(-snooze)+"ms behind schedule!");
- fSlip = slip;
- }
- if( slip > kMaxSlippage ) {
- // If the slip gets great enough, forget about it and start with a clean
- // state, otherwise the Transmitter will spend the rest of its life
- // fruitlessly trying to catch up.
- resetTime();
- fSlip = 0;
- Radio.LOG(1,fName,"...time to clean the slate and ignore the accumulated slip.");
- }
- }
- }
-
-
- /** Resets the target time to the current time.
- This can be used to make sync stop logging messages
- if the thread has fallen irreversably behind. */
- public void resetTime( ) {
- fTarget = System.currentTimeMillis();
- }
-
-
- private final String fName;
-
- /** The target time we're supposed to be at (as of the last call to addTime) */
- private long fTarget;
-
- /** The amount of the last slip logged to the console */
- private long fSlip;
-
-
- // CONSTANTS:
-
-
- /** Max milliseconds that the Transmitter can fall behind where it ought to be;
- if this is exceeded, the Transmitter will forget about the accumulated slippage and start
- its timing over again with a clean slate. */
- public static final int kMaxSlippage = 2000;
-
- }
-