{* UltraStar Deluxe - Karaoke Game
 *
 * UltraStar Deluxe is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING. If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * $URL: svn://basisbit@svn.code.sf.net/p/ultrastardx/svn/trunk/src/media/UMedia_dummy.pas $
 * $Id: UMedia_dummy.pas 2945 2013-02-22 22:33:33Z k-m_schindler $
 *}

unit UMedia_dummy;

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

implementation

uses
  SysUtils,
  math,
  Classes,
  UTime,
  UMusic,
  UPath;

type
    TAudio_Dummy = class( TInterfacedObject, IAudioPlayback, IAudioInput )
    private
      DummyOutputDeviceList: TAudioOutputDeviceList;
    public
      constructor Create();
      function GetName: string;

      function Init(): boolean;
      function Finalize(): boolean;

      function Open(const aFileName: IPath; const aFileNameKaraoke: IPath): boolean; // true if succeed
      procedure Close;
      function  GetFileName: string;

      procedure Play;
      procedure ToggleKaraoke;
      procedure Pause;
      procedure Stop;

      procedure SetPosition(Time: real);
      function  GetPosition: real;
      procedure SetStartTime(Time: real);
      function  GetStartTime: real;

      procedure SetSyncSource(SyncSource: TSyncSource);

      // IAudioInput
      function InitializeRecord(ScanMode: TAudioInputScanMode): boolean;
      function FinalizeRecord: boolean;
      procedure CaptureStart;
      procedure CaptureStop;
      procedure GetFFTData(var data: TFFTData);
      function GetPCMData(var data: TPCMData): Cardinal;

      // IAudioPlayback
      function InitializePlayback: boolean;
      function FinalizePlayback: boolean;

      function GetOutputDeviceList(): TAudioOutputDeviceList;
      procedure FadeIn(Time: real; TargetVolume: single);
      procedure Fade(Time: real; TargetVolume: single);
      procedure SetAppVolume(Volume: single);
      procedure SetVolume(Volume: single);
      procedure SetVocalsBalance(Balance: single);
      function GetVocalsBalance: single;
      function HasInstrumentalTrack: boolean;
      function GetOverallVolume: single;
      procedure Rewind;

      procedure SetLoop(Enabled: boolean);
      function GetLoop(): boolean;

      function Finished: boolean;
      function Length: real;

      function OpenSound(const Filename: IPath): TAudioPlaybackStream;
      function OpenSoundBuffer(Buffer: TStream; Format: TAudioFormatInfo): TAudioPlaybackStream;
      procedure CloseSound(var PlaybackStream: TAudioPlaybackStream);
      procedure PlaySound(stream: TAudioPlaybackStream);
      procedure StopSound(stream: TAudioPlaybackStream);

      function CreateVoiceStream(Channel: integer; FormatInfo: TAudioFormatInfo): TAudioVoiceStream;
      function CreatePlaybackStreamForSource(SourceStream: TAudioSourceStream): TAudioPlaybackStream;
      procedure CloseVoiceStream(var VoiceStream: TAudioVoiceStream);
    end;

    TVideo_Dummy = class( TInterfacedObject, IVideo )
    public
      procedure Close;

      procedure Play;
      procedure Pause;
      procedure Stop;

      procedure SetLoop(Enable: boolean);
      function GetLoop(): boolean;

      procedure SetPosition(Time: real);
      function GetPosition: real;

      procedure SetScreen(Screen: integer);
      function GetScreen(): integer;

      procedure SetScreenPosition(X, Y, Z: double);
      procedure GetScreenPosition(var X, Y, Z: double);

      procedure  SetWidth(Width: double);
      function GetWidth(): double;

      procedure  SetHeight(Height: double);
      function GetHeight(): double;

      procedure SetFrameRange(Range: TRectCoords);
      function GetFrameRange(): TRectCoords;

      function GetFrameAspect(): real;

      procedure SetAspectCorrection(AspectCorrection: TAspectCorrection);
      function GetAspectCorrection(): TAspectCorrection;

      procedure SetAlpha(Alpha: double);
      function GetAlpha(): double;

      procedure SetReflectionSpacing(Spacing: double);
      function GetReflectionSpacing(): double;

      procedure GetFrame(Time: Extended);
      procedure Draw();
      procedure DrawReflection();

      property Screen: integer read GetScreen;
      property Width: double read GetWidth write SetWidth;
      property Height: double read GetHeight write SetWidth;
      property Alpha: double read GetAlpha write SetAlpha;
      property ReflectionSpacing: double read GetReflectionSpacing write SetReflectionSpacing;
      property FrameAspect: real read GetFrameAspect;
      property AspectCorrection: TAspectCorrection read GetAspectCorrection;
      property Loop: boolean read GetLoop write SetLoop;
      property Position: real read GetPosition write SetPosition;
    end;

    TVideoPlayback_Dummy = class( TInterfacedObject, IVideoPlayback, IVideoVisualization )
    public
      constructor Create();
      function GetName: string;

      function Init(): boolean;
      function Finalize(): boolean;

      function Open(const FileName: IPath): IVideo;
    end;

function  TAudio_Dummy.GetName: string;
begin
  Result := 'AudioDummy';
end;

constructor TAudio_Dummy.Create();
begin
  inherited;
end;

function TAudio_Dummy.Init(): boolean;
begin
  Result := true;
end;

function TAudio_Dummy.Finalize(): boolean;
begin
  Result := true;
end;

function TAudio_Dummy.Open(const aFileName : IPath; const aFileNameKaraoke : IPath): boolean; // true if succeed
begin
  Result := false;
end;

procedure TAudio_Dummy.Close;
begin
end;

function TAudio_Dummy.GetFileName: string;
begin
  Result := '';
end;

procedure TAudio_Dummy.Play;
begin
end;

procedure TAudio_Dummy.ToggleKaraoke;
begin
end;

procedure TAudio_Dummy.Pause;
begin
end;

procedure TAudio_Dummy.Stop;
begin
end;

procedure TAudio_Dummy.SetPosition(Time: real);
begin
end;

function  TAudio_Dummy.GetPosition: real;
begin
  Result := 0;
end;

procedure TAudio_Dummy.SetStartTime(Time: real);
begin
end;

function  TAudio_Dummy.GetStartTime: real;
begin
  Result := 0;
end;

procedure TAudio_Dummy.SetSyncSource(SyncSource: TSyncSource);
begin
end;

// IAudioInput
function TAudio_Dummy.InitializeRecord(ScanMode: TAudioInputScanMode): boolean;
begin
  Result := true;
end;

function TAudio_Dummy.FinalizeRecord: boolean;
begin
  Result := true;
end;

procedure TAudio_Dummy.CaptureStart;
begin
end;

procedure TAudio_Dummy.CaptureStop;
begin
end;

procedure TAudio_Dummy.GetFFTData(var data: TFFTData);
begin
end;

function  TAudio_Dummy.GetPCMData(var data: TPCMData): Cardinal;
begin
  Result := 0;
end;

// IAudioPlayback
function TAudio_Dummy.InitializePlayback: boolean;
begin
  SetLength(DummyOutputDeviceList, 1);
  DummyOutputDeviceList[0] := TAudioOutputDevice.Create();
  DummyOutputDeviceList[0].Name := '[Dummy Device]';
  Result := true;
end;

function TAudio_Dummy.FinalizePlayback: boolean;
begin
  Result := true;
end;

function TAudio_Dummy.GetOutputDeviceList(): TAudioOutputDeviceList;
begin
  Result := DummyOutputDeviceList;
end;

procedure TAudio_Dummy.SetAppVolume(Volume: single);
begin
end;

procedure TAudio_Dummy.SetVolume(Volume: single);
begin
end;

procedure TAudio_Dummy.SetVocalsBalance(Balance: single);
begin
end;

function TAudio_Dummy.GetVocalsBalance: single;
begin
  Result := 1.0;
end;

function TAudio_Dummy.HasInstrumentalTrack: boolean;
begin
  Result := false;
end;

function TAudio_Dummy.GetOverallVolume: single;
begin
  Result := 1.0;
end;

procedure TAudio_Dummy.SetLoop(Enabled: boolean);
begin
end;

function TAudio_Dummy.GetLoop(): boolean;
begin
  Result := false;
end;

procedure TAudio_Dummy.FadeIn(Time: real; TargetVolume: single);
begin
end;

procedure TAudio_Dummy.Fade(Time: real; TargetVolume: single);
begin
end;

procedure TAudio_Dummy.Rewind;
begin
end;

function TAudio_Dummy.Finished: boolean;
begin
  Result := false;
end;

function TAudio_Dummy.Length: real;
begin
  Result := 60;
end;

function TAudio_Dummy.OpenSound(const Filename: IPath): TAudioPlaybackStream;
begin
 Result := nil;
end;

function TAudio_Dummy.OpenSoundBuffer(Buffer: TStream; Format: TAudioFormatInfo): TAudioPlaybackStream;
begin
 Result := nil;
end;

procedure TAudio_Dummy.CloseSound(var PlaybackStream: TAudioPlaybackStream);
begin
end;

procedure TAudio_Dummy.PlaySound(stream: TAudioPlaybackStream);
begin
end;

procedure TAudio_Dummy.StopSound(stream: TAudioPlaybackStream);
begin
end;

function TAudio_Dummy.CreateVoiceStream(Channel: integer; FormatInfo: TAudioFormatInfo): TAudioVoiceStream;
begin
  Result := nil;
end;

function TAudio_Dummy.CreatePlaybackStreamForSource(SourceStream: TAudioSourceStream): TAudioPlaybackStream;
begin
  Result := nil;
end;

procedure TAudio_Dummy.CloseVoiceStream(var VoiceStream: TAudioVoiceStream);
begin
end;


{ TVideoPlayback_Dummy }

procedure TVideo_Dummy.Close;
begin
end;

procedure TVideo_Dummy.Play;
begin
end;

procedure TVideo_Dummy.Pause;
begin
end;

procedure TVideo_Dummy.Stop;
begin
end;

procedure TVideo_Dummy.SetLoop(Enable: boolean);
begin
end;

function TVideo_Dummy.GetLoop(): boolean;
begin
  Result := false;
end;

procedure TVideo_Dummy.SetPosition(Time: real);
begin
end;

function TVideo_Dummy.GetPosition: real;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetScreen(Screen: integer);
begin
end;

function TVideo_Dummy.GetScreen(): integer;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetScreenPosition(X, Y, Z: double);
begin
end;

procedure TVideo_Dummy.GetScreenPosition(var X, Y, Z: double);
begin
  X := 0;
  Y := 0;
  Z := 0;
end;

procedure TVideo_Dummy.SetWidth(Width: double);
begin
end;

function TVideo_Dummy.GetWidth(): double;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetHeight(Height: double);
begin
end;

function TVideo_Dummy.GetHeight(): double;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetFrameRange(Range: TRectCoords);
begin
end;

function TVideo_Dummy.GetFrameRange(): TRectCoords;
begin
  Result.Left := 0;
  Result.Right := 0;
  Result.Upper := 0;
  Result.Lower := 0;
end;

function TVideo_Dummy.GetFrameAspect(): real;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetAspectCorrection(AspectCorrection: TAspectCorrection);
begin
end;

function TVideo_Dummy.GetAspectCorrection(): TAspectCorrection;
begin
  Result := acoLetterbox;
end;

procedure TVideo_Dummy.SetAlpha(Alpha: double);
begin
end;

function TVideo_Dummy.GetAlpha(): double;
begin
  Result := 0;
end;

procedure TVideo_Dummy.SetReflectionSpacing(Spacing: double);
begin
end;

function TVideo_Dummy.GetReflectionSpacing(): double;
begin
  Result := 0;
end;

procedure TVideo_Dummy.GetFrame(Time: Extended);
begin
end;

procedure TVideo_Dummy.Draw();
begin
end;

procedure TVideo_Dummy.DrawReflection();
begin
end;


{ TVideoPlayback_Dummy }

constructor TVideoPlayback_Dummy.Create();
begin
end;

function TVideoPlayback_Dummy.GetName: string;
begin
  Result := 'VideoDummy';
end;

function TVideoPlayback_Dummy.Init(): boolean;
begin
  Result := true;
end;

function TVideoPlayback_Dummy.Finalize(): boolean;
begin
  Result := true;
end;

function TVideoPlayback_Dummy.Open(const FileName: IPath): IVideo;
begin
  Result := TVideo_Dummy.Create;
end;


initialization
  MediaManager.Add(TAudio_Dummy.Create);
  MediaManager.Add(TVideoPlayback_Dummy.Create);

end.
