/*
 * 
 * Copyright  1990-2006 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation. 
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt). 
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA 
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions. 
 */

package javax.microedition.media.control;

/**
 * <code>VolumeControl</code> is an interface for manipulating 
 * the audio volume of a <code>Player</code>.
 *
 * <h3>Volume Settings</h3>
 * This interface allows the output volume to be specified 
 * using an integer value that varies between 0 and 100.
 *
 *<h4>Specifying Volume in the Level Scale</h4>
 * The level scale specifies volume in a linear scale.
 * It ranges from 0 to 100, where 0 represents
 * silence and 100 represents the highest volume.
 * The mapping for
 * producing a linear multiplicative value is
 * implementation dependent.
 * <p>
 *
 * <h3>Mute</h3>
 * Setting mute on or off doesn't change the volume level
 * returned by getLevel.
 * If mute is <CODE>true</CODE>,
 * no audio signal is produced by this <code>Player</code>; if mute 
 * is <CODE>false</CODE>
 * an audio signal is produced and the volume is restored.
 *
 * <h3>Volume Change Events</h3>
 * When the state of the <code>VolumeControl</code> changes, a
 * <code>VOLUME_CHANGED</code> event is delivered through
 * the <code>PlayerListener</code>.
 *
 * @see javax.microedition.media.Control
 * @see javax.microedition.media.Player
 * @see javax.microedition.media.PlayerListener
 */

public interface VolumeControl extends javax.microedition.media.Control {
    
    /**
     * Mute or unmute the <code>Player</code> associated with this 
     * <code>VolumeControl</code>.
     * <br>
     * Calling <code>setMute(true)</code> on
     * the <code>Player</code> that is already muted is ignored, 
     * as is calling <code>setMute(false)</code> on the 
     * <code>Player</code> that is not currently muted.
     * Setting mute on or off doesn't change the volume level
     * returned by getLevel.
     * <br>
     * When <code>setMute</code> results in a change in 
     * the muted state,
     * a <code>VOLUME_CHANGED</code> event will be delivered
     * through the <code>PlayerListener</code>.
     *
     * @see #isMuted
     * 
     * @param mute Specify <CODE>true</CODE> to mute the signal, 
     * <CODE>false</CODE> to unmute the signal.
     */
    void setMute(boolean mute);

    /**
     * Get the mute state of the signal associated with this 
     * <code>VolumeControl</code>.
     *
     * @see #setMute
     *
     * @return The mute state.
     */
    boolean isMuted();

    /**
     * Set the volume using a linear point scale
     * with values between 0 and 100.
     * <br>
     * 0 is silence; 100 is the loudest
     * useful level that this <code>VolumeControl</code> supports.
     * If the given level is less than 0 or greater than 100,
     * the level will be set to 0 or 100 respectively.
     * <br>
     * When <code>setLevel</code> results in a change in 
     * the volume level,
     * a <code>VOLUME_CHANGED</code> event will be delivered
     * through the <code>PlayerListener</code>.
     *
     * @see #getLevel
     *
     * @param level The new volume specified in the level scale.
     * @return The level that was actually set.
     */
    int setLevel(int level);

    /**
     * Get the current volume level set.
     * <br>
     * <code>getLevel</code> may return <code>-1</code>
     * if and only if the <code>Player</code> is in the
     * <i>REALIZED</i> state (the audio device has not been 
     * initialized) and <code>setLevel</code> has not 
     * yet been called.
     *  
     * @see #setLevel
     *
     * @return The current volume level or <code>-1</code>.
     */
    int getLevel();
}
