Advertisement
Guest User

Untitled

a guest
Feb 5th, 2012
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1. #define _WIN32_WINNT 0x0501
  2. #include "../SDK/foobar2000.h"
  3. #include "../ATLHelpers/ATLHelpers.h"
  4. #include "resource.h"
  5. #include "iirfilters.h"
  6.  
  7. static void RunConfigPopup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback );
  8.  
  9. class dsp_dcblocker : public dsp_impl_base
  10. {
  11.     int m_rate, m_ch_mask;
  12.     unsigned int m_ch;
  13.     int p_pole;
  14.     audio_sample* prev_samples;
  15.  
  16. public:
  17.     static GUID g_get_guid()
  18.     {
  19.         // {6690B93B-DE14-4641-ADB1-6A7AC49E04A1}
  20.         static const GUID guid =
  21.         { 0x6690b93b, 0xde14, 0x4641, { 0xad, 0xb1, 0x6a, 0x7a, 0xc4, 0x9e, 0x4, 0xa1 } };
  22.  
  23.         return guid;
  24.     }
  25.  
  26.     dsp_dcblocker( dsp_preset const & in ) : m_rate( 0 ), m_ch( 0 ), m_ch_mask( 0 ), p_pole( 999 ), prev_samples( 0 )
  27.     {
  28.         parse_preset( p_pole, in );
  29.     }
  30.  
  31.     ~dsp_dcblocker()
  32.     {
  33.         if (prev_samples != 0)
  34.             delete[] prev_samples;
  35.     }
  36.  
  37.     static void g_get_name( pfc::string_base & p_out ) { p_out = "DC Blocker"; }
  38.  
  39.     bool on_chunk( audio_chunk * chunk, abort_callback & )
  40.     {
  41.         if ( chunk->get_srate() != m_rate || chunk->get_channels() != m_ch || chunk->get_channel_config() != m_ch_mask )
  42.         {
  43.             m_rate = chunk->get_srate();
  44.             m_ch = chunk->get_channels();
  45.             m_ch_mask = chunk->get_channel_config();
  46.  
  47.             if (prev_samples != 0)
  48.                 delete[] prev_samples;
  49.  
  50.             prev_samples = new audio_sample[m_ch];
  51.             for (unsigned int i = 0; i < m_ch; ++i)
  52.                 prev_samples[i] = 0;
  53.         }
  54.  
  55.        
  56.         const unsigned int samples_count = chunk->get_sample_count();
  57.         const float p = p_pole / 1000.0f;
  58.  
  59.         for ( unsigned i = 0; i < m_ch; i++ )
  60.         {
  61.             audio_sample * data = chunk->get_data() + i;
  62.            
  63.             for ( unsigned j = 0; j < samples_count; ++j)
  64.             {
  65.                 float m = *(data) + p * prev_samples[i];
  66.                 *(data) = m - prev_samples[i];
  67.                 prev_samples[i] = m;
  68.  
  69.                 data += m_ch;
  70.             }
  71.         }
  72.  
  73.         return true;
  74.     }
  75.  
  76.     void on_endofplayback( abort_callback & ) { }
  77.     void on_endoftrack( abort_callback & ) { }
  78.  
  79.     void flush()
  80.     {
  81.         m_rate = 0;
  82.         m_ch = 0;
  83.         m_ch_mask = 0;
  84.     }
  85.     double get_latency()
  86.     {
  87.         return 0;
  88.     }
  89.     bool need_track_change_mark()
  90.     {
  91.         return false;
  92.     }
  93.     static bool g_get_default_preset( dsp_preset & p_out )
  94.     {
  95.         make_preset( 999, p_out );
  96.         return true;
  97.     }
  98.     static void g_show_config_popup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback )
  99.     {
  100.         ::RunConfigPopup( p_data, p_parent, p_callback );
  101.     }
  102.     static bool g_have_config_popup() { return true; }
  103.  
  104.     static void make_preset( int p_pole, dsp_preset & out )
  105.     {
  106.         dsp_preset_builder builder;
  107.         builder << p_pole;
  108.         builder.finish( g_get_guid(), out );
  109.     }                        
  110.     static void parse_preset(int & p_pole, const dsp_preset & in)
  111.     {
  112.         try
  113.         {
  114.             dsp_preset_parser parser(in);
  115.             parser >> p_pole;
  116.         }
  117.         catch(exception_io_data) { p_pole=999; }
  118.     }
  119. };
  120.  
  121. class CMyDSPPopupDCBlocker : public CDialogImpl<CMyDSPPopupDCBlocker>
  122. {
  123. public:
  124.     CMyDSPPopupDCBlocker( const dsp_preset & initData, dsp_preset_edit_callback & callback ) : m_initData( initData ), m_callback( callback ) { }
  125.     enum { IDD = IDD_DCBLOCKER };
  126.  
  127.     enum
  128.     {
  129.         PoleMin = 900,
  130.         PoleMax = 999,
  131.         PoleRangeTotal = PoleMax
  132.     };
  133.  
  134.     BEGIN_MSG_MAP( CMyDSPPopup )
  135.         MSG_WM_INITDIALOG( OnInitDialog )
  136.         COMMAND_HANDLER_EX( IDOK, BN_CLICKED, OnButton )
  137.         COMMAND_HANDLER_EX( IDCANCEL, BN_CLICKED, OnButton )
  138.         MSG_WM_HSCROLL( OnChange )
  139.     END_MSG_MAP()
  140.  
  141. private:
  142.  
  143.     BOOL OnInitDialog(CWindow, LPARAM)
  144.     {
  145.         CWindow w;
  146.  
  147.         slider_pole = GetDlgItem(IDC_DCPOLE);
  148.         slider_pole.SetRangeMin(PoleMin);
  149.         slider_pole.SetRangeMax(PoleMax);
  150.         {
  151.             int p_pole;
  152.             dsp_dcblocker::parse_preset( p_pole, m_initData );
  153.  
  154.             slider_pole.SetPos(p_pole);
  155.             RefreshLabel(p_pole);
  156.  
  157.         }
  158.         return TRUE;
  159.     }
  160.  
  161.     void OnButton( UINT, int id, CWindow )
  162.     {
  163.         EndDialog( id );
  164.     }
  165.  
  166.     void OnChange( UINT, int id, CWindow )
  167.     {
  168.         CWindow w;
  169.         int p_pole;
  170.         p_pole = slider_pole.GetPos();
  171.         {
  172.             dsp_preset_impl preset;
  173.             dsp_dcblocker::make_preset( p_pole, preset );
  174.             m_callback.on_preset_changed( preset );
  175.         }
  176.         RefreshLabel(p_pole);
  177.        
  178.     }
  179.  
  180.     void RefreshLabel( int p_pole )
  181.     {
  182.         pfc::string_formatter msg;
  183.         msg << "Pole: ";
  184.         msg << pfc::format_float( p_pole / 1000.0f, 0, 3 );
  185.         ::uSetDlgItemText( *this, IDC_DCPOLEINFO, msg );
  186.     }
  187.  
  188.     const dsp_preset & m_initData; // modal dialog so we can reference this caller-owned object.
  189.     dsp_preset_edit_callback & m_callback;
  190.     CTrackBarCtrl slider_pole;
  191. };
  192.  
  193. static void RunConfigPopup( const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback )
  194. {
  195.     CMyDSPPopupDCBlocker popup( p_data, p_callback );
  196.     if ( popup.DoModal(p_parent) != IDOK ) p_callback.on_preset_changed( p_data );
  197. }
  198.  
  199.  
  200. static dsp_factory_t<dsp_dcblocker> g_dsp_dcblocker_factory;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement