diff -r df9d0728c5bb -r 51d3f4b6293a hedgewars/uSound.pas --- a/hedgewars/uSound.pas Fri Oct 16 22:46:58 2009 +0000 +++ b/hedgewars/uSound.pas Sat Oct 17 01:28:49 2009 +0000 @@ -18,33 +18,15 @@ unit uSound; interface - - -{$IFDEF DARWIN} - {$linklib openalbridge} - {$linkframework OpenAL} - {$linkframework Ogg} - {$linkframework Vorbis} -{$ELSE} -{$IFNDEF WIN32} - {$linklib openal} - {$linklib ogg} - {$linklib vorbis} - {$linklib vorbisfile} -{$ENDIF} -{$ENDIF} - -uses uConsts; +uses SDLh, uConsts; {$INCLUDE options.inc} type PVoicepack = ^TVoicepack; TVoicepack = record name: shortstring; - chunks: array [TSound] of LongInt; + chunks: array [TSound] of PMixChunk; end; -const OpenALBridge = 'libopenalbridge'; - procedure InitSound; procedure ReleaseSound; procedure SoundLoad; @@ -53,39 +35,23 @@ procedure PauseMusic; procedure ResumeMusic; procedure StopSound(snd: TSound); - -function ChangeVolume(voldelta: LongInt): LongInt; -function AskForVoicepack(name: shortstring): PVoicepack; -function soundFadeOut(snd: TSound; qt: LongInt; voicepack: PVoicepack): LongInt; - +function ChangeVolume(voldelta: LongInt): LongInt; -procedure oalb_close; cdecl; external OpenALBridge; -function oalb_init (const app: PChar; const usehardware: Byte): Byte; cdecl; external OpenALBridge; -function oalb_loadfile (const filename: PChar): LongInt; cdecl; external OpenALBridge; -procedure oalb_playsound (const idx: LongInt; const loop: Byte); cdecl; external OpenALBridge; -procedure oalb_stopsound (const idx: LongInt); cdecl; external OpenALBridge; -procedure oalb_pausesound (const idx: LongInt); cdecl; external OpenALBridge; -procedure oalb_continuesound (const idx: LongInt); cdecl; external OpenALBridge; -procedure oalb_setvolume (const idx: LongInt; const percentage: Byte); cdecl; external OpenALBridge; -procedure oalb_setglobalvolume (const percentage: Byte); cdecl; external OpenALBridge; -procedure oalb_fadein (const idx: LongInt; quantity: Integer); cdecl; external OpenALBridge; -procedure oalb_fadeout (const idx: LongInt; quantity: Integer); cdecl; external OpenALBridge; - +function AskForVoicepack(name: shortstring): Pointer; var MusicFN: shortstring = ''; implementation - uses uMisc, uConsole; const chanTPU = 12; -var Volume: LongInt; +var Volume: LongInt; lastChan: array [TSound] of LongInt; voicepacks: array[0..cMaxTeams] of TVoicepack; defVoicepack: PVoicepack; - Mus: LongInt = 0; + Mus: PMixMusic = nil; -function AskForVoicepack(name: shortstring): PVoicepack; +function AskForVoicepack(name: shortstring): Pointer; var i: Longword; begin i:= 0; @@ -102,22 +68,31 @@ procedure InitSound; begin if not isSoundEnabled then exit; -{*sound works in ipodtouch only if LAND_WIDTH = 1024; LAND_HEIGHT = 512; -or if ogg are loaded in stream or if sound is loaded by demand*} -WriteToConsole('Init OpenAL sound...'); - -isSoundEnabled:= oalb_init(str2PChar(ParamStr(0)), Byte(isSoundHardware)) = 1; +WriteToConsole('Init sound...'); +isSoundEnabled:= SDL_Init(SDL_INIT_AUDIO) >= 0; +if isSoundEnabled then + isSoundEnabled:= Mix_OpenAudio(44100, $8010, 2, 1024) = 0; if isSoundEnabled then WriteLnToConsole(msgOK) else WriteLnToConsole(msgFailed); +Mix_AllocateChannels(Succ(chanTPU)); +if isMusicEnabled then Mix_VolumeMusic(50); -Volume:=0; -ChangeVolume(cInitVolume); +Volume:= 0; +ChangeVolume(cInitVolume) end; procedure ReleaseSound; +var i: TSound; + t: Longword; begin -if isMusicEnabled then oalb_fadeout(Mus, 30); -oalb_close(); +for t:= 0 to cMaxTeams do + if voicepacks[t].name <> '' then + for i:= Low(TSound) to High(TSound) do + if voicepacks[t].chunks[i] <> nil then + Mix_FreeChunk(voicepacks[t].chunks[i]); + +Mix_FreeMusic(Mus); +Mix_CloseAudio end; procedure SoundLoad; @@ -134,8 +109,8 @@ begin s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName; WriteToConsole(msgLoading + s + ' '); - defVoicepack^.chunks[i]:= oalb_loadfile(Str2PChar(s)); - TryDo(defVoicepack^.chunks[i] >= 0, msgFailed, true); + defVoicepack^.chunks[i]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); + TryDo(defVoicepack^.chunks[i] <> nil, msgFailed, true); WriteLnToConsole(msgOK); end; @@ -146,38 +121,34 @@ begin s:= Pathz[Soundz[i].Path] + '/' + voicepacks[t].name + '/' + Soundz[i].FileName; WriteToConsole(msgLoading + s + ' '); - voicepacks[t].chunks[i]:= oalb_loadfile(Str2PChar(s)); - if voicepacks[t].chunks[i] < 0 then + // {$IFNDEF IPHONEOS} + //broken for unknown reasons (most likely poor SDL_Mixer) + voicepacks[t].chunks[i]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); + // {$ENDIF} + if voicepacks[t].chunks[i] = nil then WriteLnToConsole(msgFailed) else WriteLnToConsole(msgOK) end; end; -function soundFadeOut(snd: TSound; qt: LongInt; voicepack: PVoicepack): LongInt; -begin -if not isSoundEnabled then exit(0); -if (voicepack <> nil) and (voicepack^.chunks[snd] >= 0) then oalb_fadeout(defVoicepack^.chunks[snd], qt) -else if (defVoicepack^.chunks[snd] >= 0) then oalb_fadeout(defVoicepack^.chunks[snd], qt); -end; - procedure PlaySound(snd: TSound; infinite: boolean; voicepack: PVoicepack); +var loops: LongInt; begin if (not isSoundEnabled) or fastUntilLag then exit; - -if voicepack = nil then voicepack:= defVoicepack; +if infinite then loops:= -1 else loops:= 0; -if voicepack^.chunks[snd] >= 0 then - begin - oalb_playsound(voicepack^.chunks[snd], Byte(infinite)); - lastChan[snd]:=voicepack^.chunks[snd]; - end +if (voicepack <> nil) and (voicepack^.chunks[snd] <> nil) then + lastChan[snd]:= Mix_PlayChannelTimed(-1, voicepack^.chunks[snd], loops, -1) +else + lastChan[snd]:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], loops, -1) end; procedure StopSound(snd: TSound); begin -if isSoundEnabled then - oalb_stopsound(lastChan[snd]) +if not isSoundEnabled then exit; +if Mix_Playing(lastChan[snd]) <> 0 then + Mix_HaltChannel(lastChan[snd]) end; procedure PlayMusic; @@ -190,47 +161,39 @@ s:= PathPrefix + '/Music/' + MusicFN; WriteToConsole(msgLoading + s + ' '); -Mus:= oalb_loadfile(Str2PChar(s)); -TryDo(Mus >= 0, msgFailed, false); +Mus:= Mix_LoadMUS(Str2PChar(s)); +TryDo(Mus <> nil, msgFailed, false); WriteLnToConsole(msgOK); -oalb_playsound(Mus, 1); -oalb_fadein(Mus, 20); +SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, false) end; function ChangeVolume(voldelta: LongInt): LongInt; begin -if not isSoundEnabled then exit(0); +if not isSoundEnabled then + exit(0); inc(Volume, voldelta); if Volume < 0 then Volume:= 0; -if Volume > 100 then Volume:= 100; - -oalb_setglobalvolume(Volume); -if isMusicEnabled then oalb_setvolume(Mus, Volume shr 1); -ChangeVolume:= Volume; +Mix_Volume(-1, Volume); +Volume:= Mix_Volume(-1, -1); +if isMusicEnabled then Mix_VolumeMusic(Volume * 4 div 8); +ChangeVolume:= Volume * 100 div MIX_MAX_VOLUME end; procedure PauseMusic; begin if (MusicFN = '') or (not isMusicEnabled) then exit; -oalb_stopsound(Mus) + +Mix_PauseMusic(Mus); end; procedure ResumeMusic; begin if (MusicFN = '') or (not isMusicEnabled) then exit; -oalb_playsound(Mus, 0) + +Mix_ResumeMusic(Mus); end; - -var i: LongInt; - c: TSound; +end. -initialization -for i:= 0 to cMaxTeams do - for c:= Low(TSound) to High(TSound) do - voicepacks[i].chunks[c]:= -1 - - -end.