Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _WIN32_WINNT 0x0501
- #include "../SDK/foobar2000.h"
- #include "../ATLHelpers/ATLHelpers.h"
- #include "resource.h"
- #include "iirfilters.h"
- static void RunConfigPopup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback );
- class dsp_dcblocker : public dsp_impl_base
- {
- int m_rate, m_ch_mask;
- unsigned int m_ch;
- int p_pole;
- audio_sample* prev_samples;
- public:
- static GUID g_get_guid()
- {
- // {6690B93B-DE14-4641-ADB1-6A7AC49E04A1}
- static const GUID guid =
- { 0x6690b93b, 0xde14, 0x4641, { 0xad, 0xb1, 0x6a, 0x7a, 0xc4, 0x9e, 0x4, 0xa1 } };
- return guid;
- }
- dsp_dcblocker( dsp_preset const & in ) : m_rate( 0 ), m_ch( 0 ), m_ch_mask( 0 ), p_pole( 999 ), prev_samples( 0 )
- {
- parse_preset( p_pole, in );
- }
- ~dsp_dcblocker()
- {
- if (prev_samples != 0)
- delete[] prev_samples;
- }
- static void g_get_name( pfc::string_base & p_out ) { p_out = "DC Blocker"; }
- bool on_chunk( audio_chunk * chunk, abort_callback & )
- {
- if ( chunk->get_srate() != m_rate || chunk->get_channels() != m_ch || chunk->get_channel_config() != m_ch_mask )
- {
- m_rate = chunk->get_srate();
- m_ch = chunk->get_channels();
- m_ch_mask = chunk->get_channel_config();
- if (prev_samples != 0)
- delete[] prev_samples;
- prev_samples = new audio_sample[m_ch];
- for (unsigned int i = 0; i < m_ch; ++i)
- prev_samples[i] = 0;
- }
- const unsigned int samples_count = chunk->get_sample_count();
- const float p = p_pole / 1000.0f;
- for ( unsigned i = 0; i < m_ch; i++ )
- {
- audio_sample * data = chunk->get_data() + i;
- for ( unsigned j = 0; j < samples_count; ++j)
- {
- float m = *(data) + p * prev_samples[i];
- *(data) = m - prev_samples[i];
- prev_samples[i] = m;
- data += m_ch;
- }
- }
- return true;
- }
- void on_endofplayback( abort_callback & ) { }
- void on_endoftrack( abort_callback & ) { }
- void flush()
- {
- m_rate = 0;
- m_ch = 0;
- m_ch_mask = 0;
- }
- double get_latency()
- {
- return 0;
- }
- bool need_track_change_mark()
- {
- return false;
- }
- static bool g_get_default_preset( dsp_preset & p_out )
- {
- make_preset( 999, p_out );
- return true;
- }
- static void g_show_config_popup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback )
- {
- ::RunConfigPopup( p_data, p_parent, p_callback );
- }
- static bool g_have_config_popup() { return true; }
- static void make_preset( int p_pole, dsp_preset & out )
- {
- dsp_preset_builder builder;
- builder << p_pole;
- builder.finish( g_get_guid(), out );
- }
- static void parse_preset(int & p_pole, const dsp_preset & in)
- {
- try
- {
- dsp_preset_parser parser(in);
- parser >> p_pole;
- }
- catch(exception_io_data) { p_pole=999; }
- }
- };
- class CMyDSPPopupDCBlocker : public CDialogImpl<CMyDSPPopupDCBlocker>
- {
- public:
- CMyDSPPopupDCBlocker( const dsp_preset & initData, dsp_preset_edit_callback & callback ) : m_initData( initData ), m_callback( callback ) { }
- enum { IDD = IDD_DCBLOCKER };
- enum
- {
- PoleMin = 900,
- PoleMax = 999,
- PoleRangeTotal = PoleMax
- };
- BEGIN_MSG_MAP( CMyDSPPopup )
- MSG_WM_INITDIALOG( OnInitDialog )
- COMMAND_HANDLER_EX( IDOK, BN_CLICKED, OnButton )
- COMMAND_HANDLER_EX( IDCANCEL, BN_CLICKED, OnButton )
- MSG_WM_HSCROLL( OnChange )
- END_MSG_MAP()
- private:
- BOOL OnInitDialog(CWindow, LPARAM)
- {
- CWindow w;
- slider_pole = GetDlgItem(IDC_DCPOLE);
- slider_pole.SetRangeMin(PoleMin);
- slider_pole.SetRangeMax(PoleMax);
- {
- int p_pole;
- dsp_dcblocker::parse_preset( p_pole, m_initData );
- slider_pole.SetPos(p_pole);
- RefreshLabel(p_pole);
- }
- return TRUE;
- }
- void OnButton( UINT, int id, CWindow )
- {
- EndDialog( id );
- }
- void OnChange( UINT, int id, CWindow )
- {
- CWindow w;
- int p_pole;
- p_pole = slider_pole.GetPos();
- {
- dsp_preset_impl preset;
- dsp_dcblocker::make_preset( p_pole, preset );
- m_callback.on_preset_changed( preset );
- }
- RefreshLabel(p_pole);
- }
- void RefreshLabel( int p_pole )
- {
- pfc::string_formatter msg;
- msg << "Pole: ";
- msg << pfc::format_float( p_pole / 1000.0f, 0, 3 );
- ::uSetDlgItemText( *this, IDC_DCPOLEINFO, msg );
- }
- const dsp_preset & m_initData; // modal dialog so we can reference this caller-owned object.
- dsp_preset_edit_callback & m_callback;
- CTrackBarCtrl slider_pole;
- };
- static void RunConfigPopup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback )
- {
- CMyDSPPopupDCBlocker popup( p_data, p_callback );
- if ( popup.DoModal(p_parent) != IDOK ) p_callback.on_preset_changed( p_data );
- }
- static dsp_factory_t<dsp_dcblocker> g_dsp_dcblocker_factory;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement