summaryrefslogtreecommitdiffstats
path: root/arts/tools/fftscopeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arts/tools/fftscopeview.cpp')
-rw-r--r--arts/tools/fftscopeview.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/arts/tools/fftscopeview.cpp b/arts/tools/fftscopeview.cpp
new file mode 100644
index 00000000..cb4c2acc
--- /dev/null
+++ b/arts/tools/fftscopeview.cpp
@@ -0,0 +1,163 @@
+/*
+
+ Copyright ( C ) 2000-2001 Stefan Westerfeld
+ <stefan@space.twc.de>
+ 2003 Arnold Krille <arnold@arnoldarts.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ ( at your option ) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+#include "fftscopeview.h"
+
+#include <qlayout.h>
+#include <qcursor.h>
+#include <qtimer.h>
+#include <kaction.h>
+#include <kpopupmenu.h>
+#include <kartswidget.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kiconloader.h>
+
+#include "artsactions.h"
+
+using namespace std;
+using namespace Arts;
+
+FFTScopeView::FFTScopeView( SimpleSoundServer server, QWidget* parent )
+ : Template_ArtsView( parent )
+ , server( server )
+ , scopeData( 0 )
+{
+kdDebug()<<k_funcinfo<<endl;
+ this->setCaption( i18n( "FFT Scope View" ) );
+ this->setIcon( MainBarIcon( "artsfftscope", 32 ) );
+ /*
+ create a stereo fft scope on the server and push it into the
+ effect chain
+ */
+ {
+ scopefx = DynamicCast( server.createObject( "Arts::StereoFFTScope" ) );
+ assert( !scopefx.isNull() );
+ scopefx.start();
+
+ // put it into the effect chain
+ effectID = server.outstack().insertBottom( scopefx,"FFT Scope" );
+ }
+
+ updateScopeData();
+ QBoxLayout * l = new QHBoxLayout( this );
+ l->setAutoAdd( TRUE );
+
+ for ( unsigned int i=0;i<scopeData->size();i++ )
+ {
+ LevelMeter tmp;
+ tmp.count( 20 );
+ scopeScales.push_back( tmp );
+ scopeDraw.push_back( 0.0 );
+ KArtsWidget *w = new KArtsWidget( tmp, this );
+ aw.push_back( w );
+ }
+
+ l->activate();
+ show();
+
+ updatetimer = new QTimer( this );
+ updatetimer->start( 100 );
+ connect( updatetimer,SIGNAL( timeout() ),this,SLOT( updateScope() ) );
+
+ _artsactions = new ArtsActions( 0, 0, this );
+ _moreBars = ArtsActions::actionMoreBars( this, SLOT( moreBars() ), 0 );
+ _lessBars = ArtsActions::actionLessBars( this, SLOT( lessBars() ), 0 );
+ _menu = new KPopupMenu( 0 );
+ _moreBars->plug( _menu ); _lessBars->plug( _menu );
+ _substyle = new KAction( i18n( "Substyle" ), "", KShortcut(), this, SLOT( substyle() ), this );
+ _substyle->plug( _menu );
+ _menu->insertItem( i18n("VU-Style"), _artsactions->stylemenu() );
+
+ connect( _artsactions, SIGNAL( styleNormal() ), this, SLOT( styleNormalBars() ) );
+ connect( _artsactions, SIGNAL( styleFire() ), this, SLOT( styleFireBars() ) );
+ connect( _artsactions, SIGNAL( styleLine() ), this, SLOT( styleLineBars() ) );
+ connect( _artsactions, SIGNAL( styleLED() ), this, SLOT( styleLEDs() ) );
+ connect( _artsactions, SIGNAL( styleAnalog() ), this, SLOT( styleAnalog() ) );
+ connect( _artsactions, SIGNAL( styleSmall() ), this, SLOT( styleSmall() ) );
+}
+
+FFTScopeView::~FFTScopeView() {
+kdDebug()<<"FFTScopeView::~FFTScopeView()"<<endl;
+ updatetimer->stop();
+ for ( int i=int( aw.size() )-1; i>=0; i-- ) { scopeScales[ i ].hide(); delete aw[ i ]; aw.pop_back(); scopeScales.pop_back(); }
+ server.outstack().remove( effectID );
+kdDebug()<<"FFTScopeView is gone..."<<endl;
+}
+
+void FFTScopeView::updateScopeData() {
+ if ( scopeData ) delete scopeData;
+ scopeData = scopefx.scope();
+}
+
+void FFTScopeView::updateScope() {
+ updateScopeData();
+
+ for ( unsigned int i=0;i<scopeData->size();i++ )
+ {
+// scopeDraw[ i ] /= 1.25;
+// if ( ( *scopeData )[ i ] > scopeDraw[ i ] ) scopeDraw[ i ] = ( *scopeData )[ i ];
+ scopeDraw[ i ] = ( *scopeData )[ i ];
+ scopeScales[ i ].invalue( scopeDraw[ i ] );
+ }
+}
+
+void FFTScopeView::mousePressEvent( QMouseEvent* ev ) {
+ if ( Qt::RightButton == ev->button() /*|| Qt::LeftButton == ev->button()*/ )
+ _menu->exec( QCursor::pos() );
+}
+
+void FFTScopeView::moreBars() {
+ int bars = scopeScales[ 0 ].count() + 10;
+ for ( unsigned int i=0;i<scopeData->size();i++ )
+ scopeScales[ i ].count( bars );
+}
+
+void FFTScopeView::lessBars() {
+ int bars = scopeScales[ 0 ].count() - 10;
+ for ( unsigned int i=0;i<scopeData->size();i++ )
+ scopeScales[ i ].count( bars );
+}
+
+void FFTScopeView::setStyle( Arts::LevelMeterStyle style ) {
+ for ( uint i=0; i<scopeScales.size(); i++ )
+ scopeScales[ i ].style( style );
+}
+
+void FFTScopeView::styleNormalBars() { setStyle( Arts::lmNormalBars ); }
+void FFTScopeView::styleFireBars() { setStyle( Arts::lmFireBars ); }
+void FFTScopeView::styleLineBars() { setStyle( Arts::lmLineBars ); }
+void FFTScopeView::styleLEDs() { setStyle( Arts::lmLEDs ); }
+void FFTScopeView::styleAnalog() { setStyle( Arts::lmAnalog ); }
+void FFTScopeView::styleSmall() { setStyle( Arts::lmSmall ); }
+
+#include <kinputdialog.h>
+
+void FFTScopeView::substyle() {
+ int _substyle = KInputDialog::getInteger( i18n("Substyle"), i18n("Please enter substyle:"), 0, 0, 10, 1, 0, this );
+ for ( unsigned int i=0; i<scopeData->size(); i++ )
+ scopeScales[ i ].substyle( _substyle );
+}
+
+#include "fftscopeview.moc"
+// vim: sw=4 ts=4
+