diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2012-07-09 16:30:00 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2012-07-09 17:55:16 +0400 |
commit | 1fd321543daa411f89b6ae041c1e2bdc9140f240 (patch) | |
tree | bcf20df18eec6888aa3426242d2f12a2bd8c34a6 /decoder/LAVAudio | |
parent | dbea5a9c82b23728f1eb30d53816600e2ad4af59 (diff) |
Add options for controlling the center/surround/lfe mixing levels
Diffstat (limited to 'decoder/LAVAudio')
-rw-r--r-- | decoder/LAVAudio/AudioSettingsProp.cpp | 50 | ||||
-rw-r--r-- | decoder/LAVAudio/AudioSettingsProp.h | 3 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudio.cpp | 39 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudio.h | 5 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudio.rc | 12 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudioSettings.h | 4 | ||||
-rw-r--r-- | decoder/LAVAudio/PostProcessor.cpp | 5 | ||||
-rw-r--r-- | decoder/LAVAudio/resource.h | 12 |
8 files changed, 127 insertions, 3 deletions
diff --git a/decoder/LAVAudio/AudioSettingsProp.cpp b/decoder/LAVAudio/AudioSettingsProp.cpp index e6fd697d..48665397 100644 --- a/decoder/LAVAudio/AudioSettingsProp.cpp +++ b/decoder/LAVAudio/AudioSettingsProp.cpp @@ -399,6 +399,11 @@ HRESULT CLAVAudioMixingProp::OnApplyChanges() BOOL bDPL2 = (BOOL)SendDlgItemMessage(m_Dlg, IDC_MIXMODE_DPL2, BM_GETCHECK, 0, 0); m_pAudioSettings->SetMixingMode(bDolby ? MatrixEncoding_Dolby : (bDPL2 ? MatrixEncoding_DPLII : MatrixEncoding_None)); + DWORD dwMixCenter = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER, TBM_GETPOS, 0, 0); + DWORD dwMixSurround = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND, TBM_GETPOS, 0, 0); + DWORD dwMixLFE = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE, TBM_GETPOS, 0, 0); + m_pAudioSettings->SetMixingLevels(dwMixCenter, dwMixSurround, dwMixLFE); + LoadData(); return hr; @@ -429,6 +434,13 @@ HRESULT CLAVAudioMixingProp::OnActivate() SendDlgItemMessage(m_Dlg, IDC_OUTPUT_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)spk61Surround); SendDlgItemMessage(m_Dlg, IDC_OUTPUT_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)spk71Surround); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER, TBM_SETRANGE, 0, MAKELONG(0, 10000)); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER, TBM_SETTICFREQ, 100, 0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND, TBM_SETRANGE, 0, MAKELONG(0, 10000)); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND, TBM_SETTICFREQ, 100, 0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE, TBM_SETRANGE, 0, MAKELONG(0, 10000)); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE, TBM_SETTICFREQ, 100, 0); + hr = LoadData(); if (SUCCEEDED(hr)) { SendDlgItemMessage(m_Dlg, IDC_MIXING, BM_SETCHECK, m_bMixing, 0); @@ -441,6 +453,18 @@ HRESULT CLAVAudioMixingProp::OnActivate() SendDlgItemMessage(m_Dlg, IDC_MIXMODE_NORMAL, BM_SETCHECK, (m_dwMixingMode == MatrixEncoding_None), 0); SendDlgItemMessage(m_Dlg, IDC_MIXMODE_DOLBY, BM_SETCHECK, (m_dwMixingMode == MatrixEncoding_Dolby), 0); SendDlgItemMessage(m_Dlg, IDC_MIXMODE_DPL2, BM_SETCHECK, (m_dwMixingMode == MatrixEncoding_DPLII), 0); + + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER, TBM_SETPOS, 1, m_dwMixCenter); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND, TBM_SETPOS, 1, m_dwMixSurround); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE, TBM_SETPOS, 1, m_dwMixLFE); + + WCHAR buffer[10]; + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)m_dwMixCenter / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)m_dwMixSurround / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)m_dwMixLFE / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); } return hr; @@ -454,6 +478,7 @@ HRESULT CLAVAudioMixingProp::LoadData() m_bMixing = m_pAudioSettings->GetMixingEnabled(); m_dwFlags = m_pAudioSettings->GetMixingFlags(); m_dwMixingMode = m_pAudioSettings->GetMixingMode(); + m_pAudioSettings->GetMixingLevels(&m_dwMixCenter, &m_dwMixSurround, &m_dwMixLFE); return hr; } @@ -507,6 +532,31 @@ INT_PTR CLAVAudioMixingProp::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wPara } break; case WM_HSCROLL: + if ((HWND)lParam == GetDlgItem(m_Dlg, IDC_MIX_LEVEL_CENTER)) { + lValue = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER, TBM_GETPOS, 0, 0); + if (lValue != m_dwMixCenter) { + SetDirty(); + } + WCHAR buffer[10]; + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)lValue / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_CENTER_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); + } else if ((HWND)lParam == GetDlgItem(m_Dlg, IDC_MIX_LEVEL_SURROUND)) { + lValue = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND, TBM_GETPOS, 0, 0); + if (lValue != m_dwMixSurround) { + SetDirty(); + } + WCHAR buffer[10]; + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)lValue / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_SURROUND_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); + } else if ((HWND)lParam == GetDlgItem(m_Dlg, IDC_MIX_LEVEL_LFE)) { + lValue = SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE, TBM_GETPOS, 0, 0); + if (lValue != m_dwMixLFE) { + SetDirty(); + } + WCHAR buffer[10]; + _snwprintf_s(buffer, _TRUNCATE, L"%.2f", (double)lValue / 10000.0); + SendDlgItemMessage(m_Dlg, IDC_MIX_LEVEL_LFE_TEXT, WM_SETTEXT, 0, (LPARAM)buffer); + } break; } // Let the parent class handle the message. diff --git a/decoder/LAVAudio/AudioSettingsProp.h b/decoder/LAVAudio/AudioSettingsProp.h index 3a6eeb8d..cd30c8fe 100644 --- a/decoder/LAVAudio/AudioSettingsProp.h +++ b/decoder/LAVAudio/AudioSettingsProp.h @@ -111,6 +111,9 @@ private: DWORD m_dwSpeakerLayout; DWORD m_dwFlags; DWORD m_dwMixingMode; + DWORD m_dwMixCenter; + DWORD m_dwMixSurround; + DWORD m_dwMixLFE; }; class CLAVAudioFormatsProp : public CBaseDSPropPage diff --git a/decoder/LAVAudio/LAVAudio.cpp b/decoder/LAVAudio/LAVAudio.cpp index 18f2a4ea..dee37ef7 100644 --- a/decoder/LAVAudio/LAVAudio.cpp +++ b/decoder/LAVAudio/LAVAudio.cpp @@ -198,6 +198,9 @@ HRESULT CLAVAudio::LoadDefaults() m_settings.MixingLayout = AV_CH_LAYOUT_STEREO; m_settings.MixingFlags = LAV_MIXING_FLAG_CLIP_PROTECTION; m_settings.MixingMode = MatrixEncoding_None; + m_settings.MixingCenterLevel = 7071; + m_settings.MixingSurroundLevel = 7071; + m_settings.MixingLFELevel = 0; return S_OK; } @@ -273,6 +276,15 @@ HRESULT CLAVAudio::LoadSettings() dwVal = reg.ReadDWORD(L"MixingMode", hr); if (SUCCEEDED(hr)) m_settings.MixingMode = dwVal; + dwVal = reg.ReadDWORD(L"MixingCenterLevel", hr); + if (SUCCEEDED(hr)) m_settings.MixingCenterLevel = dwVal; + + dwVal = reg.ReadDWORD(L"MixingSurroundLevel", hr); + if (SUCCEEDED(hr)) m_settings.MixingSurroundLevel = dwVal; + + dwVal = reg.ReadDWORD(L"MixingLFELevel", hr); + if (SUCCEEDED(hr)) m_settings.MixingLFELevel = dwVal; + // Deprecated sample format storage pBuf = reg.ReadBinary(L"SampleFormats", dwVal, hr); if (SUCCEEDED(hr)) { @@ -333,6 +345,9 @@ HRESULT CLAVAudio::SaveSettings() reg.WriteDWORD(L"MixingLayout", m_settings.MixingLayout); reg.WriteDWORD(L"MixingFlags", m_settings.MixingFlags); reg.WriteDWORD(L"MixingMode", m_settings.MixingMode); + reg.WriteDWORD(L"MixingCenterLevel", m_settings.MixingCenterLevel); + reg.WriteDWORD(L"MixingSurroundLevel", m_settings.MixingSurroundLevel); + reg.WriteDWORD(L"MixingLFELevel", m_settings.MixingLFELevel); reg.DeleteKey(L"Formats"); CRegistry regF = CRegistry(HKEY_CURRENT_USER, LAVC_AUDIO_REGISTRY_KEY_FORMATS, hr); @@ -696,6 +711,30 @@ STDMETHODIMP_(LAVAudioMixingMode) CLAVAudio::GetMixingMode() return (LAVAudioMixingMode)m_settings.MixingMode; } +STDMETHODIMP CLAVAudio::SetMixingLevels(DWORD dwCenterLevel, DWORD dwSurroundLevel, DWORD dwLFELevel) +{ + m_settings.MixingCenterLevel = dwCenterLevel; + m_settings.MixingSurroundLevel = dwSurroundLevel; + m_settings.MixingLFELevel = dwLFELevel; + SaveSettings(); + + m_bMixingSettingsChanged = TRUE; + + return S_OK; +} + +STDMETHODIMP CLAVAudio::GetMixingLevels(DWORD *dwCenterLevel, DWORD *dwSurroundLevel, DWORD *dwLFELevel) +{ + if (dwCenterLevel) + *dwCenterLevel = m_settings.MixingCenterLevel; + if (dwSurroundLevel) + *dwSurroundLevel = m_settings.MixingSurroundLevel; + if (dwLFELevel) + *dwLFELevel = m_settings.MixingLFELevel; + + return S_OK; +} + // ILAVAudioStatus BOOL CLAVAudio::IsSampleFormatSupported(LAVAudioSampleFormat sfCheck) { diff --git a/decoder/LAVAudio/LAVAudio.h b/decoder/LAVAudio/LAVAudio.h index f3b591f1..38b3b199 100644 --- a/decoder/LAVAudio/LAVAudio.h +++ b/decoder/LAVAudio/LAVAudio.h @@ -140,6 +140,8 @@ public: STDMETHODIMP_(DWORD) GetMixingFlags(); STDMETHODIMP SetMixingMode(LAVAudioMixingMode mixingMode); STDMETHODIMP_(LAVAudioMixingMode) GetMixingMode(); + STDMETHODIMP SetMixingLevels(DWORD dwCenterLevel, DWORD dwSurroundLevel, DWORD dwLFELevel); + STDMETHODIMP GetMixingLevels(DWORD *dwCenterLevel, DWORD *dwSurroundLevel, DWORD *dwLFELevel); // ILAVAudioStatus STDMETHODIMP_(BOOL) IsSampleFormatSupported(LAVAudioSampleFormat sfCheck); @@ -294,6 +296,9 @@ private: DWORD MixingLayout; DWORD MixingFlags; DWORD MixingMode; + DWORD MixingCenterLevel; + DWORD MixingSurroundLevel; + DWORD MixingLFELevel; } m_settings; BOOL m_bRuntimeConfig; diff --git a/decoder/LAVAudio/LAVAudio.rc b/decoder/LAVAudio/LAVAudio.rc index d45c1dd6..b3e0254c 100644 --- a/decoder/LAVAudio/LAVAudio.rc +++ b/decoder/LAVAudio/LAVAudio.rc @@ -109,7 +109,7 @@ IDD_PROPPAGE_AUDIO_MIXING DIALOGEX 0, 0, 369, 215 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x0 BEGIN - GROUPBOX "Mixer",IDC_LBL_MIXING,7,7,214,67 + GROUPBOX "Mixer",IDC_LBL_MIXING,7,7,214,112 CONTROL "Enable Mixing",IDC_MIXING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,19,59,10 LTEXT "Output Speaker Configuration:",IDC_LBL_OUTPUT_SPEAKERS,15,32,100,8 COMBOBOX IDC_OUTPUT_SPEAKERS,121,30,90,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -121,6 +121,16 @@ BEGIN CONTROL "None",IDC_MIXMODE_NORMAL,"Button",BS_AUTORADIOBUTTON,235,79,116,10 CONTROL "Dolby Pro Logic",IDC_MIXMODE_DOLBY,"Button",BS_AUTORADIOBUTTON,235,91,116,10 CONTROL "Dolby Pro Logic II",IDC_MIXMODE_DPL2,"Button",BS_AUTORADIOBUTTON,235,103,116,10 + LTEXT "Center Mix Level",IDC_LBL_CENTER_LEVEL,12,50,54,8 + CONTROL "",IDC_MIX_LEVEL_CENTER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,72,47,130,15 + LTEXT "0.00",IDC_MIX_LEVEL_CENTER_TEXT,202,50,16,8 + LTEXT "Surround Mix Level",IDC_LBL_SURROUND_LEVEL,12,65,62,8 + CONTROL "",IDC_MIX_LEVEL_SURROUND,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,72,62,130,15 + LTEXT "0.00",IDC_MIX_LEVEL_SURROUND_TEXT,202,65,16,8 + LTEXT "LFE Mix Level",IDC_LBL_LFE_LEVEL,12,80,44,8 + CONTROL "",IDC_MIX_LEVEL_LFE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,72,77,130,15 + LTEXT "0.00",IDC_MIX_LEVEL_LFE_TEXT,202,80,16,8 + LTEXT "The mixing levels control the volume of the individual channels when being mixed with other channels into a downmix.",IDC_LBL_MIXING_LEVEL,12,97,200,18 END IDD_PROPPAGE_FORMATS DIALOGEX 0, 0, 369, 215 diff --git a/decoder/LAVAudio/LAVAudioSettings.h b/decoder/LAVAudio/LAVAudioSettings.h index 3bc569e3..e0274971 100644 --- a/decoder/LAVAudio/LAVAudioSettings.h +++ b/decoder/LAVAudio/LAVAudioSettings.h @@ -165,6 +165,10 @@ interface ILAVAudioSettings : public IUnknown // Set Mixing Mode STDMETHOD(SetMixingMode)(LAVAudioMixingMode mixingMode) = 0; STDMETHOD_(LAVAudioMixingMode,GetMixingMode)() = 0; + + // Set Mixing Levels + STDMETHOD(SetMixingLevels)(DWORD dwCenterLevel, DWORD dwSurroundLevel, DWORD dwLFELevel) = 0; + STDMETHOD(GetMixingLevels)(DWORD *dwCenterLevel, DWORD *dwSurroundLevel, DWORD *dwLFELevel) = 0; }; // LAV Audio Status Interface diff --git a/decoder/LAVAudio/PostProcessor.cpp b/decoder/LAVAudio/PostProcessor.cpp index 5bd261d0..a8210921 100644 --- a/decoder/LAVAudio/PostProcessor.cpp +++ b/decoder/LAVAudio/PostProcessor.cpp @@ -592,7 +592,10 @@ HRESULT CLAVAudio::PerformMixing(BufferDetails *buffer) int out_ch = av_get_channel_layout_nb_channels(m_settings.MixingLayout); double *matrix_dbl = (double *)av_mallocz(in_ch * out_ch * sizeof(*matrix_dbl)); - ret = avresample_build_matrix(buffer->dwChannelMask, m_settings.MixingLayout, M_SQRT1_2, M_SQRT1_2, 0.0, bNormalize, matrix_dbl, in_ch, (AVMatrixEncoding)m_settings.MixingMode); + const double center_mix_level = (double)m_settings.MixingCenterLevel / 10000.0 / M_SQRT1_2; + const double surround_mix_level = (double)m_settings.MixingSurroundLevel / 10000.0; + const double lfe_mix_level = (double)m_settings.MixingLFELevel / 10000.0; + ret = avresample_build_matrix(buffer->dwChannelMask, m_settings.MixingLayout, center_mix_level, surround_mix_level, lfe_mix_level, bNormalize, matrix_dbl, in_ch, (AVMatrixEncoding)m_settings.MixingMode); if (ret < 0) { DbgLog((LOG_ERROR, 10, L"avresample_build_matrix failed, layout in: %x, out: %x, sample fmt in: %d, out: %d", buffer->dwChannelMask, m_settings.MixingLayout, buffer->sfFormat, m_sfRemixFormat)); av_free(matrix_dbl); diff --git a/decoder/LAVAudio/resource.h b/decoder/LAVAudio/resource.h index 6574ca23..5682f30f 100644 --- a/decoder/LAVAudio/resource.h +++ b/decoder/LAVAudio/resource.h @@ -101,6 +101,16 @@ #define IDC_MIXMODE_NORMAL 1116 #define IDC_MIXMODE_DOLBY 1117 #define IDC_MIXMODE_DPL2 1118 +#define IDC_MIX_LEVEL_CENTER 1121 +#define IDC_MIX_LEVEL_SURROUND 1122 +#define IDC_MIX_LEVEL_LFE 1123 +#define IDC_LBL_CENTER_LEVEL 1124 +#define IDC_LBL_SURROUND_LEVEL 1125 +#define IDC_LBL_LFE_LEVEL 1126 +#define IDC_MIX_LEVEL_CENTER_TEXT 1127 +#define IDC_MIX_LEVEL_SURROUND_TEXT 1128 +#define IDC_MIX_LEVEL_LFE_TEXT 1129 +#define IDC_LBL_MIXING_LEVEL 1130 // Next default values for new objects // @@ -108,7 +118,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1119 +#define _APS_NEXT_CONTROL_VALUE 1131 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif |