winamp/Src/external_dependencies/openmpt-trunk/mptrack/SampleEditorDialogs.h
2024-09-24 14:54:57 +02:00

279 lines
6.8 KiB
C++

/*
* 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