All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.monte.media.AbstractPlayer Maven / Gradle / Ivy

The newest version!

package org.monte.media;


import org.monte.media.concurrent.SequentialDispatcher;
import java.beans.*;

import javax.swing.event.*;


public abstract class AbstractPlayer
implements Player, Runnable {

    private int state = UNREALIZED;


    private int targetState = UNREALIZED;


    protected EventListenerList listenerList = new EventListenerList();


    protected PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);


    protected SequentialDispatcher dispatcher = new SequentialDispatcher();


    public AbstractPlayer() {
    }


    @Override
    public int getState() {
        return state;
    }


    @Override
    public int getTargetState() {
        return targetState;
    }


    @Override
    public void setTargetState(final int state) {
        synchronized (this) {
            if (targetState != CLOSED) {
                targetState = state;
                AbstractPlayer.this.notifyAll();
                dispatcher.dispatch(this);
            }
        }
    }


    @Override
    public void realize() {
        switch (getState()) {
            case CLOSED :
                throw new IllegalStateException("Realize closed player.");

            case STARTED :
                throw new IllegalStateException("Realize started player.");

        }
        setTargetState(REALIZED);
    }


    public void prefetch() {
        switch (getState()) {
            case CLOSED :
                throw new IllegalStateException("Prefetch closed player.");

            case STARTED :
                throw new IllegalStateException("Prefetch started player.");

        }
        setTargetState(PREFETCHED);
    }


    public void deallocate() {
        switch (getState()) {
            case CLOSED :
                throw new IllegalStateException("Deallocate closed player.");

            case REALIZING :
                setTargetState(UNREALIZED);
                break;
            case PREFETCHING :
                setTargetState(REALIZED);
                break;
            case PREFETCHED :
                setTargetState(REALIZED);
                break;
            case STARTED :
                throw new IllegalStateException("Deallocate started player.");

        }
    }



    public void start() {
        switch (getState()) {
            case CLOSED :
                throw new IllegalStateException("Can't start closed player.");

        }
        setTargetState(STARTED);
    }


    public void stop() {
        switch (getState()) {
            case CLOSED :


                break;
            case STARTED :
                setTargetState(PREFETCHED);
                break;
        }
    }


    public void close() {
        setTargetState(CLOSED);
    }


    public void addStateListener(StateListener l) {
        listenerList.add(StateListener.class, l);
    }


    public void removeStateListener(StateListener l) {
        listenerList.remove(StateListener.class, l);
    }


    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }


    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }



    protected void fireStateChanged(int newState) {
        StateEvent stateEvent = null;
        ChangeEvent changeEvent = null;
        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -=2 ) {
            if (listeners[i] == StateListener.class) {

                if (stateEvent == null) stateEvent = new StateEvent(this, newState);
                ((StateListener)listeners[i+1]).stateChanged(stateEvent);
            }
            if (listeners[i] == ChangeListener.class) {

                if (changeEvent == null) changeEvent = new ChangeEvent(this);
                ((ChangeListener)listeners[i+1]).stateChanged(changeEvent);
            }
        }
    }

    protected void fireStateChanged() {
        StateEvent stateEvent = null;
        ChangeEvent changeEvent = null;
        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -=2 ) {
            if (listeners[i] == ChangeListener.class) {

                if (changeEvent == null) changeEvent = new ChangeEvent(this);
                ((ChangeListener)listeners[i+1]).stateChanged(changeEvent);
            }
        }
    }

    public void run() {
        while (state != targetState) {
            if (targetState > state) {
                state++;
            } else {
                state = targetState;
            }
            fireStateChanged(state);

            switch (state) {
                case CLOSED :
                    doClosed();
                    break;
                case UNREALIZED :
                    doUnrealized();
                    break;
                case REALIZING :
                    doRealizing();
                    break;
                case REALIZED :
                    doRealized();
                    break;
                case PREFETCHING :
                    doPrefetching();
                    break;
                case PREFETCHED :
                    doPrefetched();
                    break;
                case STARTED :
                    doStarted();
                    setTargetState(PREFETCHED);
                    break;
            }
        }
    }


    abstract protected void doClosed();


    abstract protected void doUnrealized();


    abstract protected void doRealizing();


    abstract protected void doRealized();


    abstract protected void doPrefetching();


    abstract protected void doPrefetched();


    abstract protected void doStarted();


    public void addChangeListener(ChangeListener listener) {
        listenerList.add(ChangeListener.class, listener);
    }


    public void removeChangeListener(ChangeListener listener) {
        listenerList.remove(ChangeListener.class, listener);
    }


    public boolean isActive() {
        return getTargetState() == STARTED;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy