/* * MPDlgs.h * -------- * Purpose: Implementation of various player setup dialogs. * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" OPENMPT_NAMESPACE_BEGIN class CSoundFile; class CMainFrame; #define NUM_CHANNELCOMBOBOXES 4 class COptionsSoundcard: public CPropertyPage { protected: CComboBoxEx m_CbnDevice; CComboBox m_CbnLatencyMS, m_CbnUpdateIntervalMS, m_CbnMixingFreq, m_CbnChannels, m_CbnSampleFormat, m_CbnDither, m_CbnRecordingChannels, m_CbnRecordingSource; CEdit m_EditStatistics; CButton m_BtnDriverPanel; CComboBox m_CbnStoppedMode; CComboBox m_CbnChannelMapping[NUM_CHANNELCOMBOBOXES]; SoundDevice::Identifier m_InitialDeviceIdentifier; void SetInitialDevice(); void SetDevice(SoundDevice::Identifier dev, bool forceReload=false); SoundDevice::Info m_CurrentDeviceInfo; SoundDevice::Caps m_CurrentDeviceCaps; SoundDevice::DynamicCaps m_CurrentDeviceDynamicCaps; SoundDevice::Settings m_Settings; public: COptionsSoundcard(SoundDevice::Identifier deviceIdentifier); void UpdateStatistics(); private: void UpdateEverything(); void UpdateDevice(); void UpdateGeneral(); void UpdateLatency(); void UpdateUpdateInterval(); void UpdateSampleRates(); void UpdateChannels(); void UpdateSampleFormat(); void UpdateDither(); void UpdateChannelMapping(); void UpdateRecording(); void UpdateControls(); protected: BOOL OnInitDialog() override; void OnOK() override; BOOL OnSetActive() override; void DoDataExchange(CDataExchange* pDX) override; void UpdateStereoSep(); afx_msg void OnDeviceChanged(); afx_msg void OnSettingsChanged() { SetModified(TRUE); } afx_msg void OnExclusiveModeChanged(); afx_msg void OnChannelsChanged(); afx_msg void OnSampleFormatChanged(); afx_msg void OnRecordingChanged(); afx_msg void OnSoundCardShowAll(); 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() }; class COptionsMixer: public CPropertyPage { protected: CComboBox m_CbnResampling, m_CbnAmigaType; CEdit m_CEditRampUp; CEdit m_CEditRampDown; CEdit m_CInfoRampUp; CEdit m_CInfoRampDown; CSliderCtrl m_SliderStereoSep; // check box soft pan CSliderCtrl m_SliderPreAmp; bool m_initialized : 1; public: COptionsMixer() : CPropertyPage(IDD_OPTIONS_MIXER) , m_initialized(false) {} protected: void UpdateRamping(); void UpdateStereoSep(); BOOL OnInitDialog() override; void OnOK() override; BOOL OnSetActive() override; void DoDataExchange(CDataExchange* pDX) override; afx_msg void OnSettingsChanged() { SetModified(TRUE); } afx_msg void OnAmigaChanged(); afx_msg void OnRampingChanged(); afx_msg void OnDefaultRampSettings(); afx_msg void OnHScroll(UINT n, UINT pos, CScrollBar *p); DECLARE_MESSAGE_MAP() }; #ifndef NO_EQ class CEQSlider: public CSliderCtrl { public: CWnd *m_pParent; UINT m_nSliderNo; short int m_x, m_y; public: CEQSlider() {} void Init(UINT nID, UINT n, CWnd *parent); BOOL PreTranslateMessage(MSG *pMsg); }; #endif // !NO_EQ class COptionsPlayer: public CPropertyPage { protected: CComboBox m_CbnReverbPreset; CSliderCtrl m_SbXBassDepth, m_SbXBassRange; CSliderCtrl m_SbSurroundDepth, m_SbSurroundDelay; CSliderCtrl m_SbReverbDepth; CSliderCtrl m_SbBitCrushBits; #ifndef NO_EQ CEQSlider m_Sliders[MAX_EQ_BANDS]; EQPreset &m_EQPreset; UINT m_nSliderMenu; #endif // !NO_EQ public: COptionsPlayer() : CPropertyPage(IDD_OPTIONS_PLAYER) #ifndef NO_EQ , m_EQPreset(TrackerSettings::Instance().m_EqSettings) #endif { } protected: BOOL OnInitDialog() override; void OnOK() override; BOOL OnSetActive() override; void DoDataExchange(CDataExchange* pDX) override; afx_msg void OnHScroll(UINT, UINT, CScrollBar *); afx_msg void OnSettingsChanged() { SetModified(TRUE); } #ifndef NO_EQ afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnEqUser1() { LoadEQPreset(TrackerSettings::Instance().m_EqUserPresets[0]); }; afx_msg void OnEqUser2() { LoadEQPreset(TrackerSettings::Instance().m_EqUserPresets[1]); }; afx_msg void OnEqUser3() { LoadEQPreset(TrackerSettings::Instance().m_EqUserPresets[2]); }; afx_msg void OnEqUser4() { LoadEQPreset(TrackerSettings::Instance().m_EqUserPresets[3]); }; afx_msg void OnSavePreset(); afx_msg void OnSliderMenu(UINT); afx_msg void OnSliderFreq(UINT); void UpdateDialog(); void UpdateEQ(bool bReset); void LoadEQPreset(const EQPreset &preset); #endif // !NO_EQ DECLARE_MESSAGE_MAP() }; class CMidiSetupDlg: public CPropertyPage { public: DWORD m_dwMidiSetup; UINT m_nMidiDevice; protected: CSpinButtonCtrl m_SpinSpd, m_SpinPat, m_SpinAmp; CComboBox m_InputDevice, m_ATBehaviour, m_Quantize; public: CMidiSetupDlg(DWORD d, UINT n) : CPropertyPage(IDD_OPTIONS_MIDI) , m_dwMidiSetup(d) , m_nMidiDevice(n) { } protected: BOOL OnInitDialog() override; void OnOK() override; BOOL OnSetActive() override; void DoDataExchange(CDataExchange* pDX) override; void RefreshDeviceList(UINT currentDevice); afx_msg void OnRenameDevice(); afx_msg void OnSettingsChanged() { SetModified(TRUE); } DECLARE_MESSAGE_MAP() }; class COptionsWine: public CPropertyPage { protected: CComboBox m_CbnPulseAudio; CComboBox m_CbnPortAudio; CComboBox m_CbnRtAudio; public: COptionsWine(); protected: BOOL OnInitDialog() override; void OnOK() override; BOOL OnSetActive() override; void DoDataExchange(CDataExchange* pDX) override; afx_msg void OnSettingsChanged(); DECLARE_MESSAGE_MAP() }; OPENMPT_NAMESPACE_END