fix: crash when clicking play audio insanely fast.

This commit is contained in:
shenleban tongying 2024-03-19 22:40:44 -04:00
parent ebce607634
commit 97a3824e9f
No known key found for this signature in database
2 changed files with 11 additions and 5 deletions

View file

@ -52,11 +52,12 @@ AudioService::~AudioService()
void AudioService::playMemory( const char * ptr, int size ) void AudioService::playMemory( const char * ptr, int size )
{ {
emit cancelPlaying( false ); emit cancelPlaying( false );
if ( !thread.isNull() ) {
thread->wait();
}
QByteArray audioData( ptr, size ); QByteArray audioData( ptr, size );
thread = std::make_shared< DecoderThread >( audioData, this ); thread.reset( new DecoderThread( audioData, this ) );
connect( this, &AudioService::cancelPlaying, thread.get(), [ this ]( bool waitFinished ) { connect( this, &AudioService::cancelPlaying, thread.get(), &DecoderThread::cancel );
thread->cancel( waitFinished );
} );
thread->start(); thread->start();
} }
@ -263,6 +264,11 @@ bool DecoderContext::openOutputDevice( QString & errorString )
} }
#endif #endif
if ( audioOutput == nullptr ) {
errorString += QStringLiteral( "Failed to create audioOutput." );
return false;
}
audioOutput->setAudioFormat( 44100, codecContext_->channels ); audioOutput->setAudioFormat( 44100, codecContext_->channels );
return true; return true;
} }

View file

@ -29,7 +29,7 @@ class DecoderThread;
class AudioService: public QObject class AudioService: public QObject
{ {
Q_OBJECT Q_OBJECT
std::shared_ptr< DecoderThread > thread; QScopedPointer< DecoderThread > thread;
public: public:
static AudioService & instance(); static AudioService & instance();