index b5b838d4ba224da50e1301ec8db02cfedea0a6e2..fe9a8a26f9c10ded420e82f183cee4c6167f3c77 100644 (file)
*
* 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
*
* 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, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
end;
TWAVLoaderFactory = class (TSoundLoaderFactory)
end;
TWAVLoaderFactory = class (TSoundLoaderFactory)
+ public
function MatchHeader(Data: Pointer; Len: LongWord): Boolean; override;
function MatchExtension(FName: string): Boolean; override;
function GetLoader(): TSoundLoader; override;
function MatchHeader(Data: Pointer; Len: LongWord): Boolean; override;
function MatchExtension(FName: string): Boolean; override;
function GetLoader(): TSoundLoader; override;
implementation
implementation
-uses sdl2, utils, e_log;
+uses
+ {$IFDEF USE_SDL}
+ SDL,
+ {$ELSE}
+ SDL2,
+ {$ENDIF}
+ utils, ctypes, e_log;
(* TWAVLoaderFactory *)
(* TWAVLoaderFactory *)
end;
(* TWAVLoader *)
end;
(* TWAVLoader *)
+function ConvertSound (var buf: PUInt8; var len: UInt32; var format: UInt16; rate: cint; chan: UInt8): Boolean;
+ var cvt: TSDL_AudioCVT; tformat: UInt16;
+begin
+ result := true;
+ case format of
+ AUDIO_U8, AUDIO_S8 : tformat := AUDIO_U8; (* yes, unsigned *)
+ AUDIO_U16LSB, AUDIO_U16MSB: tformat := AUDIO_S16SYS; (* and yes, signed *)
+ AUDIO_S16LSB, AUDIO_S16MSB: tformat := AUDIO_S16SYS;
+ AUDIO_S32LSB, AUDIO_S32MSB: tformat := AUDIO_S16SYS; (* 32bit not supported in al core *)
+ AUDIO_F32LSB, AUDIO_F32MSB: tformat := AUDIO_S16SYS; (* float not supported in al core *)
+ else result := false (* unsupported format *)
+ end;
+ if (result = true) and (format <> tformat) then
+ begin
+ Result := False;
+ if SDL_BuildAudioCVT(@cvt, format, chan, rate, tformat, chan, rate) <> -1 then
+ begin
+ buf := SDL_realloc(buf, len * cvt.len_mult);
+ cvt.len := len;
+ cvt.buf := buf;
+ result := SDL_ConvertAudio(@cvt) = 0;
+ len := cvt.len_cvt;
+ format := tformat
+ end
+ end
+end;
-function TWAVLoader.Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean;
-var
- Spec: TSDL_AudioSpec;
- RW: PSDL_RWops;
- TmpLen: UInt32;
- TmpBuf: PUInt8;
+function LoadWavRW (Loader: TWAVLoader; RW: PSDL_RWops): Boolean;
+ var
+ Spec: TSDL_AudioSpec;
+ Len: UInt32;
+ Buf: PUInt8;
begin
Result := False;
begin
Result := False;
-
- RW := SDL_RWFromConstMem(Data, Len);
-
- if SDL_LoadWAV_RW(RW, 0, @Spec, @TmpBuf, @TmpLen) = nil then
+{$IFDEF USE_SDL2}
+ if SDL_LoadWAV_RW(RW, 0, @Spec, @Buf, @Len) <> nil then
+{$ELSE}
+ if SDL_LoadWAV_RW(RW, 0, @Spec, PUInt8(@Buf), @Len) <> nil then
+{$ENDIF}
begin
begin
- e_LogWriteln('Could not load WAV: ' + SDL_GetError());
+ Result := ConvertSound(Buf, Len, Spec.format, Spec.freq, Spec.channels);
+ if Result = True then
+ begin
+ with Loader do
+ begin
+ FFormat.SampleRate := Spec.freq;
+ {$IFDEF USE_SDL2}
+ FFormat.SampleBits := SDL_AUDIO_BITSIZE(Spec.format);
+ {$ELSE}
+ FFormat.SampleBits := Spec.format and $FF;
+ {$ENDIF}
+ FFormat.Channels := Spec.channels;
+ FStreaming := False; // never stream wavs
+ FDataLen := Len;
+ FData := Buf;
+ end
+ end
+ else
+ begin
+ SDL_FreeWav(Buf)
+ end
end
end
- else
- begin
- FFormat.SampleRate := Spec.freq;
- FFormat.SampleBits := SDL_AUDIO_BITSIZE(Spec.format);
- FFormat.Channels := Spec.channels;
- FStreaming := False; // never stream wavs
- FDataLen := TmpLen;
- FData := TmpBuf;
- Result := True;
- end;
+end;
+function TWAVLoader.Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean;
+ var
+ RW: PSDL_RWops;
+begin
+ RW := SDL_RWFromConstMem(Data, Len);
+ Result := LoadWavRW(Self, RW);
+ if Result = False then
+ e_LogWriteln('Could not load WAV: ' + SDL_GetError());
SDL_RWclose(RW);
end;
function TWAVLoader.Load(FName: string; SStreaming: Boolean): Boolean;
SDL_RWclose(RW);
end;
function TWAVLoader.Load(FName: string; SStreaming: Boolean): Boolean;
-var
- Spec: TSDL_AudioSpec;
- RW: PSDL_RWops;
- TmpLen: UInt32;
- TmpBuf: PUInt8;
+ var
+ RW: PSDL_RWops;
begin
begin
- Result := False;
-
RW := SDL_RWFromFile(PChar(FName), 'rb');
RW := SDL_RWFromFile(PChar(FName), 'rb');
-
- if RW = nil then
- begin
- e_LogWritefln('Could not open WAV file `%s`: %s', [FName, SDL_GetError()]);
- exit;
- end;
-
- if SDL_LoadWAV_RW(RW, 0, @Spec, @TmpBuf, @TmpLen) = nil then
+ if RW <> nil then
begin
begin
- e_LogWritefln('Could not load WAV file `%s`: %s', [FName, SDL_GetError()]);
+ Result := LoadWavRW(Self, RW);
+ if Result = False then
+ e_LogWritefln('Could not load WAV file `%s`: %s', [FName, SDL_GetError()]);
end
else
begin
end
else
begin
- FFormat.SampleRate := Spec.freq;
- FFormat.SampleBits := SDL_AUDIO_BITSIZE(Spec.format);
- FFormat.Channels := Spec.channels;
- FStreaming := False; // never stream wavs
- FDataLen := TmpLen;
- FData := TmpBuf;
- Result := True;
+ e_LogWritefln('Could not open WAV file `%s`: %s', [FName, SDL_GetError()]);
+ Result := False
end;
end;
-
SDL_RWclose(RW);
end;
SDL_RWclose(RW);
end;