foxygit / doom Log in
commit 4b598f3d40e34b5d786c9236f891fbe2337c1b66
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Sun Sep 20 21:25:59 2009 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Sun Sep 20 21:25:59 2009 +0000

    Implement volume control.

    Subversion-branch: /branches/opl-branch
    Subversion-revision: 1685
---
 OPL-TODO         |  1 -
 src/i_oplmusic.c | 16 +++++++++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/OPL-TODO b/OPL-TODO
index 8ca6a4b5..7b9be01c 100644
--- a/OPL-TODO
+++ b/OPL-TODO
@@ -15,7 +15,6 @@ Bad MIDIs:

 Other tasks:

- * Menu volume control
  * Pause music
  * Add option to select MIDI type in setup tool

diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c
index b8e93534..4ac52754 100644
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -651,7 +651,8 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume)
     // Multiply note volume and channel volume to get the actual volume.

     full_volume = (volume_mapping_table[voice->note_volume]
-                   * volume_mapping_table[voice->channel->volume]) / 127;
+                   * volume_mapping_table[voice->channel->volume]
+                   * volume_mapping_table[current_music_volume]) / (127 * 127);

     // The volume of each instrument can be controlled via GENMIDI:

@@ -769,8 +770,21 @@ static boolean I_OPL_InitMusic(void)

 static void I_OPL_SetMusicVolume(int volume)
 {
+    unsigned int i;
+
     // Internal state variable.
+
     current_music_volume = volume;
+
+    // Update the volume of all voices.
+
+    for (i=0; i<OPL_NUM_VOICES; ++i)
+    {
+        if (voices[i].channel != NULL)
+        {
+            SetVoiceVolume(&voices[i], voices[i].note_volume);
+        }
+    }
 }

 static void VoiceKeyOff(opl_voice_t *voice)