diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e2de64d6f1beb9e492daf5b886e19933c1fa41dd (patch) | |
tree | 9047cf9e6b5c43878d5bf82660adae77ceee097a /krec/krecord.cpp | |
download | tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.tar.gz tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdemultimedia@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'krec/krecord.cpp')
-rw-r--r-- | krec/krecord.cpp | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/krec/krecord.cpp b/krec/krecord.cpp new file mode 100644 index 00000000..72fbde7c --- /dev/null +++ b/krec/krecord.cpp @@ -0,0 +1,407 @@ +/*************************************************************************** + begin : Mon Jun 17 2002 + copyright : (C) 2002 by Arnold Krille + email : 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; version 2 of the License. * + * * + ***************************************************************************/ + +#include "krecord.h" +#include "krecord_private.h" + +#include "artsactions.h" +// VolumeControl +#include "artsmoduleseffects.h" + +#include "krecfile.h" +#include "krecglobal.h" +#include "krecexport_template.h" + +#include <arts/kaudioplaystream.h> +#include <arts/kaudiorecordstream.h> +#include <kfiledialog.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kdebug.h> +#include <kapplication.h> +#include <kaction.h> +#include <kconfig.h> +#include <qlayout.h> +#include <qtimer.h> +#include <ksettings/dialog.h> +#include <ktip.h> + +KRecPrivate::KRecPrivate( KRecord* p, const char* n ) + : QObject( p,n ) + , _confdlg( 0 ) + , server( new KArtsServer( 0 ) ) + , dispatcher( new KArtsDispatcher( 0 ) ) + , m_playStream( new KAudioPlayStream( server, "KRec::Out", server ) ) + , m_recStream( new KAudioRecordStream( server, "KRec::In", server ) ) + , w( 0 ) + , b_arts( true ), b_comp( true ) + , _impl( p ) + , mainwidget( new KRecMainWidget( p ) ) + , _currentFile( 0 ) + , _exportitem( 0 ) +{ + //kdDebug( 60005 ) << k_funcinfo << endl; + m_recStream->usePolling( false ); + if( m_recStream->effectStack().isNull() ) + kdFatal() << "Couldn't get Object 'StereoEffectStack' from KAudioRecordStream!!!" << endl; + volumecontrol = Arts::DynamicCast( server->server().createObject( "Arts::StereoVolumeControl" ) ); + if( volumecontrol.isNull() ) + kdFatal()<<"Couldn't create Object 'StereoVolumeControl' !!!"<<endl; + comp = Arts::DynamicCast( server->server().createObject( "Arts::Synth_STEREO_COMPRESSOR" ) ); + if( comp.isNull() ) + b_comp = false; + + volumecontrol.start(); + if( b_comp ) comp.start(); + vc_id = m_recStream->effectStack().insertBottom( volumecontrol, "VolumeControl" ); + if( b_comp ) comp_id = m_recStream->effectStack().insertTop( comp, "Compressor" ); + + Arts::StereoVolumeControlGui gui = Arts::StereoVolumeControlGui( volumecontrol ); + gui.title( i18n( "Recording level" ).utf8().data() ); + mainwidget->_artswidget = gui; + mainwidget->_kaw_volumecontrol->setContent( mainwidget->_artswidget ); + +} + +KRecPrivate::~KRecPrivate() { + //kdDebug( 60005 ) << k_funcinfo << endl; + mainwidget->_artswidget = Arts::StereoVolumeControlGui::null(); + delete _currentFile; + _currentFile = 0; + //kdDebug( 60005 ) << k_funcinfo << "done." << endl; +} + +void KRecPrivate::showConfDialog() { + if ( !_confdlg ) + _confdlg = new KSettings::Dialog( _impl ); + _confdlg->show(); +} + +void KRecPrivate::newFile() { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) closeFile(); + if ( !_currentFile ) { + pNewFile( new KRecFile( this ) ); + } +} +void KRecPrivate::openFile() { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) closeFile(); + if ( !_currentFile ) { + QString filename = KFileDialog::getOpenFileName( "", "*.krec", _impl ); + //kdDebug( 60005 ) << k_funcinfo << filename << endl; + if ( !filename.isNull() ) + pNewFile( new KRecFile( filename, this ) ); + } +} +void KRecPrivate::pNewFile( KRecFile* file ) { + _currentFile = file; + connect( m_recStream, SIGNAL( data( QByteArray& ) ), _currentFile, SLOT( writeData( QByteArray& ) ) ); + connect( m_playStream, SIGNAL( requestData( QByteArray& ) ), _currentFile, SLOT( getData( QByteArray& ) ) ); + mainwidget->_fileview->setFile( _currentFile ); + checkActions(); +} + +void KRecPrivate::saveFile() { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) pSaveFile( _currentFile->filename() ); +} +void KRecPrivate::saveAsFile() { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) pSaveFile( QString::null ); +} +void KRecPrivate::pSaveFile( const QString &filename ) { + if ( !_currentFile ) + return; + + if ( !filename.isNull() ) + _currentFile->save( filename ); + else { + QString userFilename = KFileDialog::getSaveFileName( "", "*.krec", _impl, i18n( "Save File As" ) ); + if ( !userFilename.isNull() ) + _currentFile->save( userFilename ); + } +} + +bool KRecPrivate::closeFile() { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) { + if ( !_currentFile->saved() ) { + int choice = KMessageBox::questionYesNoCancel( _impl, i18n( "The document \"%1\" has been modified.\nDo you want to save it?" ).arg( _currentFile->filename() ), QString::null, KStdGuiItem::save(), KStdGuiItem::discard() ); + if ( choice == KMessageBox::Yes ) saveFile(); + if ( choice == KMessageBox::Cancel ) return false; + // go on if KMessageBox::No + } + delete _currentFile; + _currentFile = 0; + mainwidget->_fileview->setFile( _currentFile ); + } + checkActions(); + return true; +} + +void KRecPrivate::exportFile() { + kdDebug( 60005 ) << k_funcinfo << endl; + if ( _currentFile ) { + QString filename = KFileDialog::getSaveFileName( "", KRecGlobal::the()->exportFormatEndings(), _impl, "Export File As" ); + if ( !filename.isNull() ) { + int lastdot = filename.find( '.', -5 ); + QString ending = filename.right( filename.length()-lastdot-1 ); + _exportitem = KRecGlobal::the()->getExportItemForEnding( ending ); + if ( _exportitem ) { + _exportitem->initialize( _currentFile->samplerate(), _currentFile->bits(), _currentFile->channels() ); + if ( _exportitem->initialize( filename ) ) { + connect( _exportitem, SIGNAL( getData( QByteArray& ) ), _currentFile, SLOT( getData( QByteArray& ) ) ); + connect( _currentFile, SIGNAL( endReached() ), _exportitem, SLOT( stop() ) ); + connect( _currentFile, SIGNAL( endReached() ), this, SLOT( endExportFile() ) ); + _exportitem->start(); + } + } else + KMessageBox::detailedSorry( _impl, + i18n( "Sorry, an encoding method could not be determined." ), + i18n( "<qt>This can have several reasons:<ul>" \ + "<li>You did not specify an ending.</li>" \ + "<li>You specified an ending but there is no plugin available " \ + "for this ending. In both cases be sure to choose an ending of " \ + "the list presented in the previous dialog.</li>" \ + "<li>The plugin loading mechanism isn't working. If you are sure " \ + "you did everything right, please file a bugreport saying what " \ + "you where about to do and please quote the following line:<br />" \ + "%1</li>" \ + "</ul></qt>" ).arg( KRecGlobal::the()->exportFormatEndings() ), + i18n( "Could not determine encodingmethod" ) ); + } + } else KRecGlobal::the()->message( i18n( "There is nothing to export." ) ); + checkActions(); +} +void KRecPrivate::endExportFile() { QTimer::singleShot( 20, this, SLOT( endExportFile2() ) ); } +void KRecPrivate::endExportFile2() { + _exportitem->finalize(); + disconnect( _currentFile, 0, _exportitem, 0 ); + disconnect( _exportitem, 0, 0, 0 ); + checkActions(); +} + +void KRecPrivate::playthru( bool yes ){ + kdDebug( 60005 ) << k_funcinfo << yes << endl; + if(yes) { + Arts::connect( m_recStream->effectStack(), m_playStream->effectStack() ); + kdDebug( 60005 ) << "Making a connection between recStream and playStream :-)" << endl; + } else { + Arts::disconnect( m_recStream->effectStack(), m_playStream->effectStack() ); + kdDebug( 60005 ) << "Disconnecting recStream and playStream :-(" << endl; + } +} + +void KRecPrivate::checkActions(){ + _impl->actionCollection()->action( "player_record" )->setEnabled( false ); + _impl->actionCollection()->action( "player_play" )->setEnabled( false ); + _impl->actionCollection()->action( "player_stop" )->setEnabled( false ); + _impl->actionCollection()->action( "player_gobegin" )->setEnabled( false ); + _impl->actionCollection()->action( "player_goend" )->setEnabled( false ); + _impl->actionCollection()->action( "export_file" )->setEnabled( false ); + _impl->actionCollection()->action( "file_save" )->setEnabled( false ); + _impl->actionCollection()->action( "file_save_as" )->setEnabled( false ); + _impl->actionCollection()->action( "file_close" )->setEnabled( false ); + if ( _currentFile ) { + if ( !_exportitem || ( _exportitem && !_exportitem->running() ) ) { + if ( !m_recStream->running() && !m_playStream->running() ) { + _impl->actionCollection()->action( "player_record" )->setEnabled( true ); + _impl->actionCollection()->action( "player_play" )->setEnabled( true ); + } + if ( m_playStream->running() || m_recStream->running() ) + _impl->actionCollection()->action( "player_stop" )->setEnabled( true ); + if ( _currentFile->position() != 0 ) + _impl->actionCollection()->action( "player_gobegin" )->setEnabled( true ); + if ( _currentFile->position() != _currentFile->size() ) + _impl->actionCollection()->action( "player_goend" )->setEnabled( true ); + } + _impl->actionCollection()->action( "export_file" )->setEnabled( true ); + _impl->actionCollection()->action( "file_close" )->setEnabled( true ); + //if ( !_currentFile->saved() ) { + _impl->actionCollection()->action( "file_save" )->setEnabled( true ); + _impl->actionCollection()->action( "file_save_as" )->setEnabled( true ); + //} + } +} + +void KRecPrivate::toBegin() { + if ( _currentFile ) + _currentFile->newPos( 0 ); + checkActions(); +} +void KRecPrivate::toEnd() { + if ( _currentFile ) + _currentFile->newPos( _currentFile->size() ); + checkActions(); +} + +void KRecPrivate::forceTipOfDay() { + KTipDialog::showTip( _impl, QString::null, true ); +} + +void KRecPrivate::execaRtsControl() { + kapp->kdeinitExec( "artscontrol" ); +} +void KRecPrivate::execKMix() { + kapp->kdeinitExec( "kmix" ); +} + +/** + + KRecord: + +*/ + +KRecord::KRecord(QWidget *parent, const char *name ) + : KMainWindow(parent,name) + , d( new KRecPrivate( this ) ) +{ + kdDebug( 60005 ) << k_funcinfo << endl; + //kdDebug( 60005 )<<"KRecord::KRecord( QWidget *"<<parent<<", const char* "<<name<<" )"<<endl; // (DEBUG) + + KRecGlobal::the()->setMainWidget( this ); + KRecGlobal::the()->setStatusBar( statusBar() ); + + // * * * Startup-Window * * * + KTipDialog::showTip( this ); + + // * * * Mainwidget * * * + setCentralWidget( d->mainwidget ); + + // * * * Actions * * * + d->artsactions = new ArtsActions( d->server, actionCollection(), this ); + + KStdAction::preferences( d, SLOT( showConfDialog() ), actionCollection() ); + + KStdAction::openNew( d, SLOT( newFile() ), actionCollection() ); + KStdAction::open( d, SLOT( openFile() ), actionCollection() ); + KStdAction::save( d, SLOT( saveFile() ), actionCollection() ); + KStdAction::saveAs( d, SLOT( saveAsFile() ), actionCollection() ); + KStdAction::close( d, SLOT( closeFile() ), actionCollection() ); + KStdAction::quit( this, SLOT( close() ), actionCollection() ); + + KStdAction::tipOfDay( d, SLOT( forceTipOfDay() ), actionCollection() ); + + d->aExportFile = new KAction( i18n( "Export..." ), KShortcut(), + d, SLOT( exportFile() ), actionCollection(), "export_file" ); + + d->aRecord = new KAction( i18n( "&Record" ), KShortcut( Key_R ), + this, SLOT( startRec() ), actionCollection(), "player_record" ); + d->aPlay = new KAction( i18n( "&Play" ), KShortcut( Key_P ), + this, SLOT( startPlay() ), actionCollection(), "player_play" ); + d->aStop = new KAction( i18n( "&Stop" ), KShortcut( Key_S ), + this, SLOT( stopRec() ), actionCollection(), "player_stop" ); + d->aThru = new KToggleAction( i18n( "Play Through" ), KShortcut( CTRL + Key_P), actionCollection(), "play_thru" ); + connect( d->aThru, SIGNAL( toggled( bool ) ), d, SLOT( playthru( bool ) ) ); + + d->aBegin = new KAction( i18n( "Go to &Beginning" ), KShortcut( SHIFT + Key_Left ), + d, SLOT( toBegin() ), actionCollection(), "player_gobegin" ); + d->aEnd = new KAction( i18n( "Go to &End" ), KShortcut( SHIFT + Key_Right ), + d, SLOT( toEnd() ), actionCollection(), "player_goend" ); + + ( void* ) d->artsactions->actionAudioManager(); + + d->aExecaRtsControl = new KAction( i18n( "Start aRts Control Tool" ), KShortcut(), + d, SLOT( execaRtsControl() ), actionCollection(), "exec_artscontrol" ); + d->aExecKMix = new KAction( i18n( "Start KMix" ), KShortcut(), + d, SLOT( execKMix() ), actionCollection(), "exec_kmix" ); + + // * * * GUI * * * + // TODO Fix toolbar config so this line can just be setupGUI() + setupGUI(KMainWindow::Keys | StatusBar | Save | Create ); + setStandardToolBarMenuEnabled( true ); + // TODO Fix the arts toolbar to know it own minium size, this app shouldn't care! + setMinimumWidth( 400 ); + + if( d->b_comp ) + { + Arts::GenericGuiFactory factory; + Arts::Widget aw = factory.createGui( d->comp ); + d->w = new KArtsWidget( aw, toolBar("compressor") ); + d->w->setName( "kde toolbar widget" ); + + toolBar( "compressor" )->insertWidget( 1, 400, d->w ); + toolBar( "compressor" )->setBarPos( KToolBar::Bottom ); + } + else + { + toolBar( "compressor" )->close(); + KMessageBox::detailedSorry( this, + i18n( "Your system is missing the Synth_STEREO_COMPRESSOR aRts module.\nYou will be able to use KRec but without the great functions of the compressor." ), + i18n( "Possible reasons are:\n- You installed KRec on its own without the rest of kdemultimedia.\n- You installed everything correctly, but did not restart the aRts daemon\n and therefore it is not aware of the new effects.\n- This is a bug." ), + i18n( "Unable to Find Compressor" ) ); + } + + d->checkActions(); +} + +KRecord::~KRecord(){ + kdDebug( 60005 ) << k_funcinfo << endl; // (DEBUG) + stopRec(); + + d->m_recStream->effectStack().remove( d->vc_id ); + if( d->b_comp ) d->m_recStream->effectStack().remove( d->comp_id ); + d->volumecontrol.stop(); + if( d->b_comp ) d->comp.stop(); + + d->volumecontrol = Arts::StereoVolumeControl::null(); + if( d->b_comp ) d->comp = Arts::StereoEffect::null(); + + KRecGlobal::kconfig()->sync(); + delete d; + kdDebug( 60005 ) << k_funcinfo << "done. Bye!" << endl; +} + +void KRecord::startRec(){ + if( !d->m_recStream->running() && d->_currentFile ) { + //kdDebug( 60005 )<<"KRecord::startRec()"<<endl; // (DEBUG) + d->_currentFile->newBuffer(); + d->m_recStream->start( d->_currentFile->samplerate(), + d->_currentFile->bits(), + d->_currentFile->channels() ); + } + d->checkActions(); + d->mainwidget->_fileview->updateGUI(); +} + +void KRecord::startPlay(){ + if ( !d->m_playStream->running() && d->_currentFile ) { + d->m_playStream->start( d->_currentFile->samplerate(), + d->_currentFile->bits(), + d->_currentFile->channels() ); + } + d->checkActions(); + d->mainwidget->_fileview->updateGUI(); +} + +void KRecord::stopRec(){ + if ( d->m_recStream->running() ) + d->m_recStream->stop(); + if ( d->m_playStream->running() ) + d->m_playStream->stop(); + d->checkActions(); + d->mainwidget->_fileview->updateGUI(); +} + + +bool KRecord::queryClose() { + kdDebug( 60005 ) << k_funcinfo << endl; + return d->closeFile(); +} + +#include "krecord.moc" +#include "krecord_private.moc" + +// vim:sw=4:ts=4 |