aboutsummaryrefslogtreecommitdiff
path: root/utils/winmm_drv/src
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2024-08-22 18:26:45 +0300
committerWohlstand <admin@wohlnet.ru>2024-08-22 18:26:45 +0300
commitb00d3f8d933fc7de26b954bedf841cb484139562 (patch)
treef2a7d6b2ee45cece57fdbe78a944b41c459a5c0a /utils/winmm_drv/src
parentc68dc6970d5b4abab13e138ac977f7212ef32e4a (diff)
downloadlibADLMIDI-b00d3f8d933fc7de26b954bedf841cb484139562.tar.gz
libADLMIDI-b00d3f8d933fc7de26b954bedf841cb484139562.tar.bz2
libADLMIDI-b00d3f8d933fc7de26b954bedf841cb484139562.zip
WinMM: Added gaining function
Diffstat (limited to 'utils/winmm_drv/src')
-rw-r--r--utils/winmm_drv/src/MidiSynth.cpp39
-rw-r--r--utils/winmm_drv/src/MidiSynth.h7
-rw-r--r--utils/winmm_drv/src/winmm_drv.cpp21
3 files changed, 60 insertions, 7 deletions
diff --git a/utils/winmm_drv/src/MidiSynth.cpp b/utils/winmm_drv/src/MidiSynth.cpp
index a03ee42..e559a4f 100644
--- a/utils/winmm_drv/src/MidiSynth.cpp
+++ b/utils/winmm_drv/src/MidiSynth.cpp
@@ -464,6 +464,16 @@ void MidiSynth::Render(float *bufpos, DWORD totalFrames)
adl_generateFormat(synth, framesToRender * s_audioChannels,
(ADL_UInt8*)bufpos, (ADL_UInt8*)bufpos + synthAudioFormat.containerSize,
&synthAudioFormat);
+
+ // Apply the volume
+ float g_l = volumeFactorL * gain;
+ float g_r = volumeFactorR * gain;
+ for(size_t i = 0; i < framesToRender * s_audioChannels; i += s_audioChannels)
+ {
+ bufpos[i + 0] *= g_l;
+ bufpos[i + 1] *= g_r;
+ }
+
synthEvent.Release();
framesRendered += framesToRender;
bufpos += s_audioChannels * framesToRender; // each frame consists of two samples for both the Left and Right channels
@@ -484,15 +494,19 @@ void MidiSynth::CheckForSignals()
switch(cmd)
{
- case 1: // Reload settings on the fly
+ case DRV_SIGNAL_RELOAD_SETUP: // Reload settings on the fly
this->loadSetup();
LoadSynthSetup();
break;
- case 2:
+ case DRV_SIGNAL_RESET_SYNTH:
adl_reset(synth);
break;
+ case DRV_SIGNAL_UPDATE_GAIN:
+ this->loadGain();
+ break;
+
default:
break;
}
@@ -513,6 +527,9 @@ void MidiSynth::LoadSettings()
chunkSize = MillisToFrames(10);
midiLatency = MillisToFrames(0);
useRingBuffer = false;
+ volumeFactorL = 1.0f;
+ volumeFactorR = 1.0f;
+ gain = 1.0f;
if(!useRingBuffer)
{
@@ -621,9 +638,27 @@ void MidiSynth::PlaySysex(Bit8u *bufpos, DWORD len)
synthEvent.Release();
}
+void MidiSynth::SetVolume(DWORD vol)
+{
+ volumeFactorR = (float)0xFFFF / HIWORD(vol);
+ volumeFactorL = (float)0xFFFF / LOWORD(vol);
+}
+
+DWORD MidiSynth::GetVolume()
+{
+ return MAKELONG((DWORD)(0xFFFF * volumeFactorL), (DWORD)(0xFFFF * volumeFactorR));
+}
+
void MidiSynth::loadSetup()
{
::loadSetup(&m_setup);
+ gain = (float)m_setup.gain100 / 100.f;
+}
+
+void MidiSynth::loadGain()
+{
+ ::getGain(&m_setup);
+ gain = (float)m_setup.gain100 / 100.f;
}
void MidiSynth::LoadSynthSetup()
diff --git a/utils/winmm_drv/src/MidiSynth.h b/utils/winmm_drv/src/MidiSynth.h
index a590a77..0442f7b 100644
--- a/utils/winmm_drv/src/MidiSynth.h
+++ b/utils/winmm_drv/src/MidiSynth.h
@@ -52,6 +52,9 @@ private:
Bit8u reverbMode;
Bit8u reverbTime;
Bit8u reverbLevel;
+ float volumeFactorL;
+ float volumeFactorR;
+ float gain;
float *buffer;
DWORD framesRendered;
@@ -82,7 +85,11 @@ public:
void PushMIDI(DWORD msg);
void PlaySysex(Bit8u *bufpos, DWORD len);
+ void SetVolume(DWORD vol);
+ DWORD GetVolume();
+
void loadSetup();
+ void loadGain();
void LoadSynthSetup();
};
diff --git a/utils/winmm_drv/src/winmm_drv.cpp b/utils/winmm_drv/src/winmm_drv.cpp
index 7f65dda..9baa56a 100644
--- a/utils/winmm_drv/src/winmm_drv.cpp
+++ b/utils/winmm_drv/src/winmm_drv.cpp
@@ -201,6 +201,7 @@ EXTERN_C HRESULT modGetCaps(PVOID capsPtr, DWORD capsSize)
CHAR synthName[] = "libADLMIDI synth\0";
WCHAR synthNameW[] = L"libADLMIDI synth\0";
+ DWORD support = MIDICAPS_VOLUME | MIDICAPS_LRVOLUME;
switch(capsSize)
{
@@ -214,7 +215,7 @@ EXTERN_C HRESULT modGetCaps(PVOID capsPtr, DWORD capsSize)
myCapsA->wVoices = 0;
myCapsA->wNotes = 0;
myCapsA->wChannelMask = 0xffff;
- myCapsA->dwSupport = 0;
+ myCapsA->dwSupport = support;
return MMSYSERR_NOERROR;
case(sizeof(MIDIOUTCAPSW)):
@@ -227,7 +228,7 @@ EXTERN_C HRESULT modGetCaps(PVOID capsPtr, DWORD capsSize)
myCapsW->wVoices = 0;
myCapsW->wNotes = 0;
myCapsW->wChannelMask = 0xffff;
- myCapsW->dwSupport = 0;
+ myCapsW->dwSupport = support;
return MMSYSERR_NOERROR;
case(sizeof(MIDIOUTCAPS2A)):
@@ -240,7 +241,7 @@ EXTERN_C HRESULT modGetCaps(PVOID capsPtr, DWORD capsSize)
myCaps2A->wVoices = 0;
myCaps2A->wNotes = 0;
myCaps2A->wChannelMask = 0xffff;
- myCaps2A->dwSupport = 0;
+ myCaps2A->dwSupport = support;
return MMSYSERR_NOERROR;
case(sizeof(MIDIOUTCAPS2W)):
@@ -253,7 +254,7 @@ EXTERN_C HRESULT modGetCaps(PVOID capsPtr, DWORD capsSize)
myCaps2W->wVoices = 0;
myCaps2W->wNotes = 0;
myCaps2W->wChannelMask = 0xffff;
- myCaps2W->dwSupport = 0;
+ myCaps2W->dwSupport = support;
return MMSYSERR_NOERROR;
default:
@@ -316,7 +317,8 @@ LONG CloseDriver(Driver *driver, UINT uDeviceID, UINT uMsg, DWORD_PTR dwUser, DW
return MMSYSERR_NOERROR;
}
-EXTERN_C DWORD __declspec(dllexport) __stdcall modMessage(DWORD uDeviceID, DWORD uMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+EXTERN_C DWORD __declspec(dllexport) __stdcall
+modMessage(DWORD uDeviceID, DWORD uMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
MIDIHDR *midiHdr;
Driver *driver = &drivers[uDeviceID];
@@ -377,6 +379,15 @@ EXTERN_C DWORD __declspec(dllexport) __stdcall modMessage(DWORD uDeviceID, DWORD
DoCallback(uDeviceID, dwUser, MOM_DONE, dwParam1, (DWORD_PTR)NULL);
return MMSYSERR_NOERROR;
+ case MODM_GETVOLUME:
+ if(dwParam1)
+ *(DWORD *)dwParam1 = midiSynth.GetVolume();
+ return MMSYSERR_NOERROR;
+
+ case MODM_SETVOLUME:
+ midiSynth.SetVolume(dwParam1);
+ return MMSYSERR_NOERROR;
+
case MODM_GETNUMDEVS:
return 0x1;