diff --git a/ChangeLog b/ChangeLog index 293c38528..e13faa50b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,19 @@ +2008-01-04 Tobias Doerffel + + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/audio_file_processor/audio_file_processor.h: + made plugin work with M/V-architecture + + * include/engine.h: + * include/plugin.h: + * src/core/engine.cpp: + fixes regarding coding style guidelines + 2008-01-02 Tobias Doerffel * plugins/kicker/kicker.cpp: * plugins/kicker/kicker.h: - make plugin work with M/V-architecture + made plugin work with M/V-architecture * include/instrument.h: * include/dummy_instrument.h: diff --git a/include/engine.h b/include/engine.h index ab9decf3d..601c70536 100644 --- a/include/engine.h +++ b/include/engine.h @@ -101,19 +101,19 @@ public: static float framesPerTact64th( void ) { - return( s_frames_per_tact64th ); + return( s_framesPerTact64th ); } static void updateFramesPerTact64th( void ); static const QMap & sampleExtensions( void ) { - return( s_sample_extensions ); + return( s_sampleExtensions ); } private: static bool s_hasGUI; - static float s_frames_per_tact64th; + static float s_framesPerTact64th; static mixer * s_mixer; static mainWindow * s_mainWindow; @@ -125,9 +125,9 @@ private: static projectJournal * s_projectJournal; static ladspa2LMMS * s_ladspaManager; - static QMap s_sample_extensions; + static QMap s_sampleExtensions; - static void load_extensions( void ); + static void loadExtensions( void ); } ; diff --git a/include/plugin.h b/include/plugin.h index 791808690..5cea2a568 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -91,7 +91,8 @@ public: desc( NULL ) { const QList l = - base64::decode( _dump_data, QVariant::List ). + base64::decode( _dump_data, + QVariant::List ). toList(); if( l.empty() ) { diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 0c061c3d4..b8c519d05 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -31,18 +31,16 @@ #include "audio_file_processor.h" +#include "automatable_model_templates.h" #include "engine.h" #include "song_editor.h" #include "instrument_track.h" #include "note_play_handle.h" #include "interpolation.h" #include "gui_templates.h" -#include "pixmap_button.h" -#include "knob.h" #include "tooltip.h" #include "string_pair_drag.h" #include "mmp.h" -#include "volume_knob.h" #undef SINGLE_SOURCE_COMPILE @@ -70,120 +68,31 @@ plugin::descriptor audiofileprocessor_plugin_descriptor = } -QPixmap * audioFileProcessor::s_artwork = NULL; -audioFileProcessor::audioFileProcessor( instrumentTrack * _channel_track ) : - instrument( _channel_track, &audiofileprocessor_plugin_descriptor ) +audioFileProcessor::audioFileProcessor( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &audiofileprocessor_plugin_descriptor ), + m_sampleBuffer(), + m_ampModel( 100, 0, 500, 1, this ), + m_startPointModel( 0, 0, 1, 0.0000001f, this ), + m_endPointModel( 1, 0, 1, 0.0000001f, this ), + m_reverseModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), + m_loopModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ) { - connect( &m_sampleBuffer, SIGNAL( sampleUpdated() ), this, - SLOT( sampleUpdated() ) ); - - if( s_artwork == NULL ) - { - s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - } - - - m_openAudioFileButton = new pixmapButton( this, NULL, NULL ); - m_openAudioFileButton->setCursor( QCursor( Qt::PointingHandCursor ) ); - m_openAudioFileButton->move( 200, 90 ); - m_openAudioFileButton->setActiveGraphic( embed::getIconPixmap( - "project_open_down" ) ); - m_openAudioFileButton->setInactiveGraphic( embed::getIconPixmap( - "project_open" ) ); - connect( m_openAudioFileButton, SIGNAL( clicked() ), this, - SLOT( openAudioFile() ) ); - toolTip::add( m_openAudioFileButton, tr( "Open other sample" ) ); - - m_openAudioFileButton->setWhatsThis( - tr( "Click here, if you want to open another audio-file. After " - "clicking on this button, a file-open-dialog appears " - "and you can select your file. Settings like Looping-" - "Mode, start- and end-point, amplify-value and so on " - "are not reset, so please don't wonder if your sample " - "doesn't sound like the original one..." ) ); - - m_reverseButton = new pixmapButton( this, NULL, NULL ); - m_reverseButton->setCheckable( TRUE ); - m_reverseButton->move( 160, 124 ); - m_reverseButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "reverse_on" ) ); - m_reverseButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "reverse_off" ) ); - connect( m_reverseButton, SIGNAL( toggled( bool ) ), this, - SLOT( reverseBtnToggled( bool ) ) ); - toolTip::add( m_reverseButton, tr( "Reverse sample" ) ); - m_reverseButton->setWhatsThis( - tr( "If you enable this button, the whole sample is reversed. " - "This is useful for cool effects, e.g. a reversed " - "crash." ) ); - - m_loopButton = new pixmapButton( this, tr( "Loop" ), _channel_track ); - m_loopButton->setCheckable( TRUE ); - m_loopButton->move( 180, 124 ); - m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_on" ) ); - m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_off" ) ); - toolTip::add( m_loopButton, - tr( "Loop sample at start- and end-point" ) ); - m_loopButton->setWhatsThis( - tr( "Here you can set, whether Looping-Mode is enabled. If " - "enabled, AudioFileProcessor loops between start- and " - "end-point of a sample until the whole note is played. " - "This is useful for things like string- and choir-" - "samples." ) ); - - m_ampKnob = new volumeKnob( knobDark_28, this, tr( "Amplify" ), NULL ); - m_ampKnob->setRange( 0, 500, 1.0f ); - m_ampKnob->move( 6, 114 ); - m_ampKnob->setInitValue( 100.0f ); - m_ampKnob->setHintText( tr( "Amplify:" )+" ", "%" ); - m_ampKnob->setLabel( tr( "AMP" ) ); - connect( m_ampKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( ampKnobChanged( float ) ) ); - m_ampKnob->setWhatsThis( - tr( "With this knob you can set the amplify-ratio. When you " - "set a value of 100% your sample isn't changed. " - "Otherwise it will be amplified up or down (your " - "actual sample-file isn't touched!)" ) ); - - m_startKnob = new knob( knobDark_28, this, tr( "Start of sample" ), - _channel_track ); - m_startKnob->setRange( 0.0f, 1.0f, 0.00001f ); - m_startKnob->move( 46, 114 ); - m_startKnob->setInitValue( 0.0f ); - m_startKnob->setHintText( tr( "Startpoint:" )+" ", "" ); - m_startKnob->setLabel( tr( "START" ) ); - connect( m_startKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( startKnobChanged( float ) ) ); - m_startKnob->setWhatsThis( - tr( "With this knob you can set the point where " - "AudioFileProcessor should begin playing your sample. " - "If you enable Looping-Mode, this is the point to " - "which AudioFileProcessor returns if a note is longer " - "than the sample between start- and end-point." ) ); - - m_endKnob = new knob( knobDark_28, this, tr( "End of sample" ), - _channel_track ); - m_endKnob->setRange( 0.0f, 1.0f, 0.00001f ); - m_endKnob->move( 84, 114 ); - m_endKnob->setInitValue( 1.0f ); - m_endKnob->setHintText( tr( "Endpoint:" )+" ", "" ); - m_endKnob->setLabel( tr( "END" ) ); - connect( m_endKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( endKnobChanged( float ) ) ); - m_endKnob->setWhatsThis( - tr( "With this knob you can set the point where " - "AudioFileProcessor should stop playing your sample. " - "If you enable Looping-Mode, this is the point where " - "AudioFileProcessor returns if a note is longer than " - "the sample between start- and end-point." ) ); - - setAcceptDrops( TRUE ); + connect( &m_reverseModel, SIGNAL( dataChanged() ), + this, SLOT( reverseModelChanged() ) ); + connect( &m_ampModel, SIGNAL( dataChanged() ), + this, SLOT( ampModelChanged() ) ); + connect( &m_startPointModel, SIGNAL( dataChanged() ), + this, SLOT( startPointModelChanged() ) ); + connect( &m_endPointModel, SIGNAL( dataChanged() ), + this, SLOT( endPointModelChanged() ) ); + m_ampModel.setTrack( _instrument_track ); + m_startPointModel.setTrack( _instrument_track ); + m_endPointModel.setTrack( _instrument_track ); + m_reverseModel.setTrack( _instrument_track ); + m_loopModel.setTrack( _instrument_track ); } @@ -196,6 +105,37 @@ audioFileProcessor::~audioFileProcessor() +void audioFileProcessor::playNote( notePlayHandle * _n, bool ) +{ + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + sampleFrame * buf = new sampleFrame[frames]; + + if( !_n->m_pluginData ) + { + _n->m_pluginData = new handleState( _n->hasDetuningInfo() ); + } + + if( m_sampleBuffer.play( buf, (handleState *)_n->m_pluginData, + frames, _n->frequency(), + m_loopModel.value() ) == TRUE ) + { + applyRelease( buf, _n ); + getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); + } + delete[] buf; +} + + + + +void audioFileProcessor::deleteNotePluginData( notePlayHandle * _n ) +{ + delete (handleState *)_n->m_pluginData; +} + + + + void audioFileProcessor::saveSettings( QDomDocument & _doc, QDomElement & _this ) { @@ -203,13 +143,14 @@ void audioFileProcessor::saveSettings( QDomDocument & _doc, if( m_sampleBuffer.audioFile() == "" ) { QString s; - _this.setAttribute( "sampledata", m_sampleBuffer.toBase64( s ) ); + _this.setAttribute( "sampledata", + m_sampleBuffer.toBase64( s ) ); } - m_reverseButton->saveSettings( _doc, _this, "reversed" ); - m_loopButton->saveSettings( _doc, _this, "looped" ); - m_ampKnob->saveSettings( _doc, _this, "amp" ); - m_startKnob->saveSettings( _doc, _this, "sframe" ); - m_endKnob->saveSettings( _doc, _this, "eframe" ); + m_reverseModel.saveSettings( _doc, _this, "reversed" ); + m_loopModel.saveSettings( _doc, _this, "looped" ); + m_ampModel.saveSettings( _doc, _this, "amp" ); + m_startPointModel.saveSettings( _doc, _this, "sframe" ); + m_endPointModel.saveSettings( _doc, _this, "eframe" ); } @@ -225,14 +166,14 @@ void audioFileProcessor::loadSettings( const QDomElement & _this ) { m_sampleBuffer.loadFromBase64( _this.attribute( "srcdata" ) ); } - m_reverseButton->loadSettings( _this, "reversed" ); - m_loopButton->loadSettings( _this, "looped" ); - m_ampKnob->loadSettings( _this, "amp" ); - m_startKnob->loadSettings( _this, "sframe" ); - m_endKnob->loadSettings( _this, "eframe" ); + m_reverseModel.loadSettings( _this, "reversed" ); + m_loopModel.loadSettings( _this, "looped" ); + m_ampModel.loadSettings( _this, "amp" ); + m_startPointModel.loadSettings( _this, "sframe" ); + m_endPointModel.loadSettings( _this, "eframe" ); - startKnobChanged( m_startKnob->value() ); - endKnobChanged( m_endKnob->value() ); + startPointModelChanged(); + endPointModelChanged(); } @@ -275,7 +216,16 @@ Uint32 audioFileProcessor::getBeatLen( notePlayHandle * _n ) const -void audioFileProcessor::setAudioFile( const QString & _audio_file, bool _rename ) +instrumentView * audioFileProcessor::createView( QWidget * _parent ) +{ + return( new audioFileProcessorView( this, _parent ) ); +} + + + + +void audioFileProcessor::setAudioFile( const QString & _audio_file, + bool _rename ) { // is current channel-name equal to previous-filename?? if( _rename && @@ -287,49 +237,210 @@ void audioFileProcessor::setAudioFile( const QString & _audio_file, bool _rename getInstrumentTrack()->setName( QFileInfo( _audio_file ).fileName() ); } - // else we don't touch the channel-name, because the user named it self + // else we don't touch the track-name, because the user named it self m_sampleBuffer.setAudioFile( _audio_file ); - startKnobChanged( m_startKnob->value() ); - endKnobChanged( m_endKnob->value() ); + startPointModelChanged(); + endPointModelChanged(); +} + + + + +void audioFileProcessor::reverseModelChanged( void ) +{ + m_sampleBuffer.setReversed( m_reverseModel.value() ); +} + + + + +void audioFileProcessor::ampModelChanged( void ) +{ + m_sampleBuffer.setAmplification( m_ampModel.value() / 100.0f ); +} + + + + +void audioFileProcessor::startPointModelChanged( void ) +{ + if( m_startPointModel.value() < m_endPointModel.value() ) + { + m_sampleBuffer.setStartFrame( static_cast( + m_startPointModel.value() * + m_sampleBuffer.frames() ) ); + } + else + { + m_startPointModel.setValue( m_endPointModel.value() - 0.01f ); + } + emit dataChanged(); +} + + + + +void audioFileProcessor::endPointModelChanged( void ) +{ + if( m_endPointModel.value() > m_startPointModel.value() ) + { + if( m_endPointModel.value() * m_sampleBuffer.frames() >= 1.0f ) + { + m_sampleBuffer.setEndFrame( static_cast( + m_endPointModel.value() * + m_sampleBuffer.frames() ) - 1 ); + } + else + { + m_sampleBuffer.setEndFrame( 0 ); + } + } + else + { + m_endPointModel.setValue( m_startPointModel.value() + 0.01f ); + } + emit dataChanged(); } -void audioFileProcessor::playNote( notePlayHandle * _n, bool ) -{ - const fpp_t frames = _n->framesLeftForCurrentPeriod(); - sampleFrame * buf = new sampleFrame[frames]; - if( !_n->m_pluginData ) + + +audioFileProcessor::subPluginFeatures::subPluginFeatures( + plugin::pluginTypes _type ) : + plugin::descriptor::subPluginFeatures( _type ) +{ +} + + + + +const QStringList & audioFileProcessor::subPluginFeatures::supportedExtensions( + void ) +{ + static QStringList extensions = QStringList() + << "wav" << "ogg" << "ds" << "spx" << "au" + << "voc" << "aif" << "aiff" << "flac" << "raw"; + return( extensions ); +} + + + + + + + +QPixmap * audioFileProcessorView::s_artwork = NULL; + + +audioFileProcessorView::audioFileProcessorView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + if( s_artwork == NULL ) { - _n->m_pluginData = new handleState( _n->hasDetuningInfo() ); + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); } - if( m_sampleBuffer.play( buf, (handleState *)_n->m_pluginData, - frames, _n->frequency(), - m_loopButton->isChecked() ) == TRUE ) - { - applyRelease( buf, _n ); - getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); - } - delete[] buf; + m_openAudioFileButton = new pixmapButton( this, NULL ); + m_openAudioFileButton->setCursor( QCursor( Qt::PointingHandCursor ) ); + m_openAudioFileButton->move( 200, 90 ); + m_openAudioFileButton->setActiveGraphic( embed::getIconPixmap( + "project_open_down" ) ); + m_openAudioFileButton->setInactiveGraphic( embed::getIconPixmap( + "project_open" ) ); + connect( m_openAudioFileButton, SIGNAL( clicked() ), + this, SLOT( openAudioFile() ) ); + toolTip::add( m_openAudioFileButton, tr( "Open other sample" ) ); + + m_openAudioFileButton->setWhatsThis( + tr( "Click here, if you want to open another audio-file. After " + "clicking on this button, a file-open-dialog appears " + "and you can select your file. Settings like Looping-" + "Mode, start- and end-point, amplify-value and so on " + "are not reset, so please don't wonder if your sample " + "doesn't sound like the original one..." ) ); + + m_reverseButton = new pixmapButton( this, NULL ); + m_reverseButton->setCheckable( TRUE ); + m_reverseButton->move( 160, 124 ); + m_reverseButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "reverse_on" ) ); + m_reverseButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "reverse_off" ) ); + toolTip::add( m_reverseButton, tr( "Reverse sample" ) ); + m_reverseButton->setWhatsThis( + tr( "If you enable this button, the whole sample is reversed. " + "This is useful for cool effects, e.g. a reversed " + "crash." ) ); + + m_loopButton = new pixmapButton( this, tr( "Loop" ) ); + m_loopButton->setCheckable( TRUE ); + m_loopButton->move( 180, 124 ); + m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_on" ) ); + m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_off" ) ); + toolTip::add( m_loopButton, + tr( "Loop sample at start- and end-point" ) ); + m_loopButton->setWhatsThis( + tr( "Here you can set, whether Looping-Mode is enabled. If " + "enabled, AudioFileProcessor loops between start- and " + "end-point of a sample until the whole note is played. " + "This is useful for things like string- and choir-" + "samples." ) ); + + m_ampKnob = new volumeKnob( knobDark_28, this, tr( "Amplify" ) ); + m_ampKnob->move( 6, 114 ); + m_ampKnob->setHintText( tr( "Amplify:" )+" ", "%" ); + m_ampKnob->setLabel( tr( "AMP" ) ); + m_ampKnob->setWhatsThis( + tr( "With this knob you can set the amplify-ratio. When you " + "set a value of 100% your sample isn't changed. " + "Otherwise it will be amplified up or down (your " + "actual sample-file isn't touched!)" ) ); + + m_startKnob = new knob( knobDark_28, this, tr( "Start of sample" ) ); + m_startKnob->move( 46, 114 ); + m_startKnob->setHintText( tr( "Startpoint:" )+" ", "" ); + m_startKnob->setLabel( tr( "START" ) ); + m_startKnob->setWhatsThis( + tr( "With this knob you can set the point where " + "AudioFileProcessor should begin playing your sample. " + "If you enable Looping-Mode, this is the point to " + "which AudioFileProcessor returns if a note is longer " + "than the sample between start- and end-point." ) ); + + m_endKnob = new knob( knobDark_28, this, tr( "End of sample" ) ); + m_endKnob->move( 84, 114 ); + m_endKnob->setHintText( tr( "Endpoint:" )+" ", "" ); + m_endKnob->setLabel( tr( "END" ) ); + m_endKnob->setWhatsThis( + tr( "With this knob you can set the point where " + "AudioFileProcessor should stop playing your sample. " + "If you enable Looping-Mode, this is the point where " + "AudioFileProcessor returns if a note is longer than " + "the sample between start- and end-point." ) ); + + setAcceptDrops( TRUE ); } -void audioFileProcessor::deleteNotePluginData( notePlayHandle * _n ) +audioFileProcessorView::~audioFileProcessorView() { - delete (handleState *)_n->m_pluginData; } -void audioFileProcessor::dragEnterEvent( QDragEnterEvent * _dee ) +void audioFileProcessorView::dragEnterEvent( QDragEnterEvent * _dee ) { if( _dee->mimeData()->hasFormat( stringPairDrag::mimeType() ) ) { @@ -358,21 +469,21 @@ void audioFileProcessor::dragEnterEvent( QDragEnterEvent * _dee ) -void audioFileProcessor::dropEvent( QDropEvent * _de ) +void audioFileProcessorView::dropEvent( QDropEvent * _de ) { QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); if( type == "samplefile" ) { - setAudioFile( value ); + castModel()->setAudioFile( value ); _de->accept(); return; } else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) ) { multimediaProject mmp( value, FALSE ); - setAudioFile( mmp.content().firstChild().toElement(). - attribute( "src" ) ); + castModel()->setAudioFile( mmp.content(). + firstChild().toElement().attribute( "src" ) ); _de->accept(); return; } @@ -383,15 +494,16 @@ void audioFileProcessor::dropEvent( QDropEvent * _de ) -void audioFileProcessor::paintEvent( QPaintEvent * ) +void audioFileProcessorView::paintEvent( QPaintEvent * ) { QPainter p( this ); p.drawPixmap( 0, 0, *s_artwork ); + audioFileProcessor * a = castModel(); QString file_name = ""; - Uint16 idx = m_sampleBuffer.audioFile().length(); + Uint16 idx = a->m_sampleBuffer.audioFile().length(); p.setFont( pointSize<8>( font() ) ); @@ -402,7 +514,7 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) while( idx > 0 && fm.size( Qt::TextSingleLine, file_name + "..." ).width() < 210 ) { - file_name = m_sampleBuffer.audioFile()[--idx] + file_name; + file_name = a->m_sampleBuffer.audioFile()[--idx] + file_name; } if( idx > 0 ) @@ -418,11 +530,11 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); const QRect graph_rect( 4, 174, 241, 70 ); - const f_cnt_t frames = tMax( m_sampleBuffer.frames(), + const f_cnt_t frames = tMax( a->m_sampleBuffer.frames(), static_cast( 1 ) ); - const Uint16 start_frame_x = m_sampleBuffer.startFrame() * + const Uint16 start_frame_x = a->m_sampleBuffer.startFrame() * graph_rect.width() / frames; - const Uint16 end_frame_x = m_sampleBuffer.endFrame() * + const Uint16 end_frame_x = a->m_sampleBuffer.endFrame() * ( graph_rect.width() - 1 ) / frames; p.drawLine( start_frame_x + graph_rect.x(), graph_rect.y(), @@ -437,13 +549,14 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) -void audioFileProcessor::sampleUpdated( void ) +void audioFileProcessorView::sampleUpdated( void ) { m_graph = QPixmap( 245, 75 ); m_graph.fill( Qt::transparent ); QPainter p( &m_graph ); p.setPen( QColor( 64, 255, 160 ) ); - m_sampleBuffer.visualize( p, QRect( 2, 2, m_graph.width() - 4, + castModel()->m_sampleBuffer. + visualize( p, QRect( 2, 2, m_graph.width() - 4, m_graph.height() - 4 ) ); update(); } @@ -451,71 +564,14 @@ void audioFileProcessor::sampleUpdated( void ) -void audioFileProcessor::reverseBtnToggled( bool _on ) + +void audioFileProcessorView::openAudioFile( void ) { - m_sampleBuffer.setReversed( _on ); - engine::getSongEditor()->setModified(); -} - - - - -void audioFileProcessor::ampKnobChanged( float _val ) -{ - m_sampleBuffer.setAmplification( _val / 100.0f ); -} - - - - -void audioFileProcessor::startKnobChanged( float _new_value ) -{ - if( _new_value < m_endKnob->value() ) - { - m_sampleBuffer.setStartFrame( static_cast( _new_value * - m_sampleBuffer.frames() ) ); - } - else - { - m_startKnob->setValue( m_endKnob->value() - 0.01f ); - } - update(); -} - - - - -void audioFileProcessor::endKnobChanged( float _new_value ) -{ - if( _new_value > m_startKnob->value() ) - { - if( _new_value * m_sampleBuffer.frames() >= 1.0f ) - { - m_sampleBuffer.setEndFrame( static_cast( - _new_value * - m_sampleBuffer.frames() ) - 1 ); - } - else - { - m_sampleBuffer.setEndFrame( 0 ); - } - } - else - { - m_endKnob->setValue( m_startKnob->value() + 0.01f ); - } - update(); -} - - - - -void audioFileProcessor::openAudioFile( void ) -{ - QString af = m_sampleBuffer.openAudioFile(); + QString af = castModel()->m_sampleBuffer. + openAudioFile(); if( af != "" ) { - setAudioFile( af ); + castModel()->setAudioFile( af ); engine::getSongEditor()->setModified(); } } @@ -523,30 +579,22 @@ void audioFileProcessor::openAudioFile( void ) - - - - -audioFileProcessor::subPluginFeatures::subPluginFeatures( - plugin::pluginTypes _type ) : - plugin::descriptor::subPluginFeatures( _type ) +void audioFileProcessorView::modelChanged( void ) { + audioFileProcessor * a = castModel(); + connect( &a->m_sampleBuffer, SIGNAL( sampleUpdated() ), + this, SLOT( sampleUpdated() ) ); + m_ampKnob->setModel( &a->m_ampModel ); + m_startKnob->setModel( &a->m_startPointModel ); + m_endKnob->setModel( &a->m_endPointModel ); + m_reverseButton->setModel( &a->m_reverseModel ); + m_loopButton->setModel( &a->m_loopModel ); + sampleUpdated(); } -const QStringList & audioFileProcessor::subPluginFeatures::supported_extensions( - void ) -{ - static QStringList extensions = QStringList() - << "wav" << "ogg" << "ds" << "spx" << "au" - << "voc" << "aif" << "aiff" << "flac" << "raw"; - return( extensions ); -} - - - extern "C" { diff --git a/plugins/audio_file_processor/audio_file_processor.h b/plugins/audio_file_processor/audio_file_processor.h index 196721184..39c982226 100644 --- a/plugins/audio_file_processor/audio_file_processor.h +++ b/plugins/audio_file_processor/audio_file_processor.h @@ -31,12 +31,10 @@ #include "instrument.h" #include "sample_buffer.h" +#include "volume_knob.h" +#include "pixmap_button.h" -class knob; -class pixmapButton; -class volumeKnob; - class audioFileProcessor : public instrument { @@ -47,17 +45,12 @@ public: public: subPluginFeatures( plugin::pluginTypes _type ); - virtual const QStringList & supportedExtensions( void ) - { - return( supported_extensions() ); - } - - static const QStringList & supported_extensions( void ); + virtual const QStringList & supportedExtensions( void ); } ; - audioFileProcessor( instrumentTrack * _channel_track ); + audioFileProcessor( instrumentTrack * _instrument_track ); virtual ~audioFileProcessor(); virtual void FASTCALL playNote( notePlayHandle * _n, @@ -80,18 +73,49 @@ public: return( 128 ); } + virtual instrumentView * createView( QWidget * _parent ); + public slots: void setAudioFile( const QString & _audio_file, bool _rename = TRUE ); +private slots: + void reverseModelChanged( void ); + void ampModelChanged( void ); + void startPointModelChanged( void ); + void endPointModelChanged( void ); + + +private: + typedef sampleBuffer::handleState handleState; + + sampleBuffer m_sampleBuffer; + + knobModel m_ampModel; + knobModel m_startPointModel; + knobModel m_endPointModel; + boolModel m_reverseModel; + boolModel m_loopModel; + + + friend class audioFileProcessorView; + +} ; + + + +class audioFileProcessorView : public instrumentView +{ + Q_OBJECT +public: + audioFileProcessorView( instrument * _instrument, QWidget * _parent ); + virtual ~audioFileProcessorView(); + + protected slots: - void openAudioFile( void ); - void reverseBtnToggled( bool _on ); - void ampKnobChanged( float _new_value ); - void startKnobChanged( float _new_value ); - void endKnobChanged( float _new_value ); void sampleUpdated( void ); + void openAudioFile( void ); protected: @@ -101,13 +125,10 @@ protected: private: - typedef sampleBuffer::handleState handleState; + virtual void modelChanged( void ); static QPixmap * s_artwork; - - sampleBuffer m_sampleBuffer; - QPixmap m_graph; volumeKnob * m_ampKnob; knob * m_startKnob; @@ -116,10 +137,9 @@ private: pixmapButton * m_reverseButton; pixmapButton * m_loopButton; - - void updateSample( void ); - } ; + + #endif diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 103e8ec9c..13f121d04 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -41,7 +41,7 @@ bool engine::s_hasGUI = TRUE; -float engine::s_frames_per_tact64th; +float engine::s_framesPerTact64th; mixer * engine::s_mixer; mainWindow * engine::s_mainWindow; songEditor * engine::s_songEditor; @@ -51,7 +51,7 @@ pianoRoll * engine::s_pianoRoll; projectNotes * engine::s_projectNotes; projectJournal * engine::s_projectJournal; ladspa2LMMS * engine::s_ladspaManager; -QMap engine::s_sample_extensions; +QMap engine::s_sampleExtensions; @@ -60,7 +60,7 @@ void engine::init( const bool _has_gui ) { s_hasGUI = _has_gui; - load_extensions(); + loadExtensions(); s_projectJournal = new projectJournal; s_mainWindow = new mainWindow; @@ -119,14 +119,14 @@ void engine::destroy( void ) void engine::updateFramesPerTact64th( void ) { - s_frames_per_tact64th = s_mixer->sampleRate() * 60.0f * BEATS_PER_TACT + s_framesPerTact64th = s_mixer->sampleRate() * 60.0f * BEATS_PER_TACT / 64.0f / s_songEditor->getTempo(); } -void engine::load_extensions( void ) +void engine::loadExtensions( void ) { QVector pluginDescriptors; plugin::getDescriptorsOfAvailPlugins( pluginDescriptors ); @@ -145,7 +145,7 @@ void engine::load_extensions( void ) ext.begin(); itExt != ext.end(); ++itExt ) { - s_sample_extensions[*itExt] = it->name; + s_sampleExtensions[*itExt] = it->name; } } }