License text

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER 
 * Copyright  2008, 2010 Oracle and/or its affiliates.  All rights reserved. 
 * Use is subject to license terms.
 * 
 * This file is available and licensed under the following license:
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met: 
 * 
 *   * Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer. 
 *
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *
 *   * Neither the name of Oracle Corporation nor the names of its contributors 
 *     may be used to endorse or promote products derived from this software 
 *     without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

    

package fxpodcastviewer.media;

import javafx.scene.media.*;

/**
 * @author Baechul Kim
 * updated by Raghu Nair
 */
public class MyPlayer extends MediaPlayer {


    public-read var width: Number = bind media.width;
    public-read var height: Number = bind media.height;

    public var running: Boolean = false;

    public override var status on replace {
        if(status == MediaPlayer.PAUSED) {
            running = false;
        } else if(status == MediaPlayer.PLAYING) {
            running = true;
        }
    }

    public override var media on replace {
        if(autoPlay and media != null) {
            running = true;
        }
    }

    var skip: Boolean = false;
    public var progress: Number = 0 on replace {
        if(media != null) {
            if(media.duration.toMillis() != Number.NEGATIVE_INFINITY and
               media.duration.toMillis() != Number.NEGATIVE_INFINITY) {
                skip = true;
                currentTime = media.duration.mul(progress);
                skip = false;
            }
        }
    }

    public override var currentTime on replace {
        // to get around an issue of buffer progress variable update.
        var saved = balance;
        balance = 0.1;
        balance = saved;

        if(media != null) {
            if(media.duration.toMillis() != java.lang.Double.NEGATIVE_INFINITY and
            media.duration.toMillis() != Number.NEGATIVE_INFINITY and
            media.duration.toMillis() != 0 and
            currentTime.toMillis() != java.lang.Double.NEGATIVE_INFINITY and
            currentTime.toMillis() != Number.NEGATIVE_INFINITY) {
                if(not skip) {
                    progress = currentTime.toMillis() / media.duration.toMillis();
                }

                if(currentTime == media.duration) {
                    running = false;
                }
            }
        }
    }

    public var bufferProgress: Number = 0 ;

    var myBufferProgressTime = bind bufferProgressTime on replace {
        if(media != null) {
            if(media.duration.toMillis() != java.lang.Double.NEGATIVE_INFINITY and
               media.duration.toMillis() != Number.NEGATIVE_INFINITY and
               media.duration.toMillis() != 0 and
               bufferProgressTime.toMillis() != java.lang.Double.NEGATIVE_INFINITY and
               bufferProgressTime.toMillis() != Number.NEGATIVE_INFINITY) {
                bufferProgress = bufferProgressTime.toMillis()/media.duration.toMillis();
            }
        }
    }

    public override function play() {
        if(media != null) {
            running = true;
        }
        super.play();
    }

    public override function stop() {
        running = false;
        super.stop();
    }

    public-read var timeInfo: String = bind
        if(currentTime != null)
            "{%tM (currentTime - 5m)}:{%tS (currentTime -5m)} / {%tM (media.duration -5m)}:{%tS (media.duration-5m)}"
        else
            "";

    public-read var shortTimeInfo: String =
        bind "{%tM currentTime -5m}:{%tS currentTime -5m}";

    public-read var durationInfo: String =
        bind "{%tM media.duration -5m}:{%tS media.duration -5m}";
}