/*
 * Copyright (c) 2009-2012 jMonkeyEngine
 * All rights reserved.
 *
 * 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 'jMonkeyEngine' 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 com.jme3.niftygui;

import com.jme3.asset.AssetManager;
import com.jme3.audio.AudioNode;
import com.jme3.audio.AudioSource.Status;
import com.jme3.audio.AudioRenderer;
import de.lessvoid.nifty.spi.sound.SoundHandle;

public class SoundHandleJme implements SoundHandle {

    private AudioNode node;
    private AssetManager am;
    private String fileName;
    private float volume = 1;

    public SoundHandleJme(AudioRenderer ar, AudioNode node){
        if (ar == null || node == null) {
            throw new NullPointerException();
        }

        this.node = node;
    }

    /**
     * For streaming music only. (May need to loop..)
     * @param ar
     * @param am
     * @param fileName
     */
    public SoundHandleJme(AudioRenderer ar, AssetManager am, String fileName){
        if (ar == null || am == null) {
            throw new NullPointerException();
        }

        this.am = am;
        if (fileName == null) {
            throw new NullPointerException();
        }
        
        this.fileName = fileName;
    }

    public void play() {
        if (fileName != null){
            if (node != null){
                node.stop();
            }

            node = new AudioNode(am, fileName, true);
            node.setPositional(false);
            node.setVolume(volume);
            node.play();
        }else{
            node.playInstance();
        }
    }

    public void stop() {
        if (node != null){
            node.stop();
            // Do not nullify the node for non-streaming nodes!
            if (fileName != null) {
                // Causes play() to reload the stream on the next playback
                node = null;
            }
        }
    }

    public void setVolume(float f) {
        if (node != null) {
            node.setVolume(f);
        }
        volume = f;
    }

    public float getVolume() {
        return volume;
    }

    public boolean isPlaying() {
        return node != null && node.getStatus() == Status.Playing;
    }

    public void dispose() {
    }
}
