Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2012-07-09 16:30:00 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2012-07-09 17:55:16 +0400
commit1fd321543daa411f89b6ae041c1e2bdc9140f240 (patch)
treebcf20df18eec6888aa3426242d2f12a2bd8c34a6 /decoder/LAVAudio
parentdbea5a9c82b23728f1eb30d53816600e2ad4af59 (diff)
Add options for controlling the center/surround/lfe mixing levels
Diffstat (limited to 'decoder/LAVAudio')
-rw-r--r--decoder/LAVAudio/AudioSettingsProp.cpp50
-rw-r--r--decoder/LAVAudio/AudioSettingsProp.h3
-rw-r--r--decoder/LAVAudio/LAVAudio.cpp39
-rw-r--r--decoder/LAVAudio/LAVAudio.h5
-rw-r--r--decoder/LAVAudio/LAVAudio.rc12
-rw-r--r--decoder/LAVAudio/LAVAudioSettings.h4
-rw-r--r--decoder/LAVAudio/PostProcessor.cpp5
-rw-r--r--decoder/LAVAudio/resource.h12
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