fpc/rtl/morphos/ahi.pas
2005-01-30 18:58:23 +00:00

635 lines
20 KiB
ObjectPascal
Raw Blame History

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 2005 Karoly Balogh for Genesi S.a.r.l.
ahi.library interface unit for MorphOS/PowerPC
Based on work of Nils Sjoholm member of the Amiga RTL
development team.
MorphOS port was done on a free Pegasos II/G4 machine
provided by Genesi S.a.r.l. <www.genesi.lu>
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
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.
**********************************************************************}
{$PACKRECORDS 2}
unit AHI;
interface
uses exec, utility;
var
AHIBase: PLibrary;
type
PFixed = ^Fixed;
Fixed = LONGINT;
{ A fixed-point value, 16 bits
to the left of the point and
16 bits to the right }
type
Psposition = ^sposition;
sposition = Fixed;
{ AHIAudioCtrl }
{ Lots of private data follows! }
PAHIAudioCtrl = ^tAHIAudioCtrl;
tAHIAudioCtrl = record
ahiac_UserData : Pointer;
end;
{ AHISoundMessage }
PAHISoundMessage = ^tAHISoundMessage;
tAHISoundMessage = record
ahism_Channel : Word;
end;
{ AHIRecordMessage }
PAHIRecordMessage = ^tAHIRecordMessage;
tAHIRecordMessage = record
ahirm_Type : Cardinal; { Format of buffer (object) }
ahirm_Buffer : Pointer; { Pointer to the sample array }
ahirm_Length : Cardinal; { Number of sample frames in buffer }
end;
{ AHISampleInfo }
PAHISampleInfo = ^tAHISampleInfo;
tAHISampleInfo = record
ahisi_Type : Cardinal; { Format of samples }
ahisi_Address : Pointer; { Address to array of samples }
ahisi_Length : Cardinal; { Number of samples in array }
end;
{ AHIAudioModeRequester }
PAHIAudioModeRequester = ^tAHIAudioModeRequester;
tAHIAudioModeRequester = record
ahiam_AudioID : Cardinal; { Selected audio mode }
ahiam_MixFreq : Cardinal; { Selected mixing/sampling frequency }
ahiam_LeftEdge : WORD; { Coordinates of requester on exit }
ahiam_TopEdge : WORD;
ahiam_Width : WORD;
ahiam_Height : WORD;
ahiam_InfoOpened : Boolean; { Info window opened on exit? }
ahiam_InfoLeftEdge : WORD; { Last coordinates of Info window }
ahiam_InfoTopEdge : WORD;
ahiam_InfoWidth : WORD;
ahiam_InfoHeight : WORD;
ahiam_UserData : Pointer; { You can store your own data here }
{ Lots of private data follows! }
end;
{ AHIEffMasterVolume }
PAHIEffMasterVolume = ^tAHIEffMasterVolume;
tAHIEffMasterVolume = record
ahie_Effect : Cardinal; { Set to AHIET_MASTERVOLUME }
ahiemv_Volume : Fixed; { See autodocs for range! }
end;
{ AHIEffOutputBuffer }
PAHIEffOutputBuffer = ^tAHIEffOutputBuffer;
tAHIEffOutputBuffer = record
ahie_Effect : Cardinal; { Set to AHIET_OUTPUTBUFFER }
ahieob_Func : PHook;
{ These fields are filled by AHI }
ahieob_Type : Cardinal; { Format of buffer }
ahieob_Buffer : Pointer; { Pointer to the sample array }
ahieob_Length : Cardinal; { Number of sample frames in buffer }
end;
{ AHIEffDSPMask (V4) }
PAHIEffDSPMask = ^tAHIEffDSPMask;
tAHIEffDSPMask = record
ahie_Effect : Cardinal; { Set to AHIET_DSPMASK }
ahiedm_Channels : Word; { Number of elements in array }
ahiedm_Mask : array[0..0] of Byte; { Here follows the array }
end;
const
AHIEDM_WET = 0;
AHIEDM_DRY = 1;
{ AHIEffDSPEcho (V4) }
type
PAHIDSPEcho = ^tAHIDSPEcho;
tAHIDSPEcho = record
ahie_Effect : Cardinal; { Set to AHIET_DSPECHO }
ahiede_Delay : Cardinal; { In samples }
ahiede_Feedback : Fixed;
ahiede_Mix : Fixed;
ahiede_Cross : Fixed;
end;
{ AHIEffChannelInfo (V4) }
PAHIEffChannelInfo = ^tAHIEffChannelInfo;
tAHIEffChannelInfo = record
ahie_Effect : Cardinal; { Set to AHIET_CHANNELINFO }
ahieci_Func : PHook;
ahieci_Channels : Word;
ahieci_Pad : Word;
{ The rest is filled by AHI }
ahieci_Offset : array[0..0] of Cardinal; { The array follows }
end;
{ TAGS }
const
AHI_TagBase = TAG_USER;
AHI_TagBaseR = AHI_TagBase or $8000;
{ AHI_AllocAudioA tags }
{ Desired audio mode }
AHIA_AudioID = AHI_TagBase + 1;
{ Suggested mixing frequency }
AHIA_MixFreq = AHI_TagBase + 2;
{ Suggested number of channels }
AHIA_Channels = AHI_TagBase + 3;
{ Number of sounds to use }
AHIA_Sounds = AHI_TagBase + 4;
{ End-of-Sound Hook }
AHIA_SoundFunc = AHI_TagBase + 5;
{ Player Hook }
AHIA_PlayerFunc = AHI_TagBase + 6;
{ Frequency for player Hook (Fixed) }
AHIA_PlayerFreq = AHI_TagBase + 7;
{ Minimum Frequency for player Hook }
AHIA_MinPlayerFreq = AHI_TagBase + 8;
{ Maximum Frequency for player Hook }
AHIA_MaxPlayerFreq = AHI_TagBase + 9;
{ Sample recording Hook }
AHIA_RecordFunc = AHI_TagBase + 10;
{ What to put in ahiac_UserData }
AHIA_UserData = AHI_TagBase + 11;
{ AHI_PlayA tags (V4) }
{ All command tags should be... }
AHIP_BeginChannel = AHI_TagBase + 40;
{ ... enclosed by these tags. }
AHIP_EndChannel = AHI_TagBase + 41;
AHIP_Freq = AHI_TagBase + 50;
AHIP_Vol = AHI_TagBase + 51;
AHIP_Pan = AHI_TagBase + 52;
AHIP_Sound = AHI_TagBase + 53;
AHIP_Offset = AHI_TagBase + 54;
AHIP_Length = AHI_TagBase + 55;
AHIP_LoopFreq = AHI_TagBase + 60;
AHIP_LoopVol = AHI_TagBase + 61;
AHIP_LoopPan = AHI_TagBase + 62;
AHIP_LoopSound = AHI_TagBase + 63;
AHIP_LoopOffset = AHI_TagBase + 64;
AHIP_LoopLength = AHI_TagBase + 65;
{ AHI_ControlAudioA tags }
{ Booleanean }
AHIC_Play = AHI_TagBase + 80;
{ Booleanean }
AHIC_Record = AHI_TagBase + 81;
AHIC_MonitorVolume = AHI_TagBase + 82;
{ ti_Data is pointer to Fixed (LONG) }
AHIC_MonitorVolume_Query = AHI_TagBase + 83;
{ ti_Data is pointer to Cardinal }
AHIC_MixFreq_Query = AHI_TagBase + 84;
{ --- New for V2, they will be ignored by V1 --- }
AHIC_InputGain = AHI_TagBase + 85;
{ ti_Data is pointer to Fixed (LONG) }
AHIC_InputGain_Query = AHI_TagBase + 86;
AHIC_OutputVolume = AHI_TagBase + 87;
{ ti_Data is pointer to Fixed (LONG) }
AHIC_OutputVolume_Query = AHI_TagBase + 88;
AHIC_Input = AHI_TagBase + 89;
{ ti_Data is pointer to Cardinal }
AHIC_Input_Query = AHI_TagBase + 90;
AHIC_Output = AHI_TagBase + 91;
{ ti_Data is pointer to Cardinal }
AHIC_Output_Query = AHI_TagBase + 92;
{ AHI_GetAudioAttrsA tags }
AHIDB_AudioID = AHI_TagBase + 100;
{ Pointer to name of driver }
AHIDB_Driver = AHI_TagBaseR + 101;
{ Private! }
AHIDB_Flags = AHI_TagBase + 102;
{ Booleanean }
AHIDB_Volume = AHI_TagBase + 103;
{ Booleanean }
AHIDB_Panning = AHI_TagBase + 104;
{ Booleanean }
AHIDB_Stereo = AHI_TagBase + 105;
{ Booleanean }
AHIDB_HiFi = AHI_TagBase + 106;
{ Booleanean }
AHIDB_PingPong = AHI_TagBase + 107;
{ Private! }
AHIDB_MultTable = AHI_TagBase + 108;
{ Pointer to name of this mode }
AHIDB_Name = AHI_TagBaseR + 109;
{ Output bits }
AHIDB_Bits = AHI_TagBase + 110;
{ Max supported channels }
AHIDB_MaxChannels = AHI_TagBase + 111;
{ Min mixing freq. supported }
AHIDB_MinMixFreq = AHI_TagBase + 112;
{ Max mixing freq. supported }
AHIDB_MaxMixFreq = AHI_TagBase + 113;
{ Booleanean }
AHIDB_Record = AHI_TagBase + 114;
AHIDB_Frequencies = AHI_TagBase + 115;
{ ti_Data is frequency index }
AHIDB_FrequencyArg = AHI_TagBase + 116;
AHIDB_Frequency = AHI_TagBase + 117;
{ Pointer to driver author name }
AHIDB_Author = AHI_TagBase + 118;
{ Pointer to driver copyright notice }
AHIDB_Copyright = AHI_TagBase + 119;
{ Pointer to driver version string }
AHIDB_Version = AHI_TagBase + 120;
{ Pointer to driver annotation text }
AHIDB_Annotation = AHI_TagBase + 121;
{ Specifies the string buffer size }
AHIDB_BufferLen = AHI_TagBase + 122;
{ ti_Data is frequency! }
AHIDB_IndexArg = AHI_TagBase + 123;
AHIDB_Index = AHI_TagBase + 124;
{ Booleanean }
AHIDB_Realtime = AHI_TagBase + 125;
{ It's sample frames }
AHIDB_MaxPlaySamples = AHI_TagBase + 126;
{ It's sample frames }
AHIDB_MaxRecordSamples = AHI_TagBase + 127;
{ Booleanean }
AHIDB_FullDuplex = AHI_TagBase + 129;
{ --- New for V2, they will be ignored by V1 --- }
AHIDB_MinMonitorVolume = AHI_TagBase + 130;
AHIDB_MaxMonitorVolume = AHI_TagBase + 131;
AHIDB_MinInputGain = AHI_TagBase + 132;
AHIDB_MaxInputGain = AHI_TagBase + 133;
AHIDB_MinOutputVolume = AHI_TagBase + 134;
AHIDB_MaxOutputVolume = AHI_TagBase + 135;
AHIDB_Inputs = AHI_TagBase + 136;
{ ti_Data is input index }
AHIDB_InputArg = AHI_TagBase + 137;
AHIDB_Input = AHI_TagBase + 138;
AHIDB_Outputs = AHI_TagBase + 139;
{ ti_Data is input index }
AHIDB_OutputArg = AHI_TagBase + 140;
AHIDB_Output = AHI_TagBase + 141;
{ --- New for V4, they will be ignored by V2 and earlier --- }
{ Private! }
AHIDB_Data = AHI_TagBaseR + 142;
{ AHI_BestAudioIDA tags }
{ --- New for V4, they will be ignored by V2 and earlier --- }
AHIB_Dizzy = AHI_TagBase + 190;
{ AHI_AudioRequestA tags }
{ Window control }
{ Parent window }
AHIR_Window = AHI_TagBase + 200;
{ Screen to open on if no window }
AHIR_Screen = AHI_TagBase + 201;
{ Name of public screen }
AHIR_PubScreenName = AHI_TagBase + 202;
{ Allocate private IDCMP? }
AHIR_PrivateIDCMP = AHI_TagBase + 203;
{ Function to handle IntuiMessages }
AHIR_IntuiMsgFunc = AHI_TagBase + 204;
{ Block input in AHIR_Window? }
AHIR_SleepWindow = AHI_TagBase + 205;
{ What to put in ahiam_UserData }
AHIR_UserData = AHI_TagBase + 206;
{ Text display }
{ Text font to use for gadget text }
AHIR_TextAttr = AHI_TagBase + 220;
{ Locale to use for text }
AHIR_Locale = AHI_TagBase + 221;
{ Title of requester }
AHIR_TitleText = AHI_TagBase + 222;
{ Positive gadget text }
AHIR_PositiveText = AHI_TagBase + 223;
{ Negative gadget text }
AHIR_NegativeText = AHI_TagBase + 224;
{ Initial settings }
{ Initial requester coordinates }
AHIR_InitialLeftEdge = AHI_TagBase + 240;
AHIR_InitialTopEdge = AHI_TagBase + 241;
{ Initial requester dimensions }
AHIR_InitialWidth = AHI_TagBase + 242;
AHIR_InitialHeight = AHI_TagBase + 243;
{ Initial audio mode id }
AHIR_InitialAudioID = AHI_TagBase + 244;
{ Initial mixing/sampling frequency }
AHIR_InitialMixFreq = AHI_TagBase + 245;
{ Info window initially opened? }
AHIR_InitialInfoOpened = AHI_TagBase + 246;
{ Initial Info window coords. }
AHIR_InitialInfoLeftEdge = AHI_TagBase + 247;
AHIR_InitialInfoTopEdge = AHI_TagBase + 248;
{ Not used! }
AHIR_InitialInfoWidth = AHI_TagBase + 249;
{ Not used! }
AHIR_InitialInfoHeight = AHI_TagBase + 250;
{ Options }
{ Allow selection of mixing frequency? }
AHIR_DoMixFreq = AHI_TagBase + 260;
{ Allow selection of default mode? (V4) }
AHIR_DoDefaultMode = AHI_TagBase + 261;
{ Filtering }
{ Pointer to filter taglist }
AHIR_FilterTags = AHI_TagBase + 270;
{ Function to filter mode id's }
AHIR_FilterFunc = AHI_TagBase + 271;
{ DEFS }
AHINAME : PChar = 'ahi.device';
{ Invalid Audio ID }
AHI_INVALID_ID = not (0);
{ Only for AHI_AllocAudioA()! }
AHI_DEFAULT_ID = $00000000;
{ Special sample render Audio ID }
AHI_LOOPBACK_ID = $00000001;
{ Only for AHI_AllocAudioA()! }
AHI_DEFAULT_FREQ = 0;
{ Special frequency for AHI_SetFreq() }
AHI_MIXFREQ = not (0);
{ Turns a channel off }
AHI_NOSOUND = $ffff;
{ Set#? Flags }
AHISF_IMM = 1 shl 0;
AHISB_IMM = 0;
{ Effect Types }
{ OR with effect to disable }
AHIET_CANCEL = 1 shl 31;
AHIET_MASTERVOLUME = 1;
AHIET_OUTPUTBUFFER = 2;
{ --- New for V4 --- }
AHIET_DSPMASK = 3;
AHIET_DSPECHO = 4;
AHIET_CHANNELINFO = 5;
{ Sound Types }
{ Private }
AHIST_NOTYPE = not (0);
{ 8 or 16 bit sample }
AHIST_SAMPLE = 0;
{ Dynamic sample }
AHIST_DYNAMICSAMPLE = 1;
{ The input from your sampler }
AHIST_INPUT = 1 shl 29;
{ Private }
AHIST_BW = 1 shl 30;
{ Sample types }
{ Note that only AHIST_M8S, AHIST_S8S, AHIST_M16S and AHIST_S16S
are supported by AHI_LoadSound(). }
{ Mono, 8 bit signed (BYTE) }
AHIST_M8S = 0;
{ Mono, 16 bit signed (WORD) }
AHIST_M16S = 1;
{ Stereo, 8 bit signed (2<>BYTE) }
AHIST_S8S = 2;
{ Stereo, 16 bit signed (2<>WORD) }
AHIST_S16S = 3;
{ Mono, 32 bit signed (LONG) }
AHIST_M32S = 8;
{ Stereo, 32 bit signed (2<>LONG) }
AHIST_S32S = 10;
{ OBSOLETE! }
AHIST_M8U = 4;
{ Error codes }
{ No error }
AHIE_OK = 0;
{ Out of memory }
AHIE_NOMEM = 1;
{ Unknown sound type }
AHIE_BADSOUNDTYPE = 2;
{ Unknown/unsupported sample type }
AHIE_BADSAMPLETYPE = 3;
{ User-triggered abortion }
AHIE_ABORTED = 4;
{ Error, but unknown }
AHIE_UNKNOWN = 5;
{ CMD_WRITE/CMD_READ failure }
AHIE_HALFDUPLEX = 6;
{ DEVICE INTERFACE DEFINITIONS FOLLOWS }
{ Device units }
AHI_DEFAULT_UNIT = 0;
AHI_NO_UNIT = 255;
{ The preference file }
ID_AHIU = $41484955;
ID_AHIG = $41484947;
type
PAHIUnitPrefs = ^tAHIUnitPrefs;
tAHIUnitPrefs = record
ahiup_Unit : Byte;
ahiup_Pad : Byte;
ahiup_Channels : Word;
ahiup_AudioMode : Cardinal;
ahiup_Frequency : Cardinal;
ahiup_MonitorVolume : Fixed;
ahiup_InputGain : Fixed;
ahiup_OutputVolume : Fixed;
ahiup_Input : Cardinal;
ahiup_Output : Cardinal;
end;
PAHIGlobalPrefs = ^tAHIGlobalPrefs;
tAHIGlobalPrefs = record
ahigp_DebugLevel : Word; { Range: 0-3 (for None, Low,}
ahigp_DisableSurround : Boolean; { High and All) }
ahigp_DisableEcho : Boolean;
ahigp_FastEcho : Boolean;
ahigp_MaxCPU : Fixed;
ahigp_ClipMasterVolume : Boolean;
end;
{ Debug levels }
const
AHI_DEBUG_NONE = 0;
AHI_DEBUG_LOW = 1;
AHI_DEBUG_HIGH = 2;
AHI_DEBUG_ALL = 3;
{ AHIRequest }
type
PAHIRequest = ^tAHIRequest;
tAHIRequest = record
ahir_Std : tIOStdReq; { Standard IO request }
ahir_Version : Word; { Needed version }
{ --- New for V4, they will be ignored by V2 and earlier --- }
ahir_Pad1 : Word;
ahir_Private : array[0..1] of Cardinal; { Hands off! }
ahir_Type : Cardinal; { Sample format }
ahir_Frequency : Cardinal; { Sample/Record frequency }
ahir_Volume : Fixed; { Sample volume }
ahir_Position : Fixed; { Stereo position }
ahir_Link : PAHIRequest; { For double buffering }
end;
{ Flags for OpenDevice() }
const
AHIDF_NOMODESCAN = 1 shl 0;
AHIDB_NOMODESCAN = 0;
function AHI_AllocAudioA(tagList : pTagItem location 'a1') : pAHIAudioCtrl;
SysCall AHIBase 042;
procedure AHI_FreeAudio(AudioCtrl : pAHIAudioCtrl location 'a2');
SysCall AHIBase 048;
procedure AHI_KillAudio;
SysCall AHIBase 054;
function AHI_ControlAudioA(AudioCtrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1') : Cardinal;
SysCall AHIBase 060;
procedure AHI_SetVol(Channel : Word location 'd0'; Volume : LongInt location 'd1'; Pan : LongInt location 'd2'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd3');
SysCall AHIBase 066;
procedure AHI_SetFreq(Channel : Word location 'd0'; Freq : Cardinal location 'd1'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd2');
SysCall AHIBase 072;
procedure AHI_SetSound(Channel : Word location 'd0'; Sound : Word location 'd1'; Offset : Cardinal location 'd2'; Length : LongInt location 'd3'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd4');
SysCall AHIBase 078;
function AHI_SetEffect(Effect : Pointer location 'a0'; AudioCtrl : pAHIAudioCtrl location 'a2') : Cardinal;
SysCall AHIBase 084;
function AHI_LoadSound(Sound : Word location 'd0'; SType : Cardinal location 'd1'; Info : Pointer location 'a0'; AudioCtrl : pAHIAudioCtrl location 'a2') : Cardinal;
SysCall AHIBase 090;
procedure AHI_UnloadSound(Sound : Word location 'd0'; Audioctrl : pAHIAudioCtrl location 'a2');
SysCall AHIBase 096;
function AHI_NextAudioID(Last_ID : Cardinal location 'd0') : Cardinal;
SysCall AHIBase 102;
function AHI_GetAudioAttrsA(ID : Cardinal location 'd0'; Audioctrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1') : BOOLEAN;
SysCall AHIBase 108;
function AHI_BestAudioIDA(tagList : pTagItem location 'a1') : Cardinal;
SysCall AHIBase 114;
function AHI_AllocAudioRequestA(tagList : pTagItem location 'a0') : pAHIAudioModeRequester;
SysCall AHIBase 120;
function AHI_AudioRequestA(Requester : pAHIAudioModeRequester location 'a0'; tagList : pTagItem location 'a1') : BOOLEAN;
SysCall AHIBase 126;
procedure AHI_FreeAudioRequest(Requester : pAHIAudioModeRequester location 'a0');
SysCall AHIBase 132;
procedure AHI_PlayA(Audioctrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1');
SysCall AHIBase 138;
function AHI_SampleFrameSize(SampleType : Cardinal location 'd0') : Cardinal;
SysCall AHIBase 144;
function AHI_AddAudioMode(a0arg : pTagItem location 'a0') : Cardinal;
SysCall AHIBase 150;
function AHI_RemoveAudioMode(d0arg : Cardinal location 'd0') : Cardinal;
SysCall AHIBase 156;
function AHI_LoadModeFile(a0arg : PChar location 'a0') : Cardinal;
SysCall AHIBase 162;
{
Functions and procedures with tags
}
function AHI_AllocAudio(tagList : array of DWord): pAHIAudioCtrl;
function AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; tagList : array Of DWord) : Cardinal;
function AHI_GetAudioAttrs(ID : CARDINAL; Audioctrl : pAHIAudioCtrl; taglist : array of DWord) : Boolean;
function AHI_BestAudioID(taglist : array of DWord) : Cardinal;
function AHI_AllocAudioRequest(taglist : array of DWord) : pAHIAudioModeRequester;
function AHI_AudioRequest(Requester : pAHIAudioModeRequester; taglist : array of DWord) : Boolean;
procedure AHI_Play(Audioctrl : pAHIAudioCtrl; taglist : array of DWord);
function InitAHILibrary : boolean;
implementation
function AHI_AllocAudio(tagList : array of DWord): pAHIAudioCtrl;
begin
AHI_AllocAudio:=AHI_AllocAudioA(@taglist);
end;
function AHI_AllocAudioRequest(taglist : array of DWord) : pAHIAudioModeRequester;
begin
AHI_AllocAudioRequest:=AHI_AllocAudioRequestA(@taglist);
end;
function AHI_AudioRequest(Requester : pAHIAudioModeRequester; taglist : array of DWord) : Boolean;
begin
AHI_AudioRequest:=AHI_AudioRequestA(Requester,@taglist);
end;
function AHI_BestAudioID(taglist : array of DWord) : longword;
begin
AHI_BestAudioID:=AHI_BestAudioIDA(@taglist);
end;
function AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; taglist : array of DWord) : longword;
begin
AHI_ControlAudio:=AHI_ControlAudioA(AudioCtrl,@taglist);
end;
function AHI_GetAudioAttrs(ID : longword; Audioctrl : pAHIAudioCtrl; taglist : array of DWord) : Boolean;
begin
AHI_GetAudioAttrs:=AHI_GetAudioAttrsA(ID,Audioctrl,@taglist);
end;
procedure AHI_Play(Audioctrl : pAHIAudioCtrl; taglist : array of DWord);
begin
AHI_PlayA(Audioctrl,@taglist);
end;
const
{ Change VERSION and LIBVERSION to proper values }
VERSION : string[2] = '0';
LIBVERSION : longword = 0;
var
ahi_exit : Pointer;
procedure CloseAHILibrary;
begin
ExitProc := ahi_exit;
if AHIBase <> nil then begin
CloseLibrary(PLibrary(AHIBase));
AHIBase := nil;
end;
end;
function InitAHILibrary : boolean;
begin
AHIBase := nil;
AHIBase := OpenLibrary(AHINAME,LIBVERSION);
if AHIBase <> nil then begin
ahi_exit := ExitProc;
ExitProc := @CloseAhiLibrary;
InitAhiLibrary:=True;
end else begin
InitAhiLibrary:=False;
end;
end;
end. (* UNIT AHI *)
{
$Log
}