Fix a race condition on startup, and a crash when trying to play a stream's next track

This commit is contained in:
David Sansome 2010-02-03 23:12:21 +00:00
parent 98f23c3ddc
commit b10bf1e40d
5 changed files with 16 additions and 6 deletions

View File

@ -62,6 +62,10 @@ MainWindow::MainWindow(QWidget *parent)
track_position_timer_->setInterval(1000); track_position_timer_->setInterval(1000);
connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition())); connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition()));
// Start initialising the player
multi_loading_indicator_->TaskStarted("Loading audio engine");
player_->Init();
// Models // Models
library_sort_model_->setSourceModel(library_); library_sort_model_->setSourceModel(library_);
library_sort_model_->setSortRole(Library::Role_SortText); library_sort_model_->setSortRole(Library::Role_SortText);
@ -197,7 +201,7 @@ MainWindow::MainWindow(QWidget *parent)
connect(radio_model_, SIGNAL(TaskStarted(QString)), multi_loading_indicator_, SLOT(TaskStarted(QString))); connect(radio_model_, SIGNAL(TaskStarted(QString)), multi_loading_indicator_, SLOT(TaskStarted(QString)));
connect(radio_model_, SIGNAL(TaskFinished(QString)), multi_loading_indicator_, SLOT(TaskFinished(QString))); connect(radio_model_, SIGNAL(TaskFinished(QString)), multi_loading_indicator_, SLOT(TaskFinished(QString)));
connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ReportError(QString))); connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ReportError(QString)));
connect(radio_model_, SIGNAL(StreamFinished()), player_, SLOT(Next())); connect(radio_model_, SIGNAL(StreamFinished()), player_, SLOT(NextItem()));
connect(radio_model_, SIGNAL(StreamReady(QUrl,QUrl)), player_, SLOT(StreamReady(QUrl,QUrl))); connect(radio_model_, SIGNAL(StreamReady(QUrl,QUrl)), player_, SLOT(StreamReady(QUrl,QUrl)));
connect(radio_model_, SIGNAL(StreamMetadataFound(QUrl,Song)), playlist_, SLOT(SetStreamMetadata(QUrl,Song))); connect(radio_model_, SIGNAL(StreamMetadataFound(QUrl,Song)), playlist_, SLOT(SetStreamMetadata(QUrl,Song)));
connect(radio_model_, SIGNAL(AddItemToPlaylist(RadioItem*)), SLOT(InsertRadioItem(RadioItem*))); connect(radio_model_, SIGNAL(AddItemToPlaylist(RadioItem*)), SLOT(InsertRadioItem(RadioItem*)));
@ -266,9 +270,6 @@ MainWindow::MainWindow(QWidget *parent)
show(); show();
library_->StartThreads(); library_->StartThreads();
player_->Init();
multi_loading_indicator_->TaskStarted("Loading audio engine");
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {

View File

@ -55,6 +55,10 @@ void Player::Next() {
return; return;
} }
NextItem();
}
void Player::NextItem() {
int i = playlist_->next_index(); int i = playlist_->next_index();
playlist_->set_current_index(i); playlist_->set_current_index(i);
if (i == -1) { if (i == -1) {

View File

@ -35,6 +35,7 @@ class Player : public QObject {
void PlayAt(int index); void PlayAt(int index);
void PlayPause(); void PlayPause();
void Next(); void Next();
void NextItem();
void Previous(); void Previous();
void Stop(); void Stop();
void SetVolume(int value); void SetVolume(int value);

View File

@ -122,6 +122,8 @@ XineEngine::init()
QCoreApplication::applicationDirPath() + "/xine/plugins").toAscii().constData()); QCoreApplication::applicationDirPath() + "/xine/plugins").toAscii().constData());
#endif #endif
QMutexLocker l(&m_initMutex);
m_xine = xine_new(); m_xine = xine_new();
if( !m_xine ) { if( !m_xine ) {
@ -619,8 +621,7 @@ XineEngine::canDecode( const QUrl &url ) const
static QStringList list; static QStringList list;
if(list.isEmpty()) if(list.isEmpty())
{ {
static QMutex mutex; QMutexLocker l(&const_cast<XineEngine*>(this)->m_initMutex);
QMutexLocker l(&mutex);
if (list.isEmpty()) { if (list.isEmpty()) {
char* exts = xine_get_file_extensions( m_xine ); char* exts = xine_get_file_extensions( m_xine );

View File

@ -15,6 +15,7 @@
#include <QThread> #include <QThread>
#include <QEvent> #include <QEvent>
#include <QSettings> #include <QSettings>
#include <QMutex>
extern "C" extern "C"
{ {
@ -110,6 +111,8 @@ class XineEngine : public Engine::Base
int m_intPreamp; int m_intPreamp;
QList<int> m_equalizerGains; QList<int> m_equalizerGains;
QMutex m_initMutex;
QSettings m_settings; QSettings m_settings;
bool m_fadeoutOnExit; bool m_fadeoutOnExit;
bool m_fadeoutEnabled; bool m_fadeoutEnabled;