From 08faae6213d3311e59c440971cbffb824431b2cc Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 21 Sep 2008 12:17:59 +0000 Subject: [PATCH] fixed crashes when exporting as OGG and output file can't be created or OGG encoding settings are wrong git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1664 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/audio_file_device.h | 1 - include/audio_file_ogg.h | 2 +- src/core/audio/audio_file_device.cpp | 12 +++++------- src/core/audio/audio_file_ogg.cpp | 24 ++++++++++++++++-------- src/gui/export_project_dialog.cpp | 23 +++++++++++++++-------- 5 files changed, 37 insertions(+), 25 deletions(-) diff --git a/include/audio_file_device.h b/include/audio_file_device.h index 7595d99dc..ae4e4f165 100644 --- a/include/audio_file_device.h +++ b/include/audio_file_device.h @@ -54,7 +54,6 @@ public: protected: Sint32 writeData( const void * _data, Sint32 _len ); - void seekToBegin( void ); inline bool useVBR( void ) const { diff --git a/include/audio_file_ogg.h b/include/audio_file_ogg.h index 0cc9a8ef1..6c6d7d503 100644 --- a/include/audio_file_ogg.h +++ b/include/audio_file_ogg.h @@ -80,7 +80,7 @@ private: inline Sint32 writePage( void ); - + bool m_ok; ch_cnt_t m_channels; sample_rate_t m_rate; diff --git a/src/core/audio/audio_file_device.cpp b/src/core/audio/audio_file_device.cpp index 452c9adfe..1e18817cc 100644 --- a/src/core/audio/audio_file_device.cpp +++ b/src/core/audio/audio_file_device.cpp @@ -80,16 +80,14 @@ audioFileDevice::~audioFileDevice() Sint32 audioFileDevice::writeData( const void * _data, Sint32 _len ) { - return( m_outputFile.write( (const char *) _data, _len ) ); + if( m_outputFile.isOpen() ) + { + return m_outputFile.write( (const char *) _data, _len ); + } + return -1; } -void audioFileDevice::seekToBegin( void ) -{ - m_outputFile.seek( 0 ); -} - - #endif diff --git a/src/core/audio/audio_file_ogg.cpp b/src/core/audio/audio_file_ogg.cpp index b51309fbe..157def365 100644 --- a/src/core/audio/audio_file_ogg.cpp +++ b/src/core/audio/audio_file_ogg.cpp @@ -53,7 +53,7 @@ audioFileOgg::audioFileOgg( const sample_rate_t _sample_rate, _nom_bitrate, _min_bitrate, _max_bitrate, _depth, _mixer ) { - _success_ful = startEncoding(); + m_ok = _success_ful = startEncoding(); } @@ -105,6 +105,11 @@ bool audioFileOgg::startEncoding( void ) } m_rate = sampleRate(); // default-samplerate + if( m_rate > 48000 ) + { + m_rate = 48000; + setSampleRate( 48000 ); + } m_serialNo = 0; // track-num? m_comments = &vc; // comments for ogg-file @@ -247,15 +252,18 @@ void audioFileOgg::writeBuffer( const surroundSampleFrame * _ab, void audioFileOgg::finishEncoding( void ) { - // just for flushing buffers... - writeBuffer( NULL, 0, 0.0f ); + if( m_ok ) + { + // just for flushing buffers... + writeBuffer( NULL, 0, 0.0f ); - // clean up - ogg_stream_clear( &m_os ); + // clean up + ogg_stream_clear( &m_os ); - vorbis_block_clear( &m_vb ); - vorbis_dsp_clear( &m_vd ); - vorbis_info_clear( &m_vi ); + vorbis_block_clear( &m_vb ); + vorbis_dsp_clear( &m_vd ); + vorbis_info_clear( &m_vi ); + } } diff --git a/src/gui/export_project_dialog.cpp b/src/gui/export_project_dialog.cpp index 2882789e4..c90b001e6 100644 --- a/src/gui/export_project_dialog.cpp +++ b/src/gui/export_project_dialog.cpp @@ -144,16 +144,23 @@ void exportProjectDialog::startBtnClicked( void ) depthCB->currentIndex() ) ); m_renderer = new projectRenderer( qs, os, ft, m_fileName ); - connect( m_renderer, SIGNAL( progressChanged( int ) ), - progressBar, SLOT( setValue( int ) ) ); - connect( m_renderer, SIGNAL( progressChanged( int ) ), - this, SLOT( updateTitleBar( int ) ) ); - connect( m_renderer, SIGNAL( finished() ), - this, SLOT( accept() ) ); - connect( m_renderer, SIGNAL( finished() ), + if( m_renderer->isReady() ) + { + connect( m_renderer, SIGNAL( progressChanged( int ) ), + progressBar, SLOT( setValue( int ) ) ); + connect( m_renderer, SIGNAL( progressChanged( int ) ), + this, SLOT( updateTitleBar( int ) ) ); + connect( m_renderer, SIGNAL( finished() ), + this, SLOT( accept() ) ); + connect( m_renderer, SIGNAL( finished() ), engine::getMainWindow(), SLOT( resetWindowTitle() ) ); - m_renderer->startProcessing(); + m_renderer->startProcessing(); + } + else + { + accept(); + } }