aboutsummaryrefslogblamecommitdiffstats
path: root/mediaplugin/src/media/UMediaPlugin.pas
blob: 097a28f27b82a432787a318aa7aa50eebb23fcac (plain) (tree)



































































































































                                                                                               
{* 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.