You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
codeine/src/app/analyzer.cpp

132 lines
2.7 KiB

// (c) 2004 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information
#include "analyzer.h"
#include "codeine.h"
#include "debug.h"
#include <math.h> //interpolate()
#include <ntqevent.h> //event()
#include "xineEngine.h"
#include "fht.cpp"
template<class W>
Analyzer::Base<W>::Base( TQWidget *parent, uint timeout )
: W( parent, "Analyzer" )
, m_timeout( timeout )
{}
template<class W> bool
Analyzer::Base<W>::event( TQEvent *e )
{
switch( e->type() ) {
case TQEvent::Hide:
m_timer.stop();
break;
case TQEvent::Show:
m_timer.start( timeout() );
break;
default:
;
}
return TQWidget::event( e );
}
Analyzer::Base2D::Base2D( TQWidget *parent, uint timeout )
: Base<TQWidget>( parent, timeout )
{
setWFlags( TQt::WNoAutoErase ); //no flicker
connect( &m_timer, SIGNAL(timeout()), SLOT(draw()) );
}
void
Analyzer::Base2D::draw()
{
switch( Codeine::engine()->state() ) {
case Engine::Playing:
{
const Engine::Scope &thescope = Codeine::engine()->scope();
static Analyzer::Scope scope( Analyzer::SCOPE_SIZE );
for( int x = 0; x < Analyzer::SCOPE_SIZE; ++x )
scope[x] = double(thescope[x]) / (1<<15);
transform( scope );
analyze( scope );
scope.resize( Analyzer::SCOPE_SIZE );
bitBlt( this, 0, 0, canvas() );
break;
}
case Engine::Paused:
break;
default:
erase();
}
}
void
Analyzer::Base2D::resizeEvent( TQResizeEvent* )
{
m_canvas.resize( size() );
m_canvas.fill( colorGroup().background() );
}
// Author: Max Howell <max.howell@methylblue.com>, (C) 2003
// Copyright: See COPYING file that comes with this distribution
#include <ntqpainter.h>
Analyzer::Block::Block( TQWidget *parent )
: Analyzer::Base2D( parent, 20 )
{
setMinimumWidth( 64 ); //-1 is padding, no drawing takes place there
setMaximumWidth( 128 );
//TODO yes, do height for width
}
void
Analyzer::Block::transform( Analyzer::Scope &scope ) //pure virtual
{
static FHT fht( Analyzer::SCOPE_SIZE_EXP );
for( uint x = 0; x < scope.size(); ++x )
scope[x] *= 2;
float *front = static_cast<float*>( &scope.front() );
fht.spectrum( front );
fht.scale( front, 1.0 / 40 );
}
#include <math.h>
void
Analyzer::Block::analyze( const Analyzer::Scope &s )
{
canvas()->fill( colorGroup().foreground().light() );
TQPainter p( canvas() );
p.setPen( colorGroup().background() );
const double F = double(height()) / (log10( 256 ) * 1.1 /*<- max. amplitude*/);
for( uint x = 0; x < s.size(); ++x )
//we draw the blank bit
p.drawLine( x, 0, x, int(height() - log10( s[x] * 256.0 ) * F) );
}
int
Analyzer::Block::heightForWidth( int w ) const
{
return w / 2;
}