/* * SampleEditorDialogs.h * --------------------- * Purpose: Code for various dialogs that are used in the sample editor. * Notes : (currently none) * Authors: Olivier Lapicque * OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" #include "../common/FileReaderFwd.h" #include "../soundlib/SampleIO.h" #include "../tracklib/FadeLaws.h" #include "CDecimalSupport.h" OPENMPT_NAMESPACE_BEGIN ////////////////////////////////////////////////////////////////////////// // Sample amplification dialog class CAmpDlg: public CDialog { public: struct AmpSettings { Fade::Law fadeLaw; int fadeInStart, fadeOutEnd; int16 factor; bool fadeIn, fadeOut; }; AmpSettings &m_settings; int16 m_nFactorMin, m_nFactorMax; protected: CComboBoxEx m_fadeBox; CImageList m_list; CNumberEdit m_edit, m_editFadeIn, m_editFadeOut; bool m_locked = true; public: CAmpDlg(CWnd *parent, AmpSettings &settings, int16 factorMin = int16_min, int16 factorMax = int16_max); protected: void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; void OnDestroy(); afx_msg void EnableFadeIn() { if(!m_locked) CheckDlgButton(IDC_CHECK1, BST_CHECKED); } afx_msg void EnableFadeOut() { if(!m_locked) CheckDlgButton(IDC_CHECK2, BST_CHECKED); } DECLARE_MESSAGE_MAP() }; ////////////////////////////////////////////////////////////////////////// // Sample import dialog class CRawSampleDlg: public CDialog { friend class AutodetectFormatDlg; protected: static SampleIO m_format; static SmpLength m_offset; CSpinButtonCtrl m_SpinOffset; FileReader &m_file; bool m_rememberFormat = false; public: SampleIO GetSampleFormat() const { return m_format; } void SetSampleFormat(SampleIO nFormat) { m_format = nFormat; } bool GetRemeberFormat() const { return m_rememberFormat; }; void SetRememberFormat(bool remember) { m_rememberFormat = remember; }; SmpLength GetOffset() const { return m_offset; } void SetOffset(SmpLength offset) { m_offset = offset; } public: CRawSampleDlg(FileReader &file, CWnd *parent = nullptr) : CDialog(IDD_LOADRAWSAMPLE, parent) , m_file(file) {} protected: void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; void OnOK() override; void UpdateDialog(); void OnBitDepthChanged(UINT id); void OnEncodingChanged(UINT id); void OnAutodetectFormat(); DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////// // Add silence dialog - add silence to a sample class AddSilenceDlg: public CDialog { public: enum AddSilenceOptions { kSilenceAtBeginning, // Add at beginning of sample kSilenceAtEnd, // Add at end of sample kResize, // Resize sample kOPLInstrument, // Initialize as OPL instrument }; enum Unit { kSamples = 0, kMilliseconds, }; SmpLength m_numSamples; // Add x samples (also containes the return value in all cases) SmpLength m_length; // Set size to x samples (init value: current sample size) AddSilenceOptions m_editOption; // See above protected: static SmpLength m_addSamples; static SmpLength m_createSamples; uint32 m_sampleRate; Unit m_unit = kSamples; bool m_allowOPL; public: AddSilenceDlg(CWnd *parent, SmpLength origLength, uint32 sampleRate, bool allowOPL); BOOL OnInitDialog() override; void OnOK() override; protected: AddSilenceOptions GetEditMode() const; afx_msg void OnEditModeChanged(); afx_msg void OnUnitChanged(); DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////// // Sample grid dialog class CSampleGridDlg: public CDialog { public: SmpLength m_nSegments, m_nMaxSegments; protected: CEdit m_EditSegments; CSpinButtonCtrl m_SpinSegments; public: CSampleGridDlg(CWnd *parent, SmpLength nSegments, SmpLength nMaxSegments) : CDialog(IDD_SAMPLE_GRID_SIZE, parent) { m_nSegments = nSegments; m_nMaxSegments = nMaxSegments; }; protected: void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; }; ///////////////////////////////////////////////////////////////////////// // Sample cross-fade dialog class CSampleXFadeDlg: public CDialog { public: static uint32 m_fadeLength; static uint32 m_fadeLaw; static bool m_afterloopFade; static bool m_useSustainLoop; SmpLength m_loopLength = 0, m_maxLength = 0; protected: CSliderCtrl m_SliderLength, m_SliderFadeLaw; CEdit m_EditSamples; CSpinButtonCtrl m_SpinSamples; CButton m_RadioNormalLoop, m_RadioSustainLoop; ModSample &m_sample; bool m_editLocked = true; public: CSampleXFadeDlg(CWnd *parent, ModSample &sample) : CDialog(IDD_SAMPLE_XFADE, parent) , m_sample(sample) {} SmpLength PercentToSamples(uint32 percent) const { return Util::muldivr_unsigned(percent, m_loopLength, 100000); } uint32 SamplesToPercent(SmpLength samples) const { return Util::muldivr_unsigned(samples, 100000, m_loopLength); } protected: void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; afx_msg void OnLoopTypeChanged(); afx_msg void OnFadeLengthChanged(); afx_msg void OnHScroll(UINT, UINT, CScrollBar *); afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////// // Resampling dialog class CResamplingDlg: public CDialog { public: enum ResamplingOption { Upsample, Downsample, Custom }; protected: ResamplingMode m_srcMode; uint32 m_frequency; bool m_resampleAll; static uint32 m_lastFrequency; static ResamplingOption m_lastChoice; static bool m_updatePatterns; public: CResamplingDlg(CWnd *parent, uint32 frequency, ResamplingMode srcMode, bool resampleAll) : CDialog(IDD_RESAMPLE, parent), m_srcMode(srcMode), m_frequency(frequency), m_resampleAll(resampleAll) { }; uint32 GetFrequency() const { return m_frequency; } ResamplingMode GetFilter() const { return m_srcMode; } static ResamplingOption GetResamplingOption() { return m_lastChoice; } static bool UpdatePatternCommands() { return m_updatePatterns; } protected: BOOL OnInitDialog() override; void OnOK() override; afx_msg void OnFocusEdit() { CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO3); } DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////// // Sample mix dialog class CMixSampleDlg: public CDialog { protected: // Dialog controls CEdit m_EditOffset; CNumberEdit m_EditVolOriginal, m_EditVolMix; CSpinButtonCtrl m_SpinOffset, m_SpinVolOriginal, m_SpinVolMix; public: static SmpLength sampleOffset; static int amplifyOriginal; static int amplifyMix; public: CMixSampleDlg(CWnd *parent); protected: void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; }; OPENMPT_NAMESPACE_END