From c6da424a1508eae4538244b4d00ddf1f0436b1b7 Mon Sep 17 00:00:00 2001
From: tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Sat, 10 May 2008 12:28:56 +0000
Subject: Volumes are floating point values (single) now. The range changed
 from [0 .. 100] to [0.0 .. 1.0]

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1081 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 Game/Code/Classes/UAudioInput_Bass.pas         | 16 ++++----
 Game/Code/Classes/UAudioInput_Portaudio.pas    | 23 ++++-------
 Game/Code/Classes/UAudioPlaybackBase.pas       | 10 ++---
 Game/Code/Classes/UAudioPlayback_Bass.pas      | 28 +++++++-------
 Game/Code/Classes/UAudioPlayback_SDL.pas       |  8 ++--
 Game/Code/Classes/UAudioPlayback_SoftMixer.pas | 53 +++++++++++++-------------
 Game/Code/Classes/UMedia_dummy.pas             | 12 +++---
 Game/Code/Classes/UMusic.pas                   | 14 +++----
 Game/Code/Classes/URecord.pas                  | 10 ++---
 Game/Code/Screens/UScreenCredits.pas           |  2 +-
 Game/Code/Screens/UScreenEditSub.pas           |  4 +-
 Game/Code/Screens/UScreenOptionsRecord.pas     | 20 ++++++----
 Game/Code/Screens/UScreenSong.pas              | 25 +++++++-----
 13 files changed, 113 insertions(+), 112 deletions(-)

(limited to 'Game')

diff --git a/Game/Code/Classes/UAudioInput_Bass.pas b/Game/Code/Classes/UAudioInput_Bass.pas
index b4d0e52b..d086a23a 100644
--- a/Game/Code/Classes/UAudioInput_Bass.pas
+++ b/Game/Code/Classes/UAudioInput_Bass.pas
@@ -52,8 +52,8 @@ type
       function Start(): boolean; override;
       function Stop(): boolean;  override;
 
-      function GetVolume(): integer;        override;
-      procedure SetVolume(Volume: integer); override;
+      function GetVolume(): single;        override;
+      procedure SetVolume(Volume: single); override;
   end;
 
 var
@@ -270,7 +270,7 @@ begin
   RecordStream := 0;
 end;
 
-function TBassInputDevice.GetVolume(): integer;
+function TBassInputDevice.GetVolume(): single;
 var
   SourceIndex: integer;
   lVolume: Single;
@@ -291,10 +291,10 @@ begin
     Log.LogError('BASS_RecordGetInput: ' + AudioCore.ErrorGetString() , 'TBassInputDevice.GetVolume');
     Exit;
   end;
-  Result := Round(lVolume * 100);
+  Result := lVolume;
 end;
 
-procedure TBassInputDevice.SetVolume(Volume: integer);
+procedure TBassInputDevice.SetVolume(Volume: single);
 var
   SourceIndex: integer;
 begin
@@ -308,12 +308,12 @@ begin
   end;
 
   // clip volume to valid range
-  if (Volume > 100) then
-    Volume := 100
+  if (Volume > 1.0) then
+    Volume := 1.0
   else if (Volume < 0) then
     Volume := 0;
 
-  if (not BASS_RecordSetInput(SourceIndex, 0, Volume/100)) then
+  if (not BASS_RecordSetInput(SourceIndex, 0, Volume)) then
   begin
     Log.LogError('BASS_RecordSetInput: ' + AudioCore.ErrorGetString() , 'TBassInputDevice.SetVolume');
   end;
diff --git a/Game/Code/Classes/UAudioInput_Portaudio.pas b/Game/Code/Classes/UAudioInput_Portaudio.pas
index 183c482d..50543e17 100644
--- a/Game/Code/Classes/UAudioInput_Portaudio.pas
+++ b/Game/Code/Classes/UAudioInput_Portaudio.pas
@@ -51,8 +51,8 @@ type
       function Start(): boolean; override;
       function Stop(): boolean;  override;
 
-      function GetVolume(): integer;        override;
-      procedure SetVolume(Volume: integer); override;
+      function GetVolume(): single;        override;
+      procedure SetVolume(Volume: single); override;
   end;
 
 function MicrophoneCallback(input: Pointer; output: Pointer; frameCount: Longword;
@@ -214,33 +214,26 @@ begin
   RecordStream := nil;
 end;
 
-function TPortaudioInputDevice.GetVolume(): integer;
+function TPortaudioInputDevice.GetVolume(): single;
 begin
   Result := 0;
   {$IFDEF UsePortmixer}
     if (Mixer <> nil) then
-    begin
-      Result := Round(Px_GetInputVolume(Mixer) * 100);
-      // clip to valid range
-      if (Result > 100) then
-        Result := 100
-      else if (Result < 0) then
-        Result := 0;
-    end;
+      Result := Px_GetInputVolume(Mixer);
   {$ENDIF}
 end;
 
-procedure TPortaudioInputDevice.SetVolume(Volume: integer);
+procedure TPortaudioInputDevice.SetVolume(Volume: single);
 begin
   {$IFDEF UsePortmixer}
     if (Mixer <> nil) then
     begin
       // clip to valid range
-      if (Volume > 100) then
-        Volume := 100
+      if (Volume > 1.0) then
+        Volume := 1.0
       else if (Volume < 0) then
         Volume := 0;
-      Px_SetInputVolume(Mixer, Volume / 100);
+      Px_SetInputVolume(Mixer, Volume);
     end;
   {$ENDIF}
 end;
diff --git a/Game/Code/Classes/UAudioPlaybackBase.pas b/Game/Code/Classes/UAudioPlaybackBase.pas
index f1fe26f9..0251b8e8 100644
--- a/Game/Code/Classes/UAudioPlaybackBase.pas
+++ b/Game/Code/Classes/UAudioPlaybackBase.pas
@@ -28,7 +28,7 @@ type
       procedure Play;
       procedure Pause;
       procedure Stop;
-      procedure FadeIn(Time: real; TargetVolume: integer);
+      procedure FadeIn(Time: real; TargetVolume: single);
 
       procedure SetPosition(Time: real);
       function  GetPosition: real;
@@ -39,8 +39,8 @@ type
       //      function SetOutputDevice(Device: TAudioOutputDevice): boolean;
       function GetOutputDeviceList(): TAudioOutputDeviceList;
 
-      procedure SetAppVolume(Volume: integer); virtual; abstract;
-      procedure SetVolume(Volume: integer);
+      procedure SetAppVolume(Volume: single); virtual; abstract;
+      procedure SetVolume(Volume: single);
       procedure SetLoop(Enabled: boolean);
 
       procedure Rewind;
@@ -149,13 +149,13 @@ begin
     Result := true;
 end;
 
-procedure TAudioPlaybackBase.SetVolume(Volume: Integer);
+procedure TAudioPlaybackBase.SetVolume(Volume: single);
 begin
   if assigned(MusicStream) then
     MusicStream.Volume := Volume;
 end;
 
-procedure TAudioPlaybackBase.FadeIn(Time: real; TargetVolume: integer);
+procedure TAudioPlaybackBase.FadeIn(Time: real; TargetVolume: single);
 begin
   if assigned(MusicStream) then
     MusicStream.FadeIn(Time, TargetVolume);
diff --git a/Game/Code/Classes/UAudioPlayback_Bass.pas b/Game/Code/Classes/UAudioPlayback_Bass.pas
index 2667bf6f..53fbd921 100644
--- a/Game/Code/Classes/UAudioPlayback_Bass.pas
+++ b/Game/Code/Classes/UAudioPlayback_Bass.pas
@@ -38,7 +38,7 @@ type
       procedure Play();                     override;
       procedure Pause();                    override;
       procedure Stop();                     override;
-      procedure FadeIn(Time: real; TargetVolume: integer); override;
+      procedure FadeIn(Time: real; TargetVolume: single); override;
 
       procedure Close();                    override;
 
@@ -46,8 +46,8 @@ type
       procedure SetLoop(Enabled: boolean);  override;
       function GetLength(): real;           override;
       function GetStatus(): TStreamStatus;  override;
-      function GetVolume(): integer;        override;
-      procedure SetVolume(volume: integer); override;
+      function GetVolume(): single;         override;
+      procedure SetVolume(volume: single);  override;
 
       procedure AddSoundEffect(effect: TSoundEffect);    override;
       procedure RemoveSoundEffect(effect: TSoundEffect); override;
@@ -83,7 +83,7 @@ type
       function GetName: String; override;
       function InitializePlayback(): boolean; override;
       function FinalizePlayback: boolean; override;
-      procedure SetAppVolume(Volume: integer); override;
+      procedure SetAppVolume(Volume: single); override;
   end;
 
   TBassOutputDevice = class(TAudioOutputDevice)
@@ -132,13 +132,13 @@ begin
   BASS_ChannelPlay(Handle, restart);
 end;
 
-procedure TBassPlaybackStream.FadeIn(Time: real; TargetVolume: integer);
+procedure TBassPlaybackStream.FadeIn(Time: real; TargetVolume: single);
 begin
   // start stream
   BASS_ChannelPlay(Handle, true);
 
   // start fade-in: slide from fadeStart- to fadeEnd-volume in FadeInTime
-  BASS_ChannelSlideAttribute(Handle, BASS_ATTRIB_VOL, TargetVolume/100, Trunc(Time * 1000));
+  BASS_ChannelSlideAttribute(Handle, BASS_ATTRIB_VOL, TargetVolume, Trunc(Time * 1000));
 end;
 
 procedure TBassPlaybackStream.Pause();
@@ -156,7 +156,7 @@ begin
   Reset();
 end;
 
-function TBassPlaybackStream.GetVolume(): integer;
+function TBassPlaybackStream.GetVolume(): single;
 var
   lVolume: single;
 begin
@@ -167,18 +167,18 @@ begin
     Result := 0;
     Exit;
   end;
-  Result := Round(lVolume * 100);
+  Result := Round(lVolume);
 end;
 
-procedure TBassPlaybackStream.SetVolume(volume: integer);
+procedure TBassPlaybackStream.SetVolume(volume: single);
 begin
   // clamp volume
   if volume < 0 then
     volume := 0;
-  if volume > 100 then
-    volume := 100;
+  if volume > 1.0 then
+    volume := 1.0;
   // set volume
-  BASS_ChannelSetAttribute(Handle, BASS_ATTRIB_VOL, volume/100);
+  BASS_ChannelSetAttribute(Handle, BASS_ATTRIB_VOL, volume);
 end;
 
 function TBassPlaybackStream.GetPosition: real;
@@ -576,10 +576,10 @@ begin
   end;
 end;
 
-procedure TAudioPlayback_Bass.SetAppVolume(Volume: integer);
+procedure TAudioPlayback_Bass.SetAppVolume(Volume: single);
 begin
   // Sets Volume only for this Application (now ranges from 0..10000)
-  BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, Volume*100);
+  BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, Round(Volume*10000));
 end;
 
 
diff --git a/Game/Code/Classes/UAudioPlayback_SDL.pas b/Game/Code/Classes/UAudioPlayback_SDL.pas
index ed5a208b..39ecc72f 100644
--- a/Game/Code/Classes/UAudioPlayback_SDL.pas
+++ b/Game/Code/Classes/UAudioPlayback_SDL.pas
@@ -34,7 +34,7 @@ type
       function FinalizeAudioPlaybackEngine(): boolean;   override;
     public
       function GetName: String;                          override;
-      procedure MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer); override;
+      procedure MixBuffers(dst, src: PChar; size: Cardinal; volume: Single); override;
   end;
 
 var
@@ -134,11 +134,9 @@ begin
   Result := true;
 end;
 
-procedure TAudioPlayback_SDL.MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer);
+procedure TAudioPlayback_SDL.MixBuffers(dst, src: PChar; size: Cardinal; volume: Single);
 begin
-  // Note: (volume * SDL_MIX_MAXVOLUME) may exceed High(Integer)
-  //   if SDL_MIX_MAXVOLUME (=128 at the moment) changes
-  SDL_MixAudio(PUInt8(dst), PUInt8(src), size, volume * SDL_MIX_MAXVOLUME div 100);
+  SDL_MixAudio(PUInt8(dst), PUInt8(src), size, Round(volume * SDL_MIX_MAXVOLUME));
 end;
 
 
diff --git a/Game/Code/Classes/UAudioPlayback_SoftMixer.pas b/Game/Code/Classes/UAudioPlayback_SoftMixer.pas
index 431653d0..714e19ae 100644
--- a/Game/Code/Classes/UAudioPlayback_SoftMixer.pas
+++ b/Game/Code/Classes/UAudioPlayback_SoftMixer.pas
@@ -32,14 +32,15 @@ type
 
       Status:   TStreamStatus;
       Loop:     boolean;
-      _volume: integer;
 
       InternalLock: PSDL_Mutex;
 
       SoundEffects: TList;
 
+      _volume: single;
+
       FadeInStartTime, FadeInTime: cardinal;
-      FadeInStartVolume, FadeInTargetVolume: integer;
+      FadeInStartVolume, FadeInTargetVolume: single;
 
       procedure Reset();
 
@@ -57,14 +58,14 @@ type
       procedure Play();                     override;
       procedure Pause();                    override;
       procedure Stop();                     override;
-      procedure FadeIn(Time: real; TargetVolume: integer); override;
+      procedure FadeIn(Time: real; TargetVolume: single); override;
 
       procedure Close();                    override;
 
       function GetLength(): real;           override;
       function GetStatus(): TStreamStatus;  override;
-      function GetVolume(): integer;        override;
-      procedure SetVolume(Volume: integer); override;
+      function GetVolume(): single;         override;
+      procedure SetVolume(Volume: single);  override;
       function GetLoop(): boolean;          override;
       procedure SetLoop(Enabled: boolean);  override;
       function GetPosition: real;           override;
@@ -87,13 +88,13 @@ type
       mixerBuffer: PChar;
       internalLock: PSDL_Mutex;
 
-      appVolume: integer;
+      appVolume: single;
 
       procedure Lock(); {$IFDEF HasInline}inline;{$ENDIF}
       procedure Unlock(); {$IFDEF HasInline}inline;{$ENDIF}
 
-      function GetVolume(): integer;
-      procedure SetVolume(volume: integer);
+      function GetVolume(): single;
+      procedure SetVolume(volume: single);
     public
       constructor Create(Engine: TAudioPlayback_SoftMixer);
       destructor Destroy(); override;
@@ -101,7 +102,7 @@ type
       procedure RemoveStream(stream: TAudioPlaybackStream);
       function ReadData(Buffer: PChar; BufSize: integer): integer;
 
-      property Volume: integer READ GetVolume WRITE SetVolume;
+      property Volume: single READ GetVolume WRITE SetVolume;
   end;
 
   TAudioPlayback_SoftMixer = class(TAudioPlaybackBase)
@@ -122,12 +123,12 @@ type
       function InitializePlayback(): boolean; override;
       function FinalizePlayback: boolean; override;
 
-      procedure SetAppVolume(Volume: integer); override;
+      procedure SetAppVolume(Volume: single); override;
 
       function GetMixer(): TAudioMixerStream; {$IFDEF HasInline}inline;{$ENDIF}
       function GetAudioFormatInfo(): TAudioFormatInfo;
 
-      procedure MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer); virtual;
+      procedure MixBuffers(dst, src: PChar; size: Cardinal; volume: Single); virtual;
   end;
 
 implementation
@@ -150,7 +151,7 @@ begin
 
   activeStreams := TList.Create;
   internalLock := SDL_CreateMutex();
-  appVolume := 100;
+  appVolume := 1.0;
 end;
 
 destructor TAudioMixerStream.Destroy();
@@ -172,14 +173,14 @@ begin
   SDL_mutexV(internalLock);
 end;
 
-function TAudioMixerStream.GetVolume(): integer;
+function TAudioMixerStream.GetVolume(): single;
 begin
   Lock();
   result := appVolume;
   Unlock();
 end;
 
-procedure TAudioMixerStream.SetVolume(volume: integer);
+procedure TAudioMixerStream.SetVolume(volume: single);
 begin
   Lock();
   appVolume := volume;
@@ -257,7 +258,7 @@ begin
     begin
       // mix stream-data with mixer-buffer
       // Note: use Self.appVolume instead of Self.Volume to prevent recursive locking
-      Engine.MixBuffers(Buffer, mixerBuffer, size, appVolume * stream.Volume div 100);
+      Engine.MixBuffers(Buffer, mixerBuffer, size, appVolume * stream.Volume);
     end;
   end;
 
@@ -388,7 +389,7 @@ begin
   if not InitFormatConversion() then
     Exit;
 
-  _volume := 100;
+  _volume := 1.0;
 
   result := true;
 end;
@@ -415,7 +416,7 @@ begin
     mixer.AddStream(Self);
 end;
 
-procedure TGenericPlaybackStream.FadeIn(Time: real; TargetVolume: integer);
+procedure TGenericPlaybackStream.FadeIn(Time: real; TargetVolume: single);
 begin
   FadeInTime := Trunc(Time * 1000);
   FadeInStartTime := SDL_GetTicks();
@@ -726,7 +727,7 @@ begin
     DecodeStream.Position := Time;
 end;
 
-function TGenericPlaybackStream.GetVolume(): integer;
+function TGenericPlaybackStream.GetVolume(): single;
 var
   FadeAmount: Single;
 begin
@@ -745,7 +746,7 @@ begin
     else
     begin
       // fading in progress
-      _volume := Trunc(FadeAmount*FadeInTargetVolume + (1-FadeAmount)*FadeInStartVolume);
+      _volume := FadeAmount*FadeInTargetVolume + (1-FadeAmount)*FadeInStartVolume;
     end;
   end;
   // return current volume
@@ -753,14 +754,14 @@ begin
   Unlock();
 end;
 
-procedure TGenericPlaybackStream.SetVolume(volume: integer);
+procedure TGenericPlaybackStream.SetVolume(volume: single);
 begin
   Lock();
   // stop fading
   FadeInTime := 0;
   // clamp volume
-  if (volume > 100) then
-    _volume := 100
+  if (volume > 1.0) then
+    _volume := 1.0
   else if (volume < 0) then
     _volume := 0
   else
@@ -850,13 +851,13 @@ begin
   result := playbackStream;
 end;
 
-procedure TAudioPlayback_SoftMixer.SetAppVolume(Volume: integer);
+procedure TAudioPlayback_SoftMixer.SetAppVolume(Volume: single);
 begin
   // sets volume only for this application
   MixerStream.Volume := Volume;
 end;
 
-procedure TAudioPlayback_SoftMixer.MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer);
+procedure TAudioPlayback_SoftMixer.MixBuffers(dst, src: PChar; size: Cardinal; volume: Single);
 var
   SampleIndex: Cardinal;
   SampleInt: Integer;
@@ -872,7 +873,7 @@ begin
       while (SampleIndex < size) do
       begin
         // apply volume and sum with previous mixer value
-        SampleInt := PSmallInt(@dst[SampleIndex])^ + PSmallInt(@src[SampleIndex])^ * volume div 100;
+        SampleInt := PSmallInt(@dst[SampleIndex])^ + Round(PSmallInt(@src[SampleIndex])^ * volume);
         // clip result
         if (SampleInt > High(SmallInt)) then
           SampleInt := High(SmallInt)
@@ -889,7 +890,7 @@ begin
       while (SampleIndex < size) do
       begin
         // apply volume and sum with previous mixer value
-        SampleFlt := PSingle(@dst[SampleIndex])^ + PSingle(@src[SampleIndex])^ * volume/100;
+        SampleFlt := PSingle(@dst[SampleIndex])^ + PSingle(@src[SampleIndex])^ * volume;
         // clip result
         if (SampleFlt > 1.0) then
           SampleFlt := 1.0
diff --git a/Game/Code/Classes/UMedia_dummy.pas b/Game/Code/Classes/UMedia_dummy.pas
index ad3aa94e..bb25a0aa 100644
--- a/Game/Code/Classes/UMedia_dummy.pas
+++ b/Game/Code/Classes/UMedia_dummy.pas
@@ -65,9 +65,9 @@ type
       function FinalizePlayback: boolean;
 
       function GetOutputDeviceList(): TAudioOutputDeviceList;
-      procedure FadeIn(Time: real; TargetVolume: integer);
-      procedure SetAppVolume(Volume: integer);
-      procedure SetVolume(Volume: integer);
+      procedure FadeIn(Time: real; TargetVolume: single);
+      procedure SetAppVolume(Volume: single);
+      procedure SetVolume(Volume: single);
       procedure SetLoop(Enabled: boolean);
       procedure Rewind;
 
@@ -182,11 +182,11 @@ begin
   Result := DummyOutputDeviceList;
 end;
 
-procedure Tmedia_dummy.SetAppVolume(Volume: integer);
+procedure Tmedia_dummy.SetAppVolume(Volume: single);
 begin
 end;
 
-procedure Tmedia_dummy.SetVolume(Volume: integer);
+procedure Tmedia_dummy.SetVolume(Volume: single);
 begin
 end;
 
@@ -194,7 +194,7 @@ procedure Tmedia_dummy.SetLoop(Enabled: boolean);
 begin
 end;
 
-procedure Tmedia_dummy.FadeIn(Time: real; TargetVolume: integer);
+procedure Tmedia_dummy.FadeIn(Time: real; TargetVolume: single);
 begin
 end;
 
diff --git a/Game/Code/Classes/UMusic.pas b/Game/Code/Classes/UMusic.pas
index 9977661f..9c029acd 100644
--- a/Game/Code/Classes/UMusic.pas
+++ b/Game/Code/Classes/UMusic.pas
@@ -148,15 +148,15 @@ type
       procedure SetPosition(Time: real);    virtual; abstract;
       function GetLength(): real;           virtual; abstract;
       function GetStatus(): TStreamStatus;  virtual; abstract;
-      function GetVolume(): integer;        virtual; abstract;
-      procedure SetVolume(Volume: integer); virtual; abstract;
+      function GetVolume(): single;         virtual; abstract;
+      procedure SetVolume(Volume: single);  virtual; abstract;
       function GetLoop(): boolean;          virtual; abstract;
       procedure SetLoop(Enabled: boolean);  virtual; abstract;
     public
       procedure Play();                     virtual; abstract;
       procedure Pause();                    virtual; abstract;
       procedure Stop();                     virtual; abstract;
-      procedure FadeIn(Time: real; TargetVolume: integer);  virtual; abstract;
+      procedure FadeIn(Time: real; TargetVolume: single);  virtual; abstract;
 
       procedure GetFFTData(var data: TFFTData);          virtual; abstract;
       function GetPCMData(var data: TPCMData): Cardinal; virtual; abstract;
@@ -167,7 +167,7 @@ type
       property Length: real READ GetLength;
       property Position: real READ GetPosition WRITE SetPosition;
       property Status: TStreamStatus READ GetStatus;
-      property Volume: integer READ GetVolume WRITE SetVolume;
+      property Volume: single READ GetVolume WRITE SetVolume;
       property Loop: boolean READ GetLoop WRITE SetLoop;
   end;
 
@@ -237,10 +237,10 @@ type
       function FinalizePlayback: boolean;
       
       function GetOutputDeviceList(): TAudioOutputDeviceList;
-      procedure SetAppVolume(Volume: integer);
-      procedure SetVolume(Volume: integer);
+      procedure SetAppVolume(Volume: single);
+      procedure SetVolume(Volume: single);
       procedure SetLoop(Enabled: boolean);
-      procedure FadeIn(Time: real; TargetVolume: integer);
+      procedure FadeIn(Time: real; TargetVolume: single);
 
       procedure Rewind;
       function  Finished: boolean;
diff --git a/Game/Code/Classes/URecord.pas b/Game/Code/Classes/URecord.pas
index 55dedd1f..6d24e0f4 100644
--- a/Game/Code/Classes/URecord.pas
+++ b/Game/Code/Classes/URecord.pas
@@ -85,8 +85,8 @@ type
       function Start(): boolean; virtual; abstract;
       function Stop(): boolean;  virtual; abstract;
 
-      function GetVolume(): integer;        virtual; abstract;
-      procedure SetVolume(Volume: integer); virtual; abstract;
+      function GetVolume(): single;        virtual; abstract;
+      procedure SetVolume(Volume: single); virtual; abstract;
   end;
 
   TAudioInputProcessor = class
@@ -247,10 +247,10 @@ end;
 
 procedure TCaptureBuffer.AnalyzeBuffer;
 var
-  Volume:    real;
-  MaxVolume: real;
+  Volume:    single;
+  MaxVolume: single;
   SampleIndex: integer;
-  Threshold: real;
+  Threshold: single;
 begin
   ToneValid := false;
   ToneAbs := -1;
diff --git a/Game/Code/Screens/UScreenCredits.pas b/Game/Code/Screens/UScreenCredits.pas
index ce3b6046..f7f1fca7 100644
--- a/Game/Code/Screens/UScreenCredits.pas
+++ b/Game/Code/Screens/UScreenCredits.pas
@@ -1309,7 +1309,7 @@ Log.LogStatus('',' JB-4');
         CTime_hold:=0;
         AudioPlayback.Stop;
         AudioPlayback.Open(soundpath + 'credits-outro-tune.mp3');
-        AudioPlayback.SetVolume(20);
+        AudioPlayback.SetVolume(0.2);
         AudioPlayback.SetLoop(True);
         AudioPlayback.Play;
       end;
diff --git a/Game/Code/Screens/UScreenEditSub.pas b/Game/Code/Screens/UScreenEditSub.pas
index 0a80af8b..3bf57692 100644
--- a/Game/Code/Screens/UScreenEditSub.pas
+++ b/Game/Code/Screens/UScreenEditSub.pas
@@ -1174,7 +1174,7 @@ begin
     Lines[0].Line[0].Note[0].Color := 1;
     AudioPlayback.Open(CurrentSong.Path + CurrentSong.Mp3);
     //Set Down Music Volume for Better hearability of Midi Sounds
-    //Music.SetVolume(40);
+    //Music.SetVolume(0.4);
 
     Lyric.Clear;
     Lyric.X := 400;
@@ -1315,7 +1315,7 @@ begin
   MidiOut.Close;
   MidiOut.Free;
   {$ENDIF}
-  //Music.SetVolume(100);
+  //Music.SetVolume(1.0);
 end;
 
 function TScreenEditSub.GetNoteName(Note: Integer): String;
diff --git a/Game/Code/Screens/UScreenOptionsRecord.pas b/Game/Code/Screens/UScreenOptionsRecord.pas
index 8e3d0f67..8db5ede9 100644
--- a/Game/Code/Screens/UScreenOptionsRecord.pas
+++ b/Game/Code/Screens/UScreenOptionsRecord.pas
@@ -64,7 +64,7 @@ type
       procedure StartPreview;
       procedure StopPreview;
       procedure UpdateInputDevice;
-      procedure ChangeVolume(VolumeChange: integer);
+      procedure ChangeVolume(VolumeChange: single);
       procedure DrawVolume(x, y, Width, Height: single);
       procedure DrawVUMeter(const State: TDrawState; x, y, Width, Height: single);
       procedure DrawPitch(const State: TDrawState; x, y, Width, Height: single);
@@ -119,13 +119,13 @@ begin
         begin
           // FIXME: add a nice volume-slider instead
           // or at least provide visualization and acceleration if the user holds the key pressed.
-          ChangeVolume(2);
+          ChangeVolume(0.02);
         end;
       '-':
         begin
           // FIXME: add a nice volume-slider instead
           // or at least provide visualization and acceleration if the user holds the key pressed.
-          ChangeVolume(-2);
+          ChangeVolume(-0.02);
         end;
       'T':
         begin
@@ -203,6 +203,8 @@ begin
 
   PreviewDeviceIndex := -1;
 
+  WidgetYPos := 0;
+
   // init sliders if at least one device was detected
   if (Length(AudioInputProcessor.DeviceList) > 0) then
   begin
@@ -292,7 +294,9 @@ begin
 
   // add Exit-button
   ButtonTheme := Theme.OptionsRecord.ButtonExit;
-  ButtonTheme.Y := WidgetYPos;
+  // adjust button position
+  if (WidgetYPos <> 0) then
+    ButtonTheme.Y := WidgetYPos;
   AddButton(ButtonTheme);
   if (Length(Button[0].Text) = 0) then
     AddButtonText(14, 20, Theme.Options.Description[7]);
@@ -372,10 +376,10 @@ begin
   StartPreview();
 end;
 
-procedure TScreenOptionsRecord.ChangeVolume(VolumeChange: integer);
+procedure TScreenOptionsRecord.ChangeVolume(VolumeChange: single);
 var
   InputDevice: TAudioInputDevice;
-  Volume: integer;
+  Volume: single;
 begin
   // validate CurrentDeviceIndex
   if ((CurrentDeviceIndex < 0) or
@@ -391,7 +395,7 @@ begin
   // set new volume
   Volume := InputDevice.GetVolume() + VolumeChange;
   InputDevice.SetVolume(Volume);
-  //DebugWriteln('Volume: ' + inttostr(InputDevice.GetVolume));
+  //DebugWriteln('Volume: ' + floattostr(InputDevice.GetVolume));
 
   // volume must be polled again 
   NextVolumePollTime := 0;
@@ -700,7 +704,7 @@ begin
     if (SDL_GetTicks() >= NextVolumePollTime) then
     begin
       NextVolumePollTime := SDL_GetTicks() + 500; // next poll in 500ms
-      SourceVolume := Device.GetVolume()/100;
+      SourceVolume := Device.GetVolume();
     end;
 
     // get source select slide
diff --git a/Game/Code/Screens/UScreenSong.pas b/Game/Code/Screens/UScreenSong.pas
index 82d5100a..06314bcd 100644
--- a/Game/Code/Screens/UScreenSong.pas
+++ b/Game/Code/Screens/UScreenSong.pas
@@ -1497,17 +1497,21 @@ end;
 
 procedure TScreenSong.onHide;
 begin
-  //When Music Fading is activated, Turn Music to 100 %
-  If (Ini.PreviewVolume <> 100) or (Ini.PreviewFading <> 0) then
-    AudioPlayback.SetVolume(100);
+  // if music fading is activated, turn music to 100%
+  If (IPreviewVolumeVals[Ini.PreviewVolume] <> 1.0) or (Ini.PreviewFading <> 0) then
+    AudioPlayback.SetVolume(1.0);
 
-  //If Preview is deactivated: Load MUsicfile now
-  If (Ini.PreviewVolume = 0) then
+  // if preview is deactivated: load musicfile now
+  If (IPreviewVolumeVals[Ini.PreviewVolume] = 0) then
     AudioPlayback.Open(CatSongs.Song[Interaction].Path + CatSongs.Song[Interaction].Mp3);
 
-  //When hide then Stop Music (For Party Mode Popup on Exit)
-  if (Display.NextScreen <> @ScreenSing) and (Display.NextScreen <> @ScreenSingModi) and (AudioPlayback <> nil) then
-    AudioPlayback.Stop;
+  // if hide then stop music (for party mode popup on exit)
+  if (Display.NextScreen <> @ScreenSing) and
+     (Display.NextScreen <> @ScreenSingModi) then
+  begin
+    if (AudioPlayback <> nil) then
+      AudioPlayback.Stop;
+  end;
 end;
 
 procedure TScreenSong.DrawExtensions;
@@ -1613,6 +1617,7 @@ begin
 
   DrawExtensions;
 
+  Result := true;
 end;
 
 procedure TScreenSong.SelectNext;
@@ -1701,14 +1706,14 @@ begin
     if (Ini.PreviewFading = 0) then
     begin
       // music fade disabled: start with full volume
-      AudioPlayback.SetVolume(Ini.PreviewVolume * 10);
+      AudioPlayback.SetVolume(IPreviewVolumeVals[Ini.PreviewVolume]);
       AudioPlayback.Play()
     end
     else
     begin
       // music fade enabled: start muted and fade-in
       AudioPlayback.SetVolume(0);
-      AudioPlayback.FadeIn(Ini.PreviewFading, Ini.PreviewVolume * 10);
+      AudioPlayback.FadeIn(Ini.PreviewFading, IPreviewVolumeVals[Ini.PreviewVolume]);
     end;
   end;
 end;
-- 
cgit v1.2.3