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