aboutsummaryrefslogtreecommitdiffstats
path: root/mediaplugin/src/media/UAudioDecoderPlugin.pas
diff options
context:
space:
mode:
Diffstat (limited to 'mediaplugin/src/media/UAudioDecoderPlugin.pas')
-rw-r--r--mediaplugin/src/media/UAudioDecoderPlugin.pas242
1 files changed, 242 insertions, 0 deletions
diff --git a/mediaplugin/src/media/UAudioDecoderPlugin.pas b/mediaplugin/src/media/UAudioDecoderPlugin.pas
new file mode 100644
index 00000000..8298cf17
--- /dev/null
+++ b/mediaplugin/src/media/UAudioDecoderPlugin.pas
@@ -0,0 +1,242 @@
+{* 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$
+ * $Id$
+ *}
+
+unit UAudioDecoderPlugin;
+
+(*******************************************************************************
+ *
+ * This unit is primarily based upon -
+ * http://www.dranger.com/ffmpeg/ffmpegtutorial_all.html
+ *
+ * and tutorial03.c
+ *
+ * http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html
+ *
+ *******************************************************************************)
+
+interface
+
+{$IFDEF FPC}
+ {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+ UMediaPlugin,
+ UMusic,
+ UPath;
+
+type
+ TAudioDecoderPlugin = class(TInterfacedObject, IAudioDecoder)
+ private
+ fPluginInfo: PMediaPluginInfo;
+ public
+ constructor Create(Info: PMediaPluginInfo);
+
+ function GetName: string;
+
+ function InitializeDecoder(): boolean;
+ function FinalizeDecoder(): boolean;
+ function Open(const Filename: IPath): TAudioDecodeStream;
+ end;
+
+implementation
+
+uses
+ ctypes,
+ Classes,
+ SysUtils,
+ UIni,
+ UMain,
+ ULog;
+
+type
+ TPluginAudioDecodeStream = class(TAudioDecodeStream)
+ private
+ fAudioDecoderInfo: PAudioDecoderInfo;
+ fFilename: IPath;
+ fStream: PAudioDecodeStream;
+ fFormatInfo: TAudioFormatInfo;
+
+ public
+ constructor Create(Info: PAudioDecoderInfo);
+ destructor Destroy(); override;
+
+ function Open(const Filename: IPath): boolean;
+ procedure Close(); override;
+
+ function GetLength(): real; override;
+ function GetAudioFormatInfo(): TAudioFormatInfo; override;
+ function GetPosition: real; override;
+ procedure SetPosition(Time: real); override;
+ function GetLoop(): boolean; override;
+ procedure SetLoop(Enabled: boolean); override;
+ function IsEOF(): boolean; override;
+ function IsError(): boolean; override;
+
+ function ReadData(Buffer: PByteArray; BufferSize: integer): integer; override;
+ end;
+
+{ TPluginAudioDecodeStream }
+
+constructor TPluginAudioDecodeStream.Create(Info: PAudioDecoderInfo);
+begin
+ inherited Create();
+ fAudioDecoderInfo := Info;
+ fFilename := PATH_NONE;
+end;
+
+{*
+ * Frees the decode-stream data.
+ *}
+destructor TPluginAudioDecodeStream.Destroy();
+begin
+ Close();
+ inherited;
+end;
+
+function TPluginAudioDecodeStream.Open(const Filename: IPath): boolean;
+var
+ Info: TCAudioFormatInfo;
+begin
+ Result := false;
+
+ Close();
+
+ fStream := fAudioDecoderInfo.open(PChar(Filename.ToUTF8()));
+ if (fStream = nil) then
+ Exit;
+
+ fFilename := Filename;
+
+ fAudioDecoderInfo.getAudioFormatInfo(fStream, Info);
+ fFormatInfo := TAudioFormatInfo.Create(
+ Info.channels,
+ Info.sampleRate,
+ TAudioSampleFormat(Info.format)
+ );
+
+ Result := true;
+end;
+
+procedure TPluginAudioDecodeStream.Close();
+begin
+ Self.fFilename := PATH_NONE;
+ if (fStream <> nil) then
+ begin
+ fAudioDecoderInfo.close(fStream);
+ fStream := nil;
+ end;
+end;
+
+function TPluginAudioDecodeStream.GetLength(): real;
+begin
+ Result := fAudioDecoderInfo.getLength(fStream);
+end;
+
+function TPluginAudioDecodeStream.GetAudioFormatInfo(): TAudioFormatInfo;
+begin
+ Result := fFormatInfo;
+end;
+
+function TPluginAudioDecodeStream.IsEOF(): boolean;
+begin
+ Result := fAudioDecoderInfo.isEOF(fStream);
+end;
+
+function TPluginAudioDecodeStream.IsError(): boolean;
+begin
+ Result := fAudioDecoderInfo.isError(fStream);
+end;
+
+function TPluginAudioDecodeStream.GetPosition(): real;
+begin
+ Result := fAudioDecoderInfo.getPosition(fStream);
+end;
+
+procedure TPluginAudioDecodeStream.SetPosition(Time: real);
+begin
+ fAudioDecoderInfo.setPosition(fStream, Time);
+end;
+
+function TPluginAudioDecodeStream.GetLoop(): boolean;
+begin
+ Result := fAudioDecoderInfo.getLoop(fStream);
+end;
+
+procedure TPluginAudioDecodeStream.SetLoop(Enabled: boolean);
+begin
+ fAudioDecoderInfo.setLoop(fStream, Enabled);
+end;
+
+function TPluginAudioDecodeStream.ReadData(Buffer: PByteArray; BufferSize: integer): integer;
+begin
+ Result := fAudioDecoderInfo.readData(fStream, PCUint8(Buffer), BufferSize);
+end;
+
+
+{ TAudioDecoderPlugin }
+
+constructor TAudioDecoderPlugin.Create(Info: PMediaPluginInfo);
+begin
+ inherited Create();
+ fPluginInfo := Info;
+end;
+
+function TAudioDecoderPlugin.GetName: String;
+begin
+ Result := 'Plugin:AudioDecoder:' + fPluginInfo.name;
+end;
+
+function TAudioDecoderPlugin.InitializeDecoder: boolean;
+begin
+ //fPluginInfo.initialize();
+ Result := true;
+end;
+
+function TAudioDecoderPlugin.FinalizeDecoder(): boolean;
+begin
+ //fPluginInfo.finalize();
+ Result := true;
+end;
+
+function TAudioDecoderPlugin.Open(const Filename: IPath): TAudioDecodeStream;
+var
+ Stream: TPluginAudioDecodeStream;
+begin
+ Result := nil;
+
+ Stream := TPluginAudioDecodeStream.Create(fPluginInfo.audioDecoder);
+ if (not Stream.Open(Filename)) then
+ begin
+ Stream.Free;
+ Exit;
+ end;
+
+ Result := Stream;
+end;
+
+end.