317 lines
11 KiB
ObjectPascal

(*
delphi/kylix headers for oggvorbis software codec.
translated from vorbisfile.h header
by andrei borovsky, acs@compiler4.net
the original c/c++ headers and libraries (c) copyright 1994-2001
by the xiphophorus company http://www.xiph.org/
*)
{
$Log: vorbisfile.pas,v $
Revision 1.2 2005/12/29 20:46:00 z0m3ie
fixed some problems with vorbis in lazarus
Revision 1.1 2005/12/19 18:36:56 z0m3ie
*** empty log message ***
Revision 1.2 2005/10/09 19:01: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.2 2005/09/10 08:25:40 z0m3ie
*** empty log message ***
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.2 2005/08/22 20:17:01 z0m3ie
changed Headers to log
changed mail adress
}
{$IFDEF FPC}
{$IFDEF WIN32}
{$PACKRECORDS C}
{$ENDIF WIN32}
{$ENDIF WIN32}
unit vorbisfile;
{$ifdef fpc}
{$mode delphi}
{$endif}
interface
uses
ACS_Procs,
{$IFDEF LINUX}
baseunix,dl,
{$ENDIF}
{$IFDEF WIN32}
Windows,
{$ENDIF}
ogg,
vorbiscodec,
dynlibs;
(* The function prototypes for the callbacks are basically the same as for
the stdio functions fread, fseek, fclose, ftell.
The one difference is that the FILE* arguments have been replaced with
a void* - this is to be used as a pointer to whatever internal data these
functions might need. In the stdio case, it's just a FILE* cast to a void*
If you use other functions, check the docs for these functions and return
the right values. For seek_func(), you*MUST* return -1 if the stream is
unseekable *)
type
read_func_t = function(ptr : Pointer; size, nmemb : Cardinal;const datasource : Pointer) : Cardinal; cdecl;
seek_func_t = function(const datasource : Pointer; offset : ogg_int64_t; whence : Integer) : Integer; cdecl;
close_func_t = function(const datasource : Pointer) : Integer; cdecl;
tell_func_t = function(const datasource : Pointer) : Integer; cdecl;
OV_CALLBACKS = record
read_func : read_func_t;
seek_func : seek_func_t;
close_func : close_func_t;
tell_func : tell_func_t;
end;
const
NOTOPEN = 0;
PARTOPEN = 1;
OPENED = 2;
STREAMSET = 3;
INITSET = 4;
type
OGGVORBIS_FILE = record
datasource: Pointer; // Pointer to a FILE*, etc.
seekable: Integer;
offset: OGG_INT64_T;
_end: OGG_INT64_T;
oy: OGG_SYNC_STATE;
(* If the FILE handle isn't seekable (eg, a pipe),
only the current stream appears *)
links: Integer;
offsets: POGG_INT64_T;
dataoffsets: POGG_INT64_T;
serialnos: PLongInt;
pcmlengths: POGG_INT64_T;
vi: PVORBIS_INFO;
vc: PVORBIS_COMMENT;
// Decoding working state local storage
pcm_offset: OGG_INT64_T;
ready_state: Integer;
current_serialno: LongInt;
current_link: Integer;
bittrack: Double;
samptrack: Double;
os: OGG_STREAM_STATE;
(* take physical pages, weld into a logical
stream of packets *)
vd: VORBIS_DSP_STATE;
// central working state for the packet->PCM decoder
vb: VORBIS_BLOCK;
// local working space for packet->PCM decode
callbacks: OV_CALLBACKS;
end;
const
{$IFDEF LINUX}
LibvorbisfilePath = 'libvorbisfile.so*'; //'/usr/lib/libvorbisfile.so';
{$DEFINE SEARCH_LIBS}
{$ENDIF}
{$IFDEF WINDOWS}
LibvorbisfilePath = 'vorbisfile.dll';
{$ENDIF}
// stdio.h constants
SEEK_CUR = 1;
SEEK_END = 2;
SEEK_SET = 0;
var
LibvorbisfileLoaded : Boolean = False;
type
{$IFDEF LINUX}
ov_open_t = function(f: Pointer;var vf: OGGVORBIS_FILE;initial: PChar;ibytes: LongInt): Integer; cdecl;
ov_test_t = function(f: Pointer;var vf: OGGVORBIS_FILE;initial: PChar;ibytes: LongInt): Integer; cdecl;
{$ENDIF}
ov_clear_t = function(var vf: OGGVORBIS_FILE): Integer; cdecl;
ov_open_callbacks_t = function(datasource: Pointer;var vf: OGGVORBIS_FILE;initial: PChar;ibytes: LongInt; callbacks: OV_CALLBACKS): Integer; cdecl;
ov_test_callbacks_t = function(datasource: Pointer;var vf: OGGVORBIS_FILE;initial: PChar;ibytes: LongInt; callbacks: OV_CALLBACKS): Integer; cdecl;
ov_test_open_t = function(var vf: OGGVORBIS_FILE): Integer; cdecl;
ov_bitrate_t = function(var vf: OGGVORBIS_FILE;i: Integer): LongInt cdecl;
ov_bitrate_instant_t = function(var vf: OGGVORBIS_FILE): LongInt cdecl;
ov_streams_t = function(var vf: OGGVORBIS_FILE): LongInt cdecl;
ov_seekable_t = function(var vf: OGGVORBIS_FILE): LongInt cdecl;
ov_serialnumber_t = function(var vf: OGGVORBIS_FILE;i: Integer): LongInt cdecl;
ov_raw_total_t = function(var vf: OGGVORBIS_FILE;i: Integer): OGG_INT64_T cdecl;
ov_pcm_total_t = function(var vf: OGGVORBIS_FILE;i: Integer): OGG_INT64_T cdecl;
ov_time_total_t = function(var vf: OGGVORBIS_FILE;i: Integer): Double cdecl;
ov_raw_seek_t = function(var vf: OGGVORBIS_FILE;pos: LongInt): Integer cdecl;
ov_pcm_seek_t = function(var vf: OGGVORBIS_FILE;pos: OGG_INT64_T): Integer cdecl;
ov_pcm_seek_page_t = function(var vf: OGGVORBIS_FILE;pos: OGG_INT64_T): Integer cdecl;
ov_time_seek_t = function(var vf: OGGVORBIS_FILE;pos: Double): Integer cdecl;
ov_time_seek_page_t = function(var vf: OGGVORBIS_FILE;pos: Double): Integer cdecl;
ov_raw_tell_t = function(var vf: OGGVORBIS_FILE): OGG_INT64_T cdecl;
ov_pcm_tell_t = function(var vf: OGGVORBIS_FILE): OGG_INT64_T cdecl;
ov_time_tell_t = function(var vf: OGGVORBIS_FILE): Double cdecl;
ov_info_t = function(var vf: OGGVORBIS_FILE;link : Integer): PVORBIS_INFO cdecl;
ov_comment_t = function(var vf: OGGVORBIS_FILE;link : Integer): PVORBIS_COMMENT cdecl;
ov_read_float_t = function(var vf: OGGVORBIS_FILE;var pcm_channels: PPFLOAT;bitstream: PInteger): LongInt cdecl;
ov_read_t = function(var vf: OGGVORBIS_FILE;buffer: PChar;length: Integer;bigendianp: Integer;word: Integer;sgned: Integer;bitstream: PInteger): LongInt cdecl;
var
{$IFDEF LINUX}
ov_open : ov_open_t;
ov_test : ov_test_t;
{$ENDIF}
ov_clear : ov_clear_t;
ov_open_callbacks : ov_open_callbacks_t;
ov_test_callbacks : ov_test_callbacks_t;
ov_test_open : ov_test_open_t;
ov_bitrate : ov_bitrate_t;
ov_bitrate_instant : ov_bitrate_instant_t;
ov_streams : ov_streams_t;
ov_seekable : ov_seekable_t;
ov_serialnumber : ov_serialnumber_t;
ov_raw_total : ov_raw_total_t;
ov_pcm_total : ov_pcm_total_t;
ov_time_total : ov_time_total_t;
ov_raw_seek : ov_raw_seek_t;
ov_pcm_seek : ov_pcm_seek_t;
ov_pcm_seek_page : ov_pcm_seek_page_t;
ov_time_seek : ov_time_seek_t;
ov_time_seek_page : ov_time_seek_page_t;
ov_raw_tell : ov_raw_tell_t;
ov_pcm_tell : ov_pcm_tell_t;
ov_time_tell : ov_time_tell_t;
ov_info : ov_info_t;
ov_comment : ov_comment_t;
ov_read_float : ov_read_float_t;
ov_read : ov_read_t;
{$IFDEF WINDOWS}
Libhandle : HMODULE;
{$ELSE}
Libhandle : Pointer;
{$ENDIF}
procedure VORBISLoadLibrary;
implementation
{$IFDEF SEARCH_LIBS}
var
Path : String;
{$ENDIF}
procedure VORBISLoadLibrary;
begin
if LibvorbisfileLoaded then
exit;
{$IFDEF MSWINDOWS}
Libhandle := LoadLibrary(PChar(LibvorbisfilePath));
if Libhandle <> 0 then
begin
LibvorbisfileLoaded := True;
ov_clear := GetProcAddress(Libhandle, 'ov_clear');
ov_open_callbacks := GetProcAddress(Libhandle, 'ov_open_callbacks');
ov_test_callbacks := GetProcAddress(Libhandle, 'ov_test_callbacks');
ov_test_open := GetProcAddress(Libhandle, 'ov_test_open');
ov_bitrate := GetProcAddress(Libhandle, 'ov_bitrate');
ov_bitrate_instant := GetProcAddress(Libhandle, 'ov_bitrate_instant');
ov_streams := GetProcAddress(Libhandle, 'ov_streams');
ov_seekable := GetProcAddress(Libhandle, 'ov_seekable');
ov_serialnumber := GetProcAddress(Libhandle, 'ov_serialnumber');
ov_raw_total := GetProcAddress(Libhandle, 'ov_raw_total');
ov_pcm_total := GetProcAddress(Libhandle, 'ov_pcm_total');
ov_time_total := GetProcAddress(Libhandle, 'ov_time_total');
ov_raw_seek := GetProcAddress(Libhandle, 'ov_raw_seek');
ov_pcm_seek := GetProcAddress(Libhandle, 'ov_pcm_seek');
ov_pcm_seek_page := GetProcAddress(Libhandle, 'ov_pcm_seek_page');
ov_time_seek := GetProcAddress(Libhandle, 'ov_time_seek');
ov_time_seek_page := GetProcAddress(Libhandle, 'ov_time_seek_page');
ov_raw_tell := GetProcAddress(Libhandle, 'ov_raw_tell');
ov_pcm_tell := GetProcAddress(Libhandle, 'ov_pcm_tell');
ov_time_tell := GetProcAddress(Libhandle, 'ov_time_tell');
ov_info := GetProcAddress(Libhandle, 'ov_info');
ov_comment := GetProcAddress(Libhandle, 'ov_comment');
ov_read_float := GetProcAddress(Libhandle, 'ov_read_float');
ov_read := GetProcAddress(Libhandle, 'ov_read');
end;
{$ELSE}
{$IFDEF SEARCH_LIBS}
Libhandle := nil;
Path := FindLibs(LibvorbisfilePath);
if Path <> '' then Libhandle := dlopen(@Path[1], RTLD_NOW or RTLD_GLOBAL);
{$ELSE}
Libhandle := dlopen(LibvorbisfilePath, RTLD_NOW or RTLD_GLOBAL);
{$ENDIF}
if Libhandle <> nil then
begin {$IFDEF FPC}
{$IFDEF WIN32}
{$PACKRECORDS C}
{$ENDIF WIN32}
{$ENDIF WIN32}
LibvorbisfileLoaded := True;
ov_open := dlsym(Libhandle, 'ov_open');
ov_test := dlsym(Libhandle, 'ov_test');
ov_clear := dlsym(Libhandle, 'ov_clear');
ov_open_callbacks := dlsym(Libhandle, 'ov_open_callbacks');
ov_test_callbacks := dlsym(Libhandle, 'ov_test_callbacks');
ov_test_open := dlsym(Libhandle, 'ov_test_open');
ov_bitrate := dlsym(Libhandle, 'ov_bitrate');
ov_bitrate_instant := dlsym(Libhandle, 'ov_bitrate_instant');
ov_streams := dlsym(Libhandle, 'ov_streams');
ov_seekable := dlsym(Libhandle, 'ov_seekable');
ov_serialnumber := dlsym(Libhandle, 'ov_serialnumber');
ov_raw_total := dlsym(Libhandle, 'ov_raw_total');
ov_pcm_total := dlsym(Libhandle, 'ov_pcm_total');
ov_time_total := dlsym(Libhandle, 'ov_time_total');
ov_raw_seek := dlsym(Libhandle, 'ov_raw_seek');
ov_pcm_seek := dlsym(Libhandle, 'ov_pcm_seek');
ov_pcm_seek_page := dlsym(Libhandle, 'ov_pcm_seek_page');
ov_time_seek := dlsym(Libhandle, 'ov_time_seek');
ov_time_seek_page := dlsym(Libhandle, 'ov_time_seek_page');
ov_raw_tell := dlsym(Libhandle, 'ov_raw_tell');
ov_pcm_tell := dlsym(Libhandle, 'ov_pcm_tell');
ov_time_tell := dlsym(Libhandle, 'ov_time_tell');
ov_info := dlsym(Libhandle, 'ov_info');
ov_comment := dlsym(Libhandle, 'ov_comment');
ov_read_float := dlsym(Libhandle, 'ov_read_float');
ov_read := dlsym(Libhandle, 'ov_read');
end;
{$ENDIF}
end;
initialization
finalization
{$IFDEF MSWINDOWS}
if Libhandle <> 0 then FreeLibrary(Libhandle);
{$ELSE}
if libhandle <> nil then dlclose(Libhandle);
{$ENDIF}
end.