From: <man...@us...> - 2014-02-01 23:53:18
|
Revision: 3626 http://sourceforge.net/p/modplug/code/3626 Author: manxorist Date: 2014-02-01 23:53:08 +0000 (Sat, 01 Feb 2014) Log Message: ----------- [Imp] ASIO: Allow specifying a flexible channel mapping instead just the base channel offset in soundcard settings. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2014-02-01 23:11:40 UTC (rev 3625) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2014-02-01 23:53:08 UTC (rev 3626) @@ -59,6 +59,7 @@ + BEGIN_MESSAGE_MAP(COptionsSoundcard, CPropertyPage) ON_WM_HSCROLL() ON_WM_VSCROLL() @@ -72,14 +73,17 @@ ON_CBN_SELCHANGE(IDC_COMBO_UPDATEINTERVAL, OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO3, OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO4, OnSettingsChanged) - ON_CBN_SELCHANGE(IDC_COMBO5, OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO5, OnChannelsChanged) ON_CBN_SELCHANGE(IDC_COMBO6, OnSampleFormatChanged) ON_CBN_SELCHANGE(IDC_COMBO10, OnSettingsChanged) - ON_CBN_SELCHANGE(IDC_COMBO9, OnSettingsChanged) ON_CBN_EDITCHANGE(IDC_COMBO2, OnSettingsChanged) ON_CBN_EDITCHANGE(IDC_COMBO_UPDATEINTERVAL, OnSettingsChanged) ON_COMMAND(IDC_BUTTON1, OnSoundCardRescan) ON_COMMAND(IDC_BUTTON2, OnSoundCardDriverPanel) + ON_CBN_SELCHANGE(IDC_COMBO_CHANNEL_FRONTLEFT, OnChannel1Changed) + ON_CBN_SELCHANGE(IDC_COMBO_CHANNEL_FRONTRIGHT, OnChannel2Changed) + ON_CBN_SELCHANGE(IDC_COMBO_CHANNEL_REARLEFT, OnChannel3Changed) + ON_CBN_SELCHANGE(IDC_COMBO_CHANNEL_REARRIGHT, OnChannel4Changed) END_MESSAGE_MAP() @@ -103,8 +107,16 @@ DDX_Control(pDX, IDC_COMBO5, m_CbnChannels); DDX_Control(pDX, IDC_COMBO6, m_CbnSampleFormat); DDX_Control(pDX, IDC_COMBO10, m_CbnDither); - DDX_Control(pDX, IDC_COMBO9, m_CbnBaseChannel); DDX_Control(pDX, IDC_BUTTON2, m_BtnDriverPanel); + DDX_Control(pDX, IDC_COMBO6, m_CbnSampleFormat); + DDX_Control(pDX, IDC_STATIC_CHANNEL_FRONTLEFT , m_StaticChannelMapping[0]); + DDX_Control(pDX, IDC_STATIC_CHANNEL_FRONTRIGHT, m_StaticChannelMapping[1]); + DDX_Control(pDX, IDC_STATIC_CHANNEL_REARLEFT , m_StaticChannelMapping[2]); + DDX_Control(pDX, IDC_STATIC_CHANNEL_REARRIGHT , m_StaticChannelMapping[3]); + DDX_Control(pDX, IDC_COMBO_CHANNEL_FRONTLEFT , m_CbnChannelMapping[0]); + DDX_Control(pDX, IDC_COMBO_CHANNEL_FRONTRIGHT, m_CbnChannelMapping[1]); + DDX_Control(pDX, IDC_COMBO_CHANNEL_REARLEFT , m_CbnChannelMapping[2]); + DDX_Control(pDX, IDC_COMBO_CHANNEL_REARRIGHT , m_CbnChannelMapping[3]); DDX_Control(pDX, IDC_EDIT_STATISTICS, m_EditStatistics); //}}AFX_DATA_MAP } @@ -304,6 +316,7 @@ UpdateChannels(); UpdateSampleFormat(); UpdateDither(); + UpdateChannelMapping(); } @@ -330,24 +343,6 @@ } } m_CbnChannels.SetCurSel(sel); - - GetDlgItem(IDC_STATIC_BASECHANNEL)->EnableWindow(m_CurrentDeviceCaps.CanChannelMapping ? TRUE : FALSE); - m_CbnBaseChannel.EnableWindow(m_CurrentDeviceCaps.CanChannelMapping ? TRUE : FALSE); - m_CbnBaseChannel.ResetContent(); - if(m_CurrentDeviceCaps.CanChannelMapping) - { - int sel = 0; - for(std::size_t channel = 0; channel < m_CurrentDeviceCaps.channelNames.size(); ++channel) - { - int ndx = m_CbnBaseChannel.AddString(mpt::ToCString(m_CurrentDeviceCaps.channelNames[channel])); - m_CbnBaseChannel.SetItemData(ndx, channel); - if(channel == m_Settings.ChannelMapping.GetBaseChannel()) - { - sel = ndx; - } - } - m_CbnBaseChannel.SetCurSel(sel); - } } @@ -420,6 +415,38 @@ } +void COptionsSoundcard::UpdateChannelMapping() +//-------------------------------------------- +{ + int usedChannels = m_CbnChannels.GetItemData(m_CbnChannels.GetCurSel()); + for(int mch = 0; mch < NUM_CHANNELCOMBOBOXES; mch++) // Host channels + { + CStatic *statictext = &m_StaticChannelMapping[mch]; + CComboBox *combo = &m_CbnChannelMapping[mch]; + statictext->EnableWindow((m_CurrentDeviceCaps.CanChannelMapping && mch < usedChannels) ? TRUE : FALSE); + combo->EnableWindow((m_CurrentDeviceCaps.CanChannelMapping && mch < usedChannels) ? TRUE : FALSE); + combo->ResetContent(); + if(m_CurrentDeviceCaps.CanChannelMapping) + { + combo->SetItemData(combo->AddString("Unassigned"), (DWORD_PTR)-1); + combo->SetCurSel(0); + if(mch < usedChannels) + { + for(size_t dch = 0; dch < m_CurrentDeviceCaps.channelNames.size(); dch++) // Device channels + { + const int pos = (int)::SendMessageW(combo->m_hWnd, CB_ADDSTRING, 0, (LPARAM)m_CurrentDeviceCaps.channelNames[dch].c_str()); + combo->SetItemData(pos, (DWORD_PTR)dch); + if(dch == m_Settings.ChannelMapping.ToDevice(mch)) + { + combo->SetCurSel(pos); + } + } + } + } + } +} + + void COptionsSoundcard::OnDeviceChanged() //--------------------------------------- { @@ -433,6 +460,14 @@ } +void COptionsSoundcard::OnChannelsChanged() +//----------------------------------------- +{ + UpdateChannelMapping(); + OnSettingsChanged(); +} + + void COptionsSoundcard::OnSoundCardDriverPanel() //---------------------------------------------- { @@ -440,6 +475,58 @@ } +void COptionsSoundcard::OnChannelChanged(int channel) +//--------------------------------------------------- +{ + CComboBox *combo = &m_CbnChannelMapping[channel]; + const int newChn = combo->GetItemData(combo->GetCurSel()); + if(newChn == -1) + { + return; + } + // Ensure that no channel is used twice + for(int mch = 0; mch < NUM_CHANNELCOMBOBOXES; mch++) // Host channels + { + if(mch != channel) + { + combo = &m_CbnChannelMapping[mch]; + if((int)combo->GetItemData(combo->GetCurSel()) == newChn) + { + // find an unused channel + bool found = false; + std::size_t deviceChannel = 0; + for(; deviceChannel < m_CurrentDeviceCaps.channelNames.size(); ++deviceChannel) + { + bool used = false; + for(int hostChannel = 0; hostChannel < NUM_CHANNELCOMBOBOXES; ++hostChannel) + { + if((int)m_CbnChannelMapping[hostChannel].GetItemData(m_CbnChannelMapping[hostChannel].GetCurSel()) == (int)deviceChannel) + { + used = true; + break; + } + } + if(!used) + { + found = true; + break; + } + } + if(found) + { + combo->SetCurSel(deviceChannel+1); + } else + { + combo->SetCurSel(0); + } + break; + } + } + } + OnSettingsChanged(); +} + + // Fill the dropdown box with a list of valid sample rates, depending on the selected sound device. void COptionsSoundcard::UpdateSampleRates() //----------------------------------------- @@ -556,11 +643,21 @@ wsprintf(s, "%d ms", m_Settings.UpdateIntervalMS); m_CbnUpdateIntervalMS.SetWindowText(s); } - // Base Channel + // Channel Mapping { - if(m_CurrentDeviceInfo.id.GetType() == SNDDEV_ASIO) + if(m_CurrentDeviceCaps.CanChannelMapping) { - m_Settings.ChannelMapping = SoundChannelMapping::BaseChannel(m_Settings.Channels, m_CbnBaseChannel.GetItemData(m_CbnBaseChannel.GetCurSel())); + int numChannels = std::min<int>(m_Settings.Channels, NUM_CHANNELCOMBOBOXES); + std::vector<uint32> channels(numChannels); + for(int mch = 0; mch < numChannels; mch++) // Host channels + { + CComboBox *combo = &m_CbnChannelMapping[mch]; + channels[mch] = combo->GetItemData(combo->GetCurSel()); + } + m_Settings.ChannelMapping = SoundChannelMapping(channels); + } else + { + m_Settings.ChannelMapping = SoundChannelMapping(); } } CMainFrame::GetMainFrame()->SetupSoundCard(m_Settings, m_CurrentDeviceInfo.id); Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2014-02-01 23:11:40 UTC (rev 3625) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2014-02-01 23:53:08 UTC (rev 3626) @@ -13,6 +13,8 @@ class CSoundFile; class CMainFrame; +#define NUM_CHANNELCOMBOBOXES 4 + //=========================================== class COptionsSoundcard: public CPropertyPage //=========================================== @@ -20,10 +22,12 @@ protected: CComboBoxEx m_CbnDevice; CComboBox m_CbnLatencyMS, m_CbnUpdateIntervalMS, m_CbnMixingFreq, m_CbnChannels, m_CbnSampleFormat, m_CbnDither; - CComboBox m_CbnBaseChannel; CEdit m_EditStatistics; CButton m_BtnDriverPanel; + CStatic m_StaticChannelMapping[NUM_CHANNELCOMBOBOXES]; + CComboBox m_CbnChannelMapping[NUM_CHANNELCOMBOBOXES]; + void SetDevice(SoundDeviceID dev, bool forceReload=false); SoundDeviceInfo m_CurrentDeviceInfo; SoundDeviceCaps m_CurrentDeviceCaps; @@ -43,6 +47,7 @@ void UpdateChannels(); void UpdateSampleFormat(); void UpdateDither(); + void UpdateChannelMapping(); void UpdateControls(); protected: @@ -51,11 +56,20 @@ virtual BOOL OnSetActive(); virtual void DoDataExchange(CDataExchange* pDX); void UpdateStereoSep(); + afx_msg void OnDeviceChanged(); afx_msg void OnSettingsChanged() { SetModified(TRUE); } + afx_msg void OnChannelsChanged(); afx_msg void OnSampleFormatChanged(); afx_msg void OnSoundCardRescan(); afx_msg void OnSoundCardDriverPanel(); + + void OnChannelChanged(int channel); + afx_msg void OnChannel1Changed() { OnChannelChanged(0); }; + afx_msg void OnChannel2Changed() { OnChannelChanged(1); }; + afx_msg void OnChannel3Changed() { OnChannelChanged(2); }; + afx_msg void OnChannel4Changed() { OnChannelChanged(3); }; + DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2014-02-01 23:11:40 UTC (rev 3625) +++ trunk/OpenMPT/mptrack/mptrack.rc 2014-02-01 23:53:08 UTC (rev 3626) @@ -1290,7 +1290,7 @@ CAPTION "Sound Card" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "&Device",IDC_STATIC,6,6,264,120 + GROUPBOX "&Device",IDC_STATIC,6,6,264,174 CONTROL "",IDC_COMBO1,"ComboBoxEx32",CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,12,18,252,96 PUSHBUTTON "&Setup device ...",IDC_BUTTON2,48,36,72,12 PUSHBUTTON "&Rescan device list",IDC_BUTTON1,198,36,66,12 @@ -1302,19 +1302,26 @@ COMBOBOX IDC_COMBO3,48,90,54,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO5,108,90,42,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO6,156,90,36,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO10,198,90,66,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Use device exclusively",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,54,84,12 CONTROL "Keep running",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,198,54,66,12 CONTROL "&Boost thread priority",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,72,84,12 CONTROL "Hardware timing",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,198,72,66,12 - LTEXT "Base &channel:",IDC_STATIC_BASECHANNEL,12,108,48,12,SS_CENTERIMAGE - COMBOBOX IDC_COMBO9,66,108,198,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "General",IDC_STATIC,6,132,264,48 + LTEXT "Channel &mapping:",IDC_STATIC,12,108,60,12,SS_CENTERIMAGE + CTEXT "Front Left",IDC_STATIC_CHANNEL_FRONTLEFT,78,108,48,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + COMBOBOX IDC_COMBO_CHANNEL_FRONTLEFT,132,108,132,72,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CTEXT "Front Right",IDC_STATIC_CHANNEL_FRONTRIGHT,78,126,48,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + COMBOBOX IDC_COMBO_CHANNEL_FRONTRIGHT,132,126,132,72,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CTEXT "Rear Left",IDC_STATIC_CHANNEL_REARLEFT,78,144,48,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + COMBOBOX IDC_COMBO_CHANNEL_REARLEFT,132,144,132,72,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CTEXT "Rear Right",IDC_STATIC_CHANNEL_REARRIGHT,78,162,48,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + COMBOBOX IDC_COMBO_CHANNEL_REARRIGHT,132,162,132,72,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "General",IDC_STATIC,6,186,264,30 CONTROL "Keep device &open when playback is stopped",IDC_CHECK6, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,144,162,12 - CONTROL "Open device at &startup",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,162,162,12 - GROUPBOX "Stat&istics",IDC_STATIC,6,186,264,60 - EDITTEXT IDC_EDIT_STATISTICS,12,197,252,42,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP - COMBOBOX IDC_COMBO10,198,90,66,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,198,156,12 + CONTROL "Open device at &startup",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,198,90,12 + GROUPBOX "Stat&istics",IDC_STATIC,6,222,264,55 + EDITTEXT IDC_EDIT_STATISTICS,12,233,252,38,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP END IDD_MIDIMACRO DIALOGEX 0, 0, 358, 354 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2014-02-01 23:11:40 UTC (rev 3625) +++ trunk/OpenMPT/mptrack/resource.h 2014-02-01 23:53:08 UTC (rev 3626) @@ -946,6 +946,14 @@ #define IDC_EDIT_VOLRAMP_SAMPLES_UP 2468 #define IDC_EDIT_VOLRAMP_SAMPLES_DOWN 2469 #define IDC_CHECK_KEEPDEVICEOPEN 2470 +#define IDC_STATIC_CHANNEL_FRONTLEFT 2471 +#define IDC_STATIC_CHANNEL_FRONTRIGHT 2472 +#define IDC_STATIC_CHANNEL_REARLEFT 2473 +#define IDC_STATIC_CHANNEL_REARRIGHT 2474 +#define IDC_COMBO_CHANNEL_FRONTLEFT 2475 +#define IDC_COMBO_CHANNEL_FRONTRIGHT 2476 +#define IDC_COMBO_CHANNEL_REARLEFT 2477 +#define IDC_COMBO_CHANNEL_REARRIGHT 2478 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1227,7 +1235,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 541 #define _APS_NEXT_COMMAND_VALUE 44643 -#define _APS_NEXT_CONTROL_VALUE 2471 +#define _APS_NEXT_CONTROL_VALUE 2479 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |