/*
  Module inspired by the MediaControl IDL
 */
module VLC {

  const float VERSION = 0.1;

  enum PositionOrigin {
    AbsolutePosition, RelativePosition, ModuloPosition
  };
  
  enum PositionKey {
    ByteCount, SampleCount, MediaTime
  };
  
  struct Position {
    PositionOrigin origin;
    PositionKey key;
    long long value;
  };
  
  exception PositionKeyNotSupported { string message; };
  exception PositionOriginNotSupported { string message; };
  exception InvalidPosition         { string message; };
  exception PlaylistException       { string message; };
  exception InternalException       { string message; };

  typedef sequence<string> PlaylistSeq; 
  typedef sequence<octet> ByteSeq;
  
  struct RGBPicture {
    short width;
    short height;
    long type;
    ByteSeq data;
    long long date;
  };
  
  typedef sequence<RGBPicture> RGBPictureSeq;
  
  /* Cf stream_control.h */
  enum PlayerStatus { PlayingStatus, PauseStatus, ForwardStatus, BackwardStatus, InitStatus, EndStatus, UndefinedStatus };
  
  struct StreamInformation {
    PlayerStatus streamstatus;
    string url;        /* The URL of the current media stream */
    long long position;     /* actual location in the stream (in ms) */
    long long length;         /* total length of the stream (in ms) */
  };
  
   // MediaControl interface is similar to
   // ControlledStream interface in MSS.
   // It can be inherited by flow endpoints or
   // FlowConnection interfaces.
  interface MediaControl
  {
    Position get_media_position(in PositionOrigin an_origin,
				in PositionKey a_key)
      raises (InternalException, PositionKeyNotSupported);
    
    void set_media_position(in Position a_position)
      raises (InternalException, PositionKeyNotSupported, InvalidPosition);
     
    void start(in Position a_position)
      raises (InternalException, InvalidPosition, PlaylistException);
    void pause(in Position a_position)
      raises (InternalException, InvalidPosition);
    void resume(in Position a_position)
      raises (InternalException, InvalidPosition);
    void stop(in Position a_position)
      raises (InternalException, InvalidPosition);

    oneway void exit (); // Exits the player (not in the original spec)

    void playlist_add_item (in string a_file)
      raises (PlaylistException);
    void playlist_clear ()
      raises (PlaylistException);
    // Returns the list of files in playlist
    PlaylistSeq playlist_get_list ()
      raises (PlaylistException);

    // Returns a snapshot of the currently displayed picture
    RGBPicture snapshot (in Position a_position)
      raises (InternalException);

    RGBPictureSeq all_snapshots ()
      raises (InternalException);

    // Displays the message string, between "begin" and "end" positions
    void display_text (in string message, in Position begin, in Position end)
      raises (InternalException);

    StreamInformation get_stream_information ()
      raises (InternalException);
    
    unsigned short sound_get_volume()
      raises (InternalException);

    void sound_set_volume(in unsigned short volume)
      raises (InternalException);

  };
};
