diff options
author | Wohlstand <admin@wohlnet.ru> | 2024-08-22 18:26:45 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2024-08-22 18:26:45 +0300 |
commit | b00d3f8d933fc7de26b954bedf841cb484139562 (patch) | |
tree | f2a7d6b2ee45cece57fdbe78a944b41c459a5c0a /utils/winmm_drv/src | |
parent | c68dc6970d5b4abab13e138ac977f7212ef32e4a (diff) | |
download | libADLMIDI-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.cpp | 39 | ||||
-rw-r--r-- | utils/winmm_drv/src/MidiSynth.h | 7 | ||||
-rw-r--r-- | utils/winmm_drv/src/winmm_drv.cpp | 21 |
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; |