OSDN Git Service

[VM][FMTOWNS][MB87078] E-Volume: Maybe fixed terrible sound (with CD-DA).Need more...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 26 Sep 2021 04:08:43 +0000 (13:08 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 26 Sep 2021 04:08:43 +0000 (13:08 +0900)
source/src/vm/fmtowns/fmtowns.cpp
source/src/vm/fmtowns/mb87078.cpp
source/src/vm/fmtowns/mb87078.h

index 800673d..9552550 100644 (file)
@@ -370,13 +370,13 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu)
 //     e_volumes[0]->set_context_device(1, line_in, 0,
 //                                                                      MB87078_TYPE_MASK_RIGHT);
        e_volumes[1]->set_context_device(0, cdrom, 0,
-                                                                        MB87078_TYPE_MASK_LEFT, SIG_TOWNS_CDROM_MUTE_L,
+                                                                        MB87078_TYPE_SET_LEFT, SIG_TOWNS_CDROM_MUTE_L,
                                                                         0xffffffff,
                                                                         0xffffffff,
                                                                         false
                );
        e_volumes[1]->set_context_device(1, cdrom, 0,
-                                                                        MB87078_TYPE_MASK_RIGHT, SIG_TOWNS_CDROM_MUTE_R,
+                                                                        MB87078_TYPE_SET_RIGHT, SIG_TOWNS_CDROM_MUTE_R,
                                                                         0xffffffff,
                                                                         0xffffffff,
                                                                         false
index 8696170..282eb37 100644 (file)
@@ -86,15 +86,15 @@ void MB87078::set_volume_internal(int ch, int vol, bool _force)
                        switch(channels[ch].channelmask & 3) {
                        case 0:  // NONE
                                break;
-                       case MB87078_TYPE_MASK_LEFT: //
-                               left = vol + left;
+                       case MB87078_TYPE_SET_LEFT: //
+                               left = channels[ch].extvalue + vol;
                                break;  
-                       case MB87078_TYPE_MASK_RIGHT: //
-                               right = vol + right;
+                       case MB87078_TYPE_SET_RIGHT: //
+                               right = channels[ch].extvalue + vol;
                                break;
-                       case MB87078_TYPE_MASK_CENTER: //
-                               right = vol + right;
-                               left = vol + left;
+                       case MB87078_TYPE_SET_CENTER: //
+                               left = channels[ch].extvalue + vol;
+                               right = left;
                                break;
                        }
                        channels[ch].dev->set_volume(channels[ch].devch, left, right);
@@ -118,8 +118,11 @@ void MB87078::device_reset()
 void MB87078::set_volume_per_channel(int ch, int db)
 {
        if((ch >= 0) && (ch < 4)) {
+               int bak_db = channels[ch].extvalue;
                channels[ch].extvalue = db;
-               set_volume_internal(ch, channels[ch].intvalue, true);
+               if(bak_db != db) {
+                       set_volume_internal(ch, channels[ch].intvalue, true);
+               }
        }
 }
 
index 6bd56da..ca70a17 100644 (file)
@@ -10,9 +10,9 @@
 
 #include "device.h"
 
-#define MB87078_TYPE_MASK_LEFT         0x01
-#define MB87078_TYPE_MASK_RIGHT                0x02
-#define MB87078_TYPE_MASK_CENTER       (MB87078_TYPE_MASK_LEFT | MB87078_TYPE_MASK_RIGHT)
+#define MB87078_TYPE_SET_LEFT          0x01
+#define MB87078_TYPE_SET_RIGHT         0x02
+#define MB87078_TYPE_SET_CENTER        (MB87078_TYPE_SET_LEFT | MB87078_TYPE_SET_RIGHT)
        
 class MB87078 : public DEVICE {
 protected: