DEADSOFTWARE

Sound: OpenAL: Streams can now be non-looping; XMP tweaks
authorfgsfds <pvt.fgsfds@gmail.com>
Sun, 1 Sep 2019 00:01:27 +0000 (03:01 +0300)
committerfgsfds <pvt.fgsfds@gmail.com>
Sun, 1 Sep 2019 00:01:27 +0000 (03:01 +0300)
src/engine/e_sound_al.inc
src/engine/e_soundfile.pas
src/engine/e_soundfile_xmp.pas

index dfe5919ea8ef52f374a57939a80ecc6ce474ca7e..312b701bed68abae6a4cc1c31cfffd0cd2fed1bb 100644 (file)
@@ -329,6 +329,7 @@ begin
   end
   else
   begin
+    Loader.Looping := e_SoundsArray[find_id].Loops;
     e_SoundsArray[find_id].alBuffer := 0;
     e_SoundsArray[find_id].Loader := Loader;
   end;
@@ -402,6 +403,7 @@ begin
   end
   else
   begin
+    Loader.Looping := e_SoundsArray[find_id].Loops;
     e_SoundsArray[find_id].alBuffer := 0;
     e_SoundsArray[find_id].Loader := Loader;
   end;
index 919715c5dea3dc3da6a7a9242748b10e5af7f87a..6cae52c6a5739335df7329212bfed65d266f09cf 100644 (file)
@@ -34,6 +34,7 @@ type
   protected
     FFormat: TSoundFormat;
     FStreaming: Boolean;
+    FLooping: Boolean;
 
   public
     function Load(Data: Pointer; Len: LongWord; SStreaming: Boolean): Boolean; virtual; abstract; overload;
@@ -48,6 +49,7 @@ type
 
     property Format: TSoundFormat read FFormat;
     property Streaming: Boolean read FStreaming;
+    property Looping: Boolean read FLooping write FLooping;
   end;
 
   TSoundLoaderFactory = class
index aaf1df194d3b1904f25ff6993d6e5beab46d503f..33c902f9618b1fa8b0fc1982b49f1d8b147aea58 100644 (file)
@@ -100,10 +100,10 @@ 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;
+    FFormat.SampleRate := 48000;
     FFormat.SampleBits := 16;
     FFormat.Channels := 2;
 
@@ -136,10 +136,10 @@ 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;
+    FFormat.SampleRate := 48000;
     FFormat.SampleBits := 16;
     FFormat.Channels := 2;
 
@@ -165,10 +165,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;