once again, trying to restore windows compatibility from nemo's experiments
(* * Hedgewars, a free turn based strategy game * Copyright (c) 2005, 2007, 2009 Andrey Korotaev <unC0Rr@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License * * 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. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *)unit uSound;interface{$IFDEF DARWIN} {$linklib openalbridge} {$linkframework OpenAL} {$linkframework Ogg} {$linkframework Vorbis}{$ELSE}{$IFNDEF MSVC} {$linklib openalbridge}{$IFNDEF WIN32} {$linklib openal}{$ELSE} {$linklib openal32}{$ENDIF} {$linklib ogg} {$linklib vorbis} {$linklib vorbisfile}{$ENDIF}{$ENDIF}uses uConsts;{$INCLUDE options.inc}type PVoicepack = ^TVoicepack; TVoicepack = record name: shortstring; chunks: array [TSound] of LongInt; end;const OpenALBridge = 'libopenalbridge';procedure InitSound;procedure ReleaseSound;procedure SoundLoad;procedure PlaySound(snd: TSound; infinite: boolean; voicepack: PVoicepack);procedure PlayMusic;procedure PauseMusic;procedure ResumeMusic;procedure StopSound(snd: TSound);function ChangeVolume(voldelta: LongInt): LongInt;function AskForVoicepack(name: shortstring): Pointer;{*remember: LongInt = 32bit; integer = 16bit; byte = 8bit*}function openal_init (memsize: LongInt) : boolean; cdecl; external OpenALBridge;function openal_close : boolean; cdecl; external OpenALBridge;function openal_loadfile (filename: PChar) : LongInt; cdecl; external OpenALBridge;function openal_toggleloop (index: LongInt) : boolean; cdecl; external OpenALBridge;function openal_setvolume (index: LongInt; percentage: byte) : boolean; cdecl; external OpenALBridge;function openal_setglobalvolume (percentage: byte) : boolean; cdecl; external OpenALBridge;function openal_fadeout (index: LongInt; quantity: integer) : boolean; cdecl; external OpenALBridge;function openal_fadein (index: LongInt; quantity: integer) : boolean; cdecl; external OpenALBridge;function openal_fade (index: LongInt; quantity: integer; direction: byte) : boolean; cdecl; external OpenALBridge;function openal_playsound (index: LongInt) : boolean; cdecl; external OpenALBridge;function openal_pausesound (index: LongInt) : boolean; cdecl; external OpenALBridge;function openal_stopsound (index: LongInt) : boolean; cdecl; external OpenALBridge;var MusicFN: shortstring = '';implementationuses uMisc, uConsole;const chanTPU = 12;var lastChan: array [TSound] of LongInt; voicepacks: array[0..cMaxTeams] of TVoicepack; defVoicepack: PVoicepack; Mus: LongInt = 0;function AskForVoicepack(name: shortstring): Pointer;var i: Longword;begini:= 0;while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') do begin inc(i); TryDo(i <= cMaxTeams, 'Engine bug: AskForVoicepack i > cMaxTeams', true) end;voicepacks[i].name:= name;addfilelog('================================================ '+inttostr(i));AskForVoicepack:= @voicepacks[i]end;procedure InitSound;const numSounds = 80;beginif not isSoundEnabled then exit;WriteToConsole('Init OpenAL sound...');isSoundEnabled:= openal_init(numSounds);if isSoundEnabled then WriteLnToConsole(msgOK) else WriteLnToConsole(msgFailed);end;procedure ReleaseSound;beginif isMusicEnabled then openal_fadeout(Mus, 30);openal_close();end;procedure SoundLoad;const volume = 60;var i: TSound; s: shortstring; t: Longword;beginif not isSoundEnabled then exit;defVoicepack:= AskForVoicepack('Default');for i:= Low(TSound) to High(TSound) do if Soundz[i].Path <> ptVoices then begin s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName; WriteToConsole(msgLoading + s + ' '); defVoicepack^.chunks[i]:= openal_loadfile (Str2PChar(s)); openal_setvolume(defVoicepack^.chunks[i],volume); TryDo(defVoicepack^.chunks[i] >= 0, msgFailed, true); WriteLnToConsole(msgOK); end;for t:= 0 to cMaxTeams do if voicepacks[t].name <> '' then for i:= Low(TSound) to High(TSound) do if Soundz[i].Path = ptVoices then begin s:= Pathz[Soundz[i].Path] + '/' + voicepacks[t].name + '/' + Soundz[i].FileName; WriteToConsole(msgLoading + s + ' '); voicepacks[t].chunks[i]:= openal_loadfile (Str2PChar(s)); openal_setvolume(voicepacks[t].chunks[i],volume); if voicepacks[t].chunks[i] < 0 then WriteLnToConsole(msgFailed) else WriteLnToConsole(msgOK) end;end;procedure PlaySound(snd: TSound; infinite: boolean; voicepack: PVoicepack);beginif (not isSoundEnabled) or fastUntilLag then exit;if (voicepack <> nil) and (voicepack^.chunks[snd] >= 0) thenbegin if infinite then openal_toggleloop(voicepack^.chunks[snd]); openal_playsound(voicepack^.chunks[snd]); lastChan[snd]:=voicepack^.chunks[snd];endelsebegin if infinite then openal_toggleloop(defVoicepack^.chunks[snd]); openal_playsound(defVoicepack^.chunks[snd]); lastChan[snd]:=defVoicepack^.chunks[snd];endend;procedure StopSound(snd: TSound);beginif not isSoundEnabled then exit; openal_stopsound(lastChan[snd])end;procedure PlayMusic;var s: string;beginif (not isSoundEnabled) or (MusicFN = '') or (not isMusicEnabled) then exit;s:= PathPrefix + '/Music/' + MusicFN;WriteToConsole(msgLoading + s + ' ');Mus:= openal_loadfile(Str2PChar(s));TryDo(Mus >= 0, msgFailed, false);WriteLnToConsole(msgOK);openal_setvolume(Mus, 60);openal_fadein(Mus, 20);openal_toggleloop(Mus);end;function ChangeVolume(voldelta: LongInt): LongInt;beginif not isSoundEnabled then exit(0);openal_setglobalvolume(voldelta);end;procedure PauseMusic;beginif (MusicFN = '') or (not isMusicEnabled) then exit;openal_pausesound(Mus);end;procedure ResumeMusic;beginif (MusicFN = '') or (not isMusicEnabled) then exit;openal_playsound(Mus);end;var i: LongInt; c: TSound;initializationfor i:= 0 to cMaxTeams do for c:= Low(TSound) to High(TSound) do voicepacks[i].chunks[c]:= -1end.