/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_media_XPlayer_idl__
#define __com_sun_star_media_XPlayer_idl__

#ifndef __com_sun_star_awt_Size_idl__
#include <com/sun/star/awt/Size.idl>
#endif
#ifndef __com_sun_star_media_XPlayerWindow_idl__
#include <com/sun/star/media/XPlayerWindow.idl>
#endif
#ifndef __com_sun_star_media_XFrameGrabber_idl__
#include <com/sun/star/media/XFrameGrabber.idl>
#endif

module com {  module sun {  module star {  module media {

/** is the multimedia stream handling interface. This allows to
    perform every basic operation on videos and sounds.
 */
interface XPlayer
{
    /** starts reading the stream from the current position.
     */
    void start();
    
    /** stops reading the stream and leave the cursor at its current 
        position.
     */
    void stop();

    /** indicates whether the stream is played or not.

        @returns 
            <TRUE/> if the stream is played, <FALSE/> otherwise
     */
    boolean isPlaying();

    /** gets the stream length

        @returns
            the stream length in second
     */
    double getDuration();

    /** sets the new cursor position in the media stream. After using
        this method the stream is stopped.
 
        @param fTime
            the new position to set in seconds
     */
    void setMediaTime( [in] double fTime );
    
    /** gets the current position of the cursor in the stream

        @returns
            the cursor position in seconds
     */
    double getMediaTime();

    /** sets the time at which to stop reading the stream.

        @param fTime
            the time at which to stop reading the stream in seconds
     */
    void setStopTime( [in] double fTime );
    
    /** gets the time at which the stream will stop. The result
        is not guaranteed if no stop time has been set.
     */
    double getStopTime();

    /** sets the speed of the stream reading relatively to the normal
        speed.

        @param fRate
            the stream reading rate. <code>1.0</code> means normal speed.
     */
    void setRate( [in] double fRate );
    
    /** gets the speed of the stream reading relatively to the normal
        reading.

        @returns
            the relative speed. <code>1.0</code> is the normal speed.
     */
    double getRate();

    /** sets whether the stream reading should restart at the stream 
        start after the end of the stream.
        
        @param bSet
            loops if set to <TRUE/>, otherwise stops at the end of the 
            stream.
     */
    void setPlaybackLoop( [in] boolean bSet );
    
    /** indicates whether the stream reading will restart after the 
        end of the stream.

        @returns
            <TRUE/> if the stream will loop, <FALSE/> otherwise.
     */
    boolean isPlaybackLoop();
    
    /** sets the audio volume in decibel.
        
        @param nDB
            the new volume in Decibel
     */
    void setVolumeDB( [in] short nDB );
    
    /** gets the current audio volume in decibel

        @returns
            the volume in decibel
     */
    short getVolumeDB();
    
    /** sets the volume to <code>0</code> or to its previous value.
       
        @param bSet
            sets the volume to <code>0</code> if <TRUE/>, and switch 
            to the previous non-null value if <FALSE/>
     */
    void setMute( [in] boolean bSet );
    
    /** gets whether the volume is temporarily down to <code>0</code>
        or not.

        @returns
            <TRUE/> if the volume is temporarily set to <code>0</code>,
            <FALSE/> otherwise.
     */
    boolean isMute();

    /** gets the preferred window size

        @returns
            the <type scope="com::sun::star::awt">Size</type>
     */
    ::com::sun::star::awt::Size getPreferredPlayerWindowSize();
    
    /** gets a new player window for this stream control

        @param aArguments
            arguments passed to the window during its creation.
     */
    XPlayerWindow createPlayerWindow( [in] sequence< any > aArguments );
    
    /** gets a frame grabber for this stream.
     */
    XFrameGrabber createFrameGrabber();
};

}; }; }; };

#endif
