1unit asndlib;
2{$mode objfpc}
3{$J+}
4{$INLINE ON}
5{$MACRO ON}
6{$PACKRECORDS C}
7{$ASSERTIONS ON}
8
9interface
10
11uses
12  ctypes, gctypes;
13
14const
15  ASND_LIB = $100;
16  SND_LIB = ( ASND_LIB + 2 );
17  SND_OK = 0;
18  SND_INVALID = - 1;
19  SND_ISNOTASONGVOICE = - 2;
20  SND_BUSY = 1;
21  SND_UNUSED = 0;  (*!< This voice is available for use.  *)
22  SND_WORKING = 1;  (*!< This voice is currently in progress.  *)
23  SND_WAITING = 2;  (*!< This voice is currently in progress and waiting to one SND_AddVoice() function (the voice handler is called continuously)  *)
24
25  VOICE_MONO_8BIT       = 0;
26  VOICE_MONO_16BIT      = 1;
27  VOICE_MONO_16BIT_BE   = 1;
28  VOICE_STEREO_8BIT     = 2;
29  VOICE_STEREO_16BIT    = 3;
30  VOICE_STEREO_16BIT_BE = 3;
31  VOICE_MONO_8BIT_U     = 4;
32  VOICE_MONO_16BIT_LE   = 5;
33  VOICE_STEREO_8BIT_U   = 6;
34  VOICE_STEREO_16BIT_LE = 7;
35
36  MIN_VOLUME = 0;
37  MID_VOLUME = 127;
38  MAX_VOLUME = 255;
39  MIN_PITCH = 1;  (*!< 1Hz  *)
40  F44100HZ_PITCH = 44100;  (*!< 44100Hz  *)
41  MAX_PITCH = 144000;  (*!< 144000Hz (more process time for pitch>48000)  *)
42
43  NOTE_DO = 0;
44  NOTE_DOs = 1;
45  NOTE_REb = NOTE_DOs;
46  NOTE_RE = NOTE_REb + 1;
47  NOTE_REs = NOTE_RE + 1;
48  NOTE_MIb = NOTE_REs;
49  NOTE_MI = NOTE_MIb + 1;
50  NOTE_FA = NOTE_MI + 1;
51  NOTE_FAs = NOTE_FA + 1;
52  NOTE_SOLb = NOTE_FAs;
53  NOTE_SOL = NOTE_SOLb + 1;
54  NOTE_SOLs = NOTE_SOL + 1;
55  NOTE_LAb = NOTE_SOLs;
56  NOTE_LA = NOTE_LAb + 1;
57  NOTE_LAs = NOTE_LA + 1;
58  NOTE_SIb = NOTE_LAs;
59  NOTE_SI = NOTE_SIb + 1;
60
61  NOTE_C = 0;
62  NOTE_Cs = 1;
63  NOTE_Db = NOTE_Cs;
64  NOTE_D = NOTE_Db + 1;
65  NOTE_Ds = NOTE_D + 1;
66  NOTE_Eb = NOTE_Ds;
67  NOTE_E = NOTE_Eb + 1;
68  NOTE_F = NOTE_E + 1;
69  NOTE_Fs = NOTE_F + 1;
70  NOTE_Gb = NOTE_Fs;
71  NOTE_G = NOTE_Gb + 1;
72  NOTE_Gs = NOTE_G + 1;
73  NOTE_Ab = NOTE_Gs;
74  NOTE_A = NOTE_Ab + 1;
75  NOTE_As = NOTE_A + 1;
76  NOTE_Bb = NOTE_As;
77  NOTE_B = NOTE_Bb + 1;
78
79
80function _NOTE(note, octave: cint): cint; inline;
81
82{$define Note2Freq               := ANote2Freq}
83{$define SND_Init                := ASND_Init}
84{$define SND_End                 := ASND_End}
85{$define SND_Pause               := ASND_Pause}
86{$define SND_Is_Paused           := ASND_Is_Paused}
87{$define SND_GetTime             := ASND_GetTime}
88{$define SND_GetSampleCounter    := ASND_GetSampleCounter}
89{$define SND_GetSamplesPerTick   := ASND_GetSamplesPerTick}
90{$define SND_SetTime             := ASND_SetTime}
91{$define SND_SetCallback         := ASND_SetCallback}
92{$define SND_GetAudioRate        := ASND_GetAudioRate}
93{$define SND_SetVoice            := ASND_SetVoice}
94{$define SND_AddVoice            := ASND_AddVoice}
95{$define SND_StopVoice           := ASND_StopVoice}
96{$define SND_PauseVoice          := ASND_PauseVoice}
97{$define SND_StatusVoice         := ASND_StatusVoice}
98{$define SND_GetFirstUnusedVoice := ASND_GetFirstUnusedVoice}
99{$define SND_ChangePitchVoice    := ASND_ChangePitchVoice}
100{$define SND_ChangeVolumeVoice   := ASND_ChangeVolumeVoice}
101{$define SND_ChangeVolumeVoice   := ASND_ChangeVolumeVoice}
102{$define SND_GetTickCounterVoice := ASND_GetTickCounterVoice}
103{$define SND_GetTimerVoice       := ASND_GetTimerVoice}
104{$define SND_TestPointer         := ASND_TestPointer}
105
106
107
108type
109  ASNDVoiceCallback = procedure(voice: cint32); cdecl;
110
111function ANote2Freq(note, freq_base, note_base: cint): cint; cdecl; external;
112procedure ASND_Init; cdecl; external;
113procedure ASND_End; cdecl; external;
114procedure ASND_Pause(paused: cint32); cdecl; external;
115function ASND_Is_Paused: cint32; cdecl; external;
116function ASND_GetTime: cuint32; cdecl; external;
117function ASND_GetSampleCounter: cuint32; cdecl; external;
118function ASND_GetSamplesPerTick: cuint32; cdecl; external;
119procedure ASND_SetTime(time: cuint32); cdecl; external;
120
121type
122  TAuxCallback0 = procedure; cdecl;
123procedure ASND_SetCallback(callback: TAuxCallback0); cdecl; external;
124function ASND_GetAudioRate: cint32; cdecl; external;
125function ASND_SetVoice(voice, format, pitch, delay: cint32; snd: pointer; size_snd, volume_l, volume_r: cint32; callback: ASNDVoiceCallback): cint32; cdecl; external;
126function ASND_SetInfiniteVoice(voice, format, pitch, delay: cint32; snd: pointer; size_snd, volume_l, volume_r: cint32): cint32; cdecl; external;
127function ASND_AddVoice(voice: cint32; snd: pointer; size_snd: cint32): cint32; cdecl; external;
128function ASND_StopVoice(voice: cint32): cint32; cdecl; external;
129function ASND_PauseVoice(voice, pause: cint32): cint32; cdecl; external;
130function ASND_StatusVoice(voice: cint32): cint32; cdecl; external;
131function ASND_GetFirstUnusedVoice: cint32; cdecl; external;
132function ASND_ChangePitchVoice(voice, pitch: cint32): cint32; cdecl; external;
133function ASND_ChangeVolumeVoice(voice, volume_l, volume_r: cint32): cint32; cdecl; external;
134function ASND_GetTickCounterVoice(voice: cint32): cuint32; cdecl; external;
135function ASND_GetTimerVoice(voice: cint32): cuint32; cdecl; external;
136function ASND_TestPointer(voice: cint32; pointer: pointer): cint32; cdecl; external;
137function ASND_TestVoiceBufferReady(voice: cint32): cint32; cdecl; external;
138function ASND_GetDSP_PercentUse: cuint32; cdecl; external;
139function ASND_GetDSP_ProcessTime: cuint32; cdecl; external;
140
141implementation
142
143function _NOTE(note, octave: cint): cint; inline;
144begin
145  _NOTE := note + (octave shl 3) + (octave shl 2);
146end;
147
148initialization
149
150{$linklib asnd}
151
152end.
153