94 lines
2.1 KiB
ObjectPascal
94 lines
2.1 KiB
ObjectPascal
{This unit is part of United Openlibraries of Sound (uos)}
|
|
|
|
{This is the Pascal Wrapper + Dynamic loading of OpusURL library.
|
|
Load library with ou_load() and release with ou_unload().
|
|
License : modified LGPL.
|
|
Fred van Stappen / fiens@hotmail.com}
|
|
|
|
unit uos_Opusurl;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
ctypes, uos_Opusfile, dynlibs, SysUtils;
|
|
|
|
// Error Codes
|
|
const
|
|
OP_FALSE = -1;
|
|
OP_HOLE = -3;
|
|
OP_EREAD = -128;
|
|
OP_EFAULT = -129;
|
|
OP_EIMPL = -130;
|
|
OP_EINVAL = -131;
|
|
OP_ENOTVORBIS = -132;
|
|
OP_EBADHEADER = -133;
|
|
OP_EVERSION = -134;
|
|
OP_ENOTAUDIO = -135;
|
|
OP_EBADPACKET = -136;
|
|
OP_EBADLINK = -137;
|
|
OP_ENOSEEK = -138;
|
|
OP_EBADTIMESTAMP = -139;
|
|
|
|
var
|
|
|
|
op_open_url: function(path: PAnsiChar; out error: Integer): TOpusFile;
|
|
op_test_url: function(path: PAnsiChar; out error: Integer): TOpusFile;
|
|
|
|
ou_Handle:TLibHandle=dynlibs.NilHandle;
|
|
|
|
ReferenceCounter : cardinal = 0; // Reference counter
|
|
|
|
function ou_IsLoaded : boolean; inline;
|
|
|
|
Function ou_Load(const libfilename:string) :boolean; // load the lib
|
|
|
|
Procedure ou_Unload;
|
|
|
|
implementation
|
|
|
|
function ou_IsLoaded: boolean;
|
|
begin
|
|
Result := (ou_Handle <> dynlibs.NilHandle);
|
|
end;
|
|
|
|
Procedure ou_Unload;
|
|
begin
|
|
// < Reference counting
|
|
if ReferenceCounter > 0 then
|
|
dec(ReferenceCounter);
|
|
if ReferenceCounter > 0 then
|
|
exit;
|
|
// >
|
|
if ou_IsLoaded then
|
|
begin
|
|
DynLibs.UnloadLibrary(ou_Handle);
|
|
ou_Handle:=DynLibs.NilHandle;
|
|
end;
|
|
end;
|
|
|
|
Function ou_Load (const libfilename:string) :boolean;
|
|
begin
|
|
Result := False;
|
|
if ou_Handle<>0 then
|
|
begin
|
|
Inc(ReferenceCounter);
|
|
result:=true {is it already there ?}
|
|
end else
|
|
begin {go & load the library}
|
|
if Length(libfilename) = 0 then exit;
|
|
ou_Handle:=DynLibs.SafeLoadLibrary(libfilename); // obtain the handle we want
|
|
if ou_Handle <> DynLibs.NilHandle then
|
|
begin {now we tie the functions to the VARs from above}
|
|
Pointer(op_open_url):=DynLibs.GetProcedureAddress(OU_Handle,PChar('op_open_url'));
|
|
Pointer(op_test_url):=DynLibs.GetProcedureAddress(OU_Handle,PChar('op_test_url'));
|
|
end;
|
|
Result := ou_IsLoaded;
|
|
ReferenceCounter:=1;
|
|
end;
|
|
|
|
end;
|
|
|
|
end.
|