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
This commit is contained in:
Tobias Doerffel
2008-09-21 12:17:59 +00:00
parent f5d9a50394
commit 08faae6213
5 changed files with 37 additions and 25 deletions

View File

@@ -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

View File

@@ -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 );
}
}

View File

@@ -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();
}
}