From 8913873e901f64846217bfa30c9bc04e1a0ac420 Mon Sep 17 00:00:00 2001 From: tobigun Date: Tue, 19 Oct 2010 20:52:24 +0000 Subject: audio code replaced by (yet pseudo-)plugin git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/experimental@2687 b956fd51-792f-4845-bead-9b4dfca2ff2c --- mediaplugin/src/media/UMediaPlugin.pas | 132 +++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 mediaplugin/src/media/UMediaPlugin.pas (limited to 'mediaplugin/src/media/UMediaPlugin.pas') diff --git a/mediaplugin/src/media/UMediaPlugin.pas b/mediaplugin/src/media/UMediaPlugin.pas new file mode 100644 index 00000000..097a28f2 --- /dev/null +++ b/mediaplugin/src/media/UMediaPlugin.pas @@ -0,0 +1,132 @@ +{* 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 UMediaPlugin; + +interface + +{$IFDEF FPC} + {$MODE DELPHI } + {$PACKENUM 4} (* use 4-byte enums *) + {$PACKRECORDS C} (* C/C++-compatible record packing *) +{$ELSE} + {$MINENUMSIZE 4} (* use 4-byte enums *) +{$ENDIF} + +uses + ctypes; + +type + PMediaPluginCore = ^TMediaPluginCore; + TMediaPluginCore = record + log: procedure(level: cint; msg: PChar; context: PChar); cdecl; + end; + + PDecodeStream = Pointer; + + PCAudioFormatInfo = ^TCAudioFormatInfo; + TCAudioFormatInfo = record + sampleRate: double; + channels: cuint8; + format: cint; + end; + +const +{$IFDEF MSWINDOWS} + ffmpegPlugin = 'ffmpeg_playback.dll'; +{$ENDIF} +{$IFDEF LINUX} + ffmpegPlugin = 'ffmpeg_playback'; +{$ENDIF} +{$IFDEF DARWIN} + ffmpegPlugin = 'ffmpeg_playback.dylib'; + {$linklib ffmpegPlugin} +{$ENDIF} + +function Plugin_initialize(core: PMediaPluginCore): cbool; + cdecl; external ffmpegPlugin; + +function DecodeStream_open(filename: PAnsiChar): PDecodeStream; + cdecl; external ffmpegPlugin; +procedure DecodeStream_close(stream: PDecodeStream); + cdecl; external ffmpegPlugin; +function DecodeStream_getLength(stream: PDecodeStream): double; + cdecl; external ffmpegPlugin; +procedure DecodeStream_getAudioFormatInfo(stream: PDecodeStream; var info: TCAudioFormatInfo); + cdecl; external ffmpegPlugin; +function DecodeStream_getPosition(stream: PDecodeStream): double; + cdecl; external ffmpegPlugin; +procedure DecodeStream_setPosition(stream: PDecodeStream; time: double); + cdecl; external ffmpegPlugin; +function DecodeStream_getLoop(stream: PDecodeStream): cbool; + cdecl; external ffmpegPlugin; +procedure DecodeStream_setLoop(stream: PDecodeStream; enabled: cbool); + cdecl; external ffmpegPlugin; +function DecodeStream_isEOF(stream: PDecodeStream): cbool; + cdecl; external ffmpegPlugin; +function DecodeStream_isError(stream: PDecodeStream): cbool; + cdecl; external ffmpegPlugin; +function DecodeStream_readData(stream: PDecodeStream; buffer: PCUint8; bufferSize: cint): cint; + cdecl; external ffmpegPlugin; + +function MediaPluginCore: PMediaPluginCore; + +implementation + +uses + ULog; + +var + MediaPluginCore_Instance: TMediaPluginCore; + +const + DebugLogLevels: array[0 .. 5] of integer = ( + LOG_LEVEL_DEBUG, + LOG_LEVEL_INFO, + LOG_LEVEL_STATUS, + LOG_LEVEL_WARN, + LOG_LEVEL_ERROR, + LOG_LEVEL_CRITICAL + ); + +procedure LogFunc(level: cint; msg: PChar; context: PChar); cdecl; +begin + Log.LogMsg(msg, context, DebugLogLevels[level]); +end; + +function MediaPluginCore: PMediaPluginCore; +begin + Result := @MediaPluginCore_Instance; +end; + +procedure InitializeMediaPluginCore; +begin + MediaPluginCore.log := LogFunc; +end; + +initialization + InitializeMediaPluginCore; + +end. -- cgit v1.2.3