{* 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 UAudioConverterPlugin; interface {$IFDEF FPC} {$MODE Delphi} {$ENDIF} {$I switches.inc} uses UMusic, ULog, ctypes, UMediaPlugin, SysUtils; type TAudioConverterPlugin = class(TInterfacedObject, IMediaInterface, IAudioConverter) private fPluginInfo: PMediaPluginInfo; public constructor Create(Info: PMediaPluginInfo); function GetName(): string; function GetPriority(): integer; function Init(): boolean; function Finalize(): boolean; function Open(SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo): TAudioConvertStream; end; TPluginAudioConvertStream = class(TAudioConvertStream) private fAudioConverter: PAudioConverterInfo; fStream: PAudioConvertStream; function Init(): boolean; public // Do not call this directly, use Open() instead constructor Create(Info: PAudioConverterInfo; SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo); destructor Destroy(); override; class function Open(Info: PAudioConverterInfo; SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo): TPluginAudioConvertStream; function Convert(InputBuffer: PByteArray; OutputBuffer: PByteArray; var InputSize: integer): integer; override; function GetOutputBufferSize(InputSize: integer): integer; override; function GetRatio(): double; override; end; implementation { TAudioConverterPlugin } constructor TAudioConverterPlugin.Create(Info: PMediaPluginInfo); begin inherited Create(); fPluginInfo := Info; end; function TAudioConverterPlugin.GetName(): string; begin Result := 'Plugin:AudioConverter:' + fPluginInfo.name; end; function TAudioConverterPlugin.GetPriority(): integer; begin Result := fPluginInfo.audioConverter.priority; end; function TAudioConverterPlugin.Init(): boolean; begin fPluginInfo.audioConverter.init(); Result := true; end; function TAudioConverterPlugin.Finalize(): boolean; begin fPluginInfo.audioConverter.finalize(); Result := true; end; function TAudioConverterPlugin.Open(SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo): TAudioConvertStream; begin Result := TPluginAudioConvertStream.Open( fPluginInfo.audioConverter, SrcFormatInfo, DstFormatInfo); end; { TAudioConverterPlugin } constructor TPluginAudioConvertStream.Create( Info: PAudioConverterInfo; SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo); begin inherited Create(SrcFormatInfo, DstFormatInfo); fAudioConverter := Info; end; destructor TPluginAudioConvertStream.Destroy(); begin if (fStream <> nil) then fAudioConverter.close(fStream); inherited; end; class function TPluginAudioConvertStream.Open( Info: PAudioConverterInfo; SrcFormatInfo: TAudioFormatInfo; DstFormatInfo: TAudioFormatInfo): TPluginAudioConvertStream; var Stream: TPluginAudioConvertStream; begin Result := nil; Stream := TPluginAudioConvertStream.Create(Info, SrcFormatInfo, DstFormatInfo); if (not Stream.Init()) then begin Stream.Free; Exit; end; Result := Stream; end; function TPluginAudioConvertStream.Init(): boolean; var CSrcFormatInfo: TCAudioFormatInfo; CDstFormatInfo: TCAudioFormatInfo; begin Result := false; AudioFormatInfoToCStruct(SrcFormatInfo, CSrcFormatInfo); AudioFormatInfoToCStruct(DstFormatInfo, CDstFormatInfo); fStream := fAudioConverter.open(@CSrcFormatInfo, @CDstFormatInfo); if (fStream = nil) then begin Log.LogError('fAudioConverter.open() failed', 'TAudioConverterPlugin.Init'); Exit; end; Result := true; end; function TPluginAudioConvertStream.Convert(InputBuffer: PByteArray; OutputBuffer: PByteArray; var InputSize: integer): integer; begin Result := fAudioConverter.convert(fStream, PCuint8(InputBuffer), PCuint8(OutputBuffer), @InputSize); end; function TPluginAudioConvertStream.GetOutputBufferSize(InputSize: integer): integer; begin Result := fAudioConverter.getOutputBufferSize(fStream, InputSize); end; function TPluginAudioConvertStream.GetRatio(): double; begin Result := fAudioConverter.getRatio(fStream); end; end.