DEADSOFTWARE

Sound: OpenAL: Add module interp setting
[d2df-sdl.git] / src / engine / e_soundfile_xmp.pas
index aaf1df194d3b1904f25ff6993d6e5beab46d503f..d3e4da5809fc6edb59a2140fb87ae0ded2ada562 100644 (file)
@@ -37,6 +37,7 @@ type
   end;
 
   TXMPLoaderFactory = class (TSoundLoaderFactory)
+  public
     function MatchHeader(Data: Pointer; Len: LongWord): Boolean; override;
     function MatchExtension(FName: string): Boolean; override;
     function GetLoader(): TSoundLoader; override;
@@ -88,6 +89,7 @@ end;
 function TXMPLoader.Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean;
 var
   Err: LongInt;
+  Interp: LongInt;
 begin
   Result := False;
 
@@ -100,10 +102,14 @@ begin
     if Err <> 0 then
       raise Exception.Create('xmp_load_module_from_memory failed');
 
-    if xmp_start_player(FXMP, e_SoundFormat.SampleRate, 0) <> 0 then
+    if xmp_start_player(FXMP, 48000, 0) <> 0 then
       raise Exception.Create('xmp_start_player failed');
 
-    FFormat.SampleRate := e_SoundFormat.SampleRate;
+    if e_MusicLerp then Interp := XMP_INTERP_LINEAR
+    else Interp := XMP_INTERP_NEAREST;
+    xmp_set_player(FXMP, XMP_PLAYER_INTERP, Interp);
+
+    FFormat.SampleRate := 48000;
     FFormat.SampleBits := 16;
     FFormat.Channels := 2;
 
@@ -124,6 +130,7 @@ end;
 function TXMPLoader.Load(FName: string; SStreaming: Boolean): Boolean;
 var
   Err: LongInt;
+  Interp: LongInt;
 begin
   Result := False;
 
@@ -136,10 +143,14 @@ begin
     if Err <> 0 then
       raise Exception.Create('xmp_load_module failed');
 
-    if xmp_start_player(FXMP, e_SoundFormat.SampleRate, 0) <> 0 then
+    if xmp_start_player(FXMP, 48000, 0) <> 0 then
       raise Exception.Create('xmp_start_player failed');
 
-    FFormat.SampleRate := e_SoundFormat.SampleRate;
+    if e_MusicLerp then Interp := XMP_INTERP_LINEAR
+    else Interp := XMP_INTERP_NEAREST;
+    xmp_set_player(FXMP, XMP_PLAYER_INTERP, Interp);
+
+    FFormat.SampleRate := 48000;
     FFormat.SampleBits := 16;
     FFormat.Channels := 2;
 
@@ -165,10 +176,16 @@ begin
 end;
 
 function TXMPLoader.FillBuffer(Buf: Pointer; Len: LongWord): LongWord;
+var
+  LoopN: LongInt;
 begin
   Result := 0;
   if FXMP = nil then Exit;
-  if xmp_play_buffer(FXMP, Buf, Len, 0) = 0 then
+  if FLooping then
+    LoopN := 0
+  else
+    LoopN := 1;
+  if xmp_play_buffer(FXMP, Buf, Len, LoopN) = 0 then
     Result := Len;
 end;