
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@734 8e941d3f-bd1b-0410-a28a-d453659cc2b4
254 lines
5.9 KiB
ObjectPascal
254 lines
5.9 KiB
ObjectPascal
(*
|
|
this file is a part of audio components suite v 2.3.
|
|
copyright (c) 2002-2005 andrei borovsky. all rights reserved.
|
|
see the license file for more details.
|
|
you can contact me at mail@z0m3ie.de
|
|
*)
|
|
|
|
{
|
|
$Log: smpeg.pas,v $
|
|
Revision 1.5 2006/09/04 14:40:16 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.4 2006/08/30 18:59:51 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.3 2005/12/19 18:37:03 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.1 2005/09/12 22:04:53 z0m3ie
|
|
modified structure again, fileformats are now in an sperat folder.
|
|
all File In/Out classes are capsulated from TFileIn and TFileOut
|
|
|
|
Revision 1.1 2005/08/25 20:18:00 z0m3ie
|
|
Version 2.4 restructure
|
|
TCDPlayer removed (fits not in component structure)
|
|
TMP3ToWavConverter removed (fits not in component structure)
|
|
|
|
Revision 1.4 2005/08/22 20:17:01 z0m3ie
|
|
changed Headers to log
|
|
changed mail adress
|
|
|
|
}
|
|
|
|
|
|
{$weakpackageunit on}
|
|
|
|
// Linux and Windows C-Compilers use different byte-allignment
|
|
{$IFDEF Linux}
|
|
{$align 4} // linux uses dword alignment
|
|
{$endif}
|
|
{$ifdef win32}
|
|
{$ifdef ver140}
|
|
{$align 8} // windows uses quad-word alignment
|
|
{$endif}
|
|
{$endif}
|
|
|
|
{$IFDEF FPC}
|
|
{$PACKRECORDS 4}
|
|
{$ENDIF FPC}
|
|
|
|
unit smpeg;
|
|
|
|
{$ifdef fpc}
|
|
{$mode delphi}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils,ACS_Procs,Dialogs
|
|
{$ifdef LINUX}
|
|
, Libc
|
|
{$else}
|
|
, Windows
|
|
{$endif}
|
|
;
|
|
|
|
const
|
|
|
|
SMPEG_ERROR = -1;
|
|
SMPEG_STOPPED = 0;
|
|
SMPEG_PLAYING = 1;
|
|
|
|
type
|
|
|
|
_SMPEG = record
|
|
//obj: PMPEG;
|
|
end;
|
|
TSMPEG = _SMPEG;
|
|
PSMPEG = ^_SMPEG;
|
|
|
|
SDL_AudioSpec = record
|
|
freq: Integer;
|
|
format: Word;
|
|
channels: Byte;
|
|
silence: Byte;
|
|
samples: Word;
|
|
padding: Word;
|
|
size: LongWord;
|
|
callback: Pointer;
|
|
userdata: Pointer;
|
|
end;
|
|
|
|
SMPEG_Info ={ packed} record
|
|
has_audio : Integer;
|
|
has_video : Integer;
|
|
width : Integer;
|
|
height: Integer;
|
|
current_frame: Integer;
|
|
current_fps: Double;
|
|
audio_string : array[0..79] of Char;
|
|
audio_current_frame : Integer;
|
|
current_offset: LongWord;
|
|
total_size: LongWord;
|
|
current_time: Double;
|
|
total_time: Double;
|
|
end;
|
|
|
|
const
|
|
|
|
{$ifdef LINUX}
|
|
LibsmpegPath = 'libsmpeg*.so*';
|
|
LibSDLPath = 'libSDL*.so*';
|
|
{$ELSE}
|
|
LibsmpegPath = 'smpeg.dll';
|
|
LibSDLPath = 'SDL.dll';
|
|
{$ENDIF}
|
|
|
|
var
|
|
LibsmpegLoaded : Boolean = False;
|
|
|
|
type
|
|
|
|
SMPEG_new_t = function(const filename : PChar; var info : SMPEG_Info; sdl_audio : Integer): PSMPEG; cdecl;
|
|
|
|
SMPEG_delete_t = procedure(mpeg: Pointer); cdecl;
|
|
|
|
SMPEG_wantedSpec_t = function(mpeg: Pointer; var spec: SDL_AudioSpec): Integer; cdecl;
|
|
|
|
SMPEG_play_t = procedure(mpeg: Pointer); cdecl;
|
|
|
|
SMPEG_status_t = function(mpeg: Pointer) : Integer; cdecl;
|
|
|
|
SMPEG_stop_t = procedure(mpeg: Pointer); cdecl;
|
|
|
|
SMPEG_playAudio_t = function(mpeg: Pointer; stream: Pointer; len: Integer): Integer; cdecl;
|
|
|
|
SMPEG_skip_t = procedure(mpeg : Pointer; Pos : Single); cdecl;
|
|
|
|
SMPEG_rewind_t = procedure(mpeg : Pointer); cdecl;
|
|
|
|
var
|
|
|
|
SMPEG_new : SMPEG_new_t;
|
|
|
|
SMPEG_delete : SMPEG_delete_t;
|
|
|
|
SMPEG_wantedSpec : SMPEG_wantedSpec_t;
|
|
|
|
SMPEG_play : SMPEG_play_t;
|
|
|
|
SMPEG_status : SMPEG_status_t;
|
|
|
|
SMPEG_stop : SMPEG_stop_t;
|
|
|
|
SMPEG_playAudio : SMPEG_playAudio_t;
|
|
|
|
SMPEG_skip : SMPEG_skip_t;
|
|
|
|
SMPEG_rewind : SMPEG_rewind_t;
|
|
|
|
procedure LoadMPEGLibrary;
|
|
procedure UnloadMPEGLibrary;
|
|
|
|
|
|
implementation
|
|
|
|
type
|
|
SDL_Init_t = function(Flags : LongWord) : Integer; cdecl;
|
|
SDL_Quit_t = procedure; cdecl;
|
|
|
|
const
|
|
SDL_INIT_AUDIO = $00000010;
|
|
|
|
var
|
|
{$ifdef LINUX}
|
|
Libhandle : Pointer;
|
|
SDLhandle : Pointer;
|
|
{$else}
|
|
Libhandle : Cardinal;
|
|
SDLhandle : Cardinal;
|
|
{$endif}
|
|
SDL_Init : SDL_Init_t;
|
|
SDL_Quit : SDL_Quit_t;
|
|
|
|
procedure LoadMPEGLibrary;
|
|
var
|
|
Path : string;
|
|
begin
|
|
{$ifdef LINUX}
|
|
Path := FindLibs(LibSDLPath);
|
|
if Path <> '' then SDLhandle := dlopen(@Path[1], RTLD_NOW or RTLD_GLOBAL);
|
|
// SDLhandle := dlopen(LibSDLPath, RTLD_NOW{$IFDEF LINUX} or RTLD_GLOBAL{$ENDIF});
|
|
if SDLhandle = nil then exit;
|
|
SDL_Init := dlsym(SDLhandle, 'SDL_Init');
|
|
SDL_Quit := dlsym(SDLhandle, 'SDL_Quit');
|
|
SDL_Init(SDL_INIT_AUDIO);
|
|
|
|
Path := FindLibs(LibsmpegPath);
|
|
if Path <> '' then Libhandle := dlopen(@Path[1], RTLD_NOW or RTLD_GLOBAL);
|
|
// Libhandle := dlopen(LibsmpegPath, RTLD_NOW{$IFDEF LINUX} or RTLD_GLOBAL{$ENDIF});
|
|
if Libhandle = nil then exit;
|
|
if Libhandle <> nil then
|
|
begin
|
|
LibsmpegLoaded := True;
|
|
SMPEG_new := dlsym(Libhandle, 'SMPEG_new');
|
|
SMPEG_delete := dlsym(Libhandle, 'SMPEG_delete');
|
|
SMPEG_wantedSpec := dlsym(Libhandle, 'SMPEG_wantedSpec');
|
|
SMPEG_play := dlsym(Libhandle, 'SMPEG_play');
|
|
SMPEG_status := dlsym(Libhandle, 'SMPEG_status');
|
|
SMPEG_stop := dlsym(Libhandle, 'SMPEG_stop');
|
|
SMPEG_playAudio := dlsym(Libhandle, 'SMPEG_playAudio');
|
|
SMPEG_skip := dlsym(Libhandle, 'SMPEG_skip');
|
|
SMPEG_rewind := dlsym(Libhandle, 'SMPEG_rewind');
|
|
end;
|
|
{$ELSE}
|
|
SDLhandle := LoadLibrary(LibSDLPath);
|
|
if SDLhandle = 0 then exit;
|
|
SDL_Init := GetProcAddress(SDLhandle, 'SDL_Init');
|
|
SDL_Quit := GetProcAddress(SDLhandle, 'SDL_Quit');
|
|
SDL_Init(SDL_INIT_AUDIO);
|
|
Libhandle := LoadLibrary(LibsmpegPath);
|
|
if Libhandle = 0 then exit;
|
|
if Libhandle <> 0 then
|
|
begin
|
|
LibsmpegLoaded := True;
|
|
SMPEG_new := GetProcAddress(Libhandle, 'SMPEG_new');
|
|
SMPEG_delete := GetProcAddress(Libhandle, 'SMPEG_delete');
|
|
SMPEG_wantedSpec := GetProcAddress(Libhandle, 'SMPEG_wantedSpec');
|
|
SMPEG_play := GetProcAddress(Libhandle, 'SMPEG_play');
|
|
SMPEG_status := GetProcAddress(Libhandle, 'SMPEG_status');
|
|
SMPEG_stop := GetProcAddress(Libhandle, 'SMPEG_stop');
|
|
SMPEG_playAudio := GetProcAddress(Libhandle, 'SMPEG_playAudio');
|
|
SMPEG_skip := GetProcAddress(Libhandle, 'SMPEG_skip');
|
|
SMPEG_rewind := GetProcAddress(Libhandle, 'SMPEG_rewind');
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure UnloadMPEGLibrary;
|
|
|
|
begin
|
|
SDL_Quit;
|
|
{$ifdef LINUX}
|
|
if Libhandle <> nil then dlclose(Libhandle);
|
|
if SDLhandle <> nil then dlclose(SDLhandle);
|
|
{$else}
|
|
if Libhandle <> 0 then FreeLibrary(Libhandle);
|
|
if SDLhandle <> 0 then FreeLibrary(SDLhandle);
|
|
{$endif}
|
|
end;
|
|
|
|
end.
|