blob: 0251b8e83816342fd0f767aba0338033e3cc455b (
plain) (
tree)
|
|
unit UAudioPlaybackBase;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
uses
UMusic;
type
TAudioPlaybackBase = class(TInterfacedObject, IAudioPlayback)
protected
OutputDeviceList: TAudioOutputDeviceList;
MusicStream: TAudioPlaybackStream;
// open sound or music stream (used by Open() and OpenSound())
function OpenStream(const Filename: string): TAudioPlaybackStream; virtual; abstract;
procedure ClearOutputDeviceList();
public
function GetName: String; virtual; abstract;
function Open(const Filename: string): boolean; // true if succeed
procedure Close;
procedure Play;
procedure Pause;
procedure Stop;
procedure FadeIn(Time: real; TargetVolume: single);
procedure SetPosition(Time: real);
function GetPosition: real;
function InitializePlayback: boolean; virtual; abstract;
function FinalizePlayback: boolean; virtual;
// function SetOutputDevice(Device: TAudioOutputDevice): boolean;
function GetOutputDeviceList(): TAudioOutputDeviceList;
procedure SetAppVolume(Volume: single); virtual; abstract;
procedure SetVolume(Volume: single);
procedure SetLoop(Enabled: boolean);
procedure Rewind;
function Finished: boolean;
function Length: real;
// Sounds
function OpenSound(const Filename: String): TAudioPlaybackStream;
procedure PlaySound(stream: TAudioPlaybackStream);
procedure StopSound(stream: TAudioPlaybackStream);
// Equalizer
procedure GetFFTData(var data: TFFTData);
// Interface for Visualizer
function GetPCMData(var data: TPCMData): Cardinal;
end;
implementation
uses
SysUtils;
{ TAudioPlaybackBase }
function TAudioPlaybackBase.FinalizePlayback: boolean;
begin
FreeAndNil(MusicStream);
ClearOutputDeviceList();
end;
function TAudioPlaybackBase.Open(const Filename: string): boolean;
begin
// free old MusicStream
MusicStream.Free;
MusicStream := OpenStream(Filename);
if not assigned(MusicStream) then
begin
Result := false;
Exit;
end;
//MusicStream.AddSoundEffect(TVoiceRemoval.Create());
Result := true;
end;
procedure TAudioPlaybackBase.Close;
begin
if assigned(MusicStream) then
MusicStream.Close();
end;
procedure TAudioPlaybackBase.Play;
begin
if assigned(MusicStream) then
MusicStream.Play();
end;
procedure TAudioPlaybackBase.Pause;
begin
if assigned(MusicStream) then
MusicStream.Pause();
end;
procedure TAudioPlaybackBase.Stop;
begin
if assigned(MusicStream) then
MusicStream.Stop();
end;
function TAudioPlaybackBase.Length: real;
begin
if assigned(MusicStream) then
Result := MusicStream.Length
else
Result := 0;
end;
function TAudioPlaybackBase.GetPosition: real;
begin
if assigned(MusicStream) then
Result := MusicStream.Position
else
Result := 0;
end;
procedure TAudioPlaybackBase.SetPosition(Time: real);
begin
if assigned(MusicStream) then
MusicStream.Position := Time;
end;
procedure TAudioPlaybackBase.Rewind;
begin
SetPosition(0);
end;
function TAudioPlaybackBase.Finished: boolean;
begin
if assigned(MusicStream) then
Result := (MusicStream.Status = ssStopped)
else
Result := true;
end;
procedure TAudioPlaybackBase.SetVolume(Volume: single);
begin
if assigned(MusicStream) then
MusicStream.Volume := Volume;
end;
procedure TAudioPlaybackBase.FadeIn(Time: real; TargetVolume: single);
begin
if assigned(MusicStream) then
MusicStream.FadeIn(Time, TargetVolume);
end;
procedure TAudioPlaybackBase.SetLoop(Enabled: boolean);
begin
if assigned(MusicStream) then
MusicStream.Loop := Enabled;
end;
// Equalizer
procedure TAudioPlaybackBase.GetFFTData(var data: TFFTData);
begin
if assigned(MusicStream) then
MusicStream.GetFFTData(data);
end;
{*
* Copies interleaved PCM SInt16 stereo samples into data.
* Returns the number of frames
*}
function TAudioPlaybackBase.GetPCMData(var data: TPCMData): Cardinal;
begin
if assigned(MusicStream) then
Result := MusicStream.GetPCMData(data)
else
Result := 0;
end;
function TAudioPlaybackBase.OpenSound(const Filename: string): TAudioPlaybackStream;
begin
Result := OpenStream(Filename);
end;
procedure TAudioPlaybackBase.PlaySound(stream: TAudioPlaybackStream);
begin
if assigned(stream) then
stream.Play();
end;
procedure TAudioPlaybackBase.StopSound(stream: TAudioPlaybackStream);
begin
if assigned(stream) then
stream.Stop();
end;
procedure TAudioPlaybackBase.ClearOutputDeviceList();
var
DeviceIndex: integer;
begin
for DeviceIndex := 0 to High(OutputDeviceList) do
OutputDeviceList[DeviceIndex].Free();
SetLength(OutputDeviceList, 0);
end;
function TAudioPlaybackBase.GetOutputDeviceList(): TAudioOutputDeviceList;
begin
Result := OutputDeviceList;
end;
end.
|