Fix crash when loading CD playlists

This commit is contained in:
Jonas Kvinge 2018-03-04 20:13:05 +01:00
parent fda970a5dc
commit 887e045a63
8 changed files with 20 additions and 47 deletions

5
TODO

@ -3,6 +3,9 @@ Strawberry Music Player
TODO
- Fix freeze on exit caused by GStreamer
- Fix crash when loading playlists from Audio CD
- Fix Audio CD playback
- Improve status/context
- Fix crash when switching backend
.

@ -530,13 +530,11 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
//qLog(Debug) << __PRETTY_FUNCTION__;
//qLog(Debug) << "Song::kColumns.size():" << Song::kColumns.size() << "q.columns_.size():" << q.columns_.size() << "col:" << col;
int i = 0;
int x = col;
d->id_ = toint(col);
for (i = 0 ; i < Song::kColumns.size(); i++) {
x=i+col+1;
for (int i = 0 ; i < Song::kColumns.size(); i++) {
x++;
if (x >= q.columns_.size()) {
qLog(Error) << "Skipping" << Song::kColumns.value(i);
@ -662,7 +660,7 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
}
else if (Song::kColumns.value(i) == "cue_path") {
d->cue_path_ = tostr(col + x);
d->cue_path_ = tostr(x);
}
else {

@ -112,8 +112,7 @@ class Song {
void InitFromProtobuf(const pb::tagreader::SongMetadata &pb);
void InitFromQuery(const SqlRow &query, bool reliable_metadata, int col = 0);
void InitFromFilePartial(const QString &filename); // Just store the filename: incomplete but fast
void InitArtManual(); // Check if there is already a art in the cache and
// store the filename in art_manual
void InitArtManual(); // Check if there is already a art in the cache and store the filename in art_manual
#ifdef HAVE_LIBLASTFM
void InitFromLastFM(const lastfm::Track &track);
#endif

@ -40,6 +40,8 @@ CddaSongLoader::~CddaSongLoader() {
QUrl CddaSongLoader::GetUrlFromTrack(int track_number) const {
qLog(Debug) << url_;
if (url_.isEmpty()) {
return QUrl(QString("cdda://%1").arg(track_number));
}

@ -757,6 +757,7 @@ void GstEngine::timerEvent(QTimerEvent *e) {
}
}
}
}
void GstEngine::HandlePipelineError(int pipeline_id, const QString &message, int domain, int error_code) {
@ -766,7 +767,7 @@ void GstEngine::HandlePipelineError(int pipeline_id, const QString &message, int
if (!current_pipeline_.get() || current_pipeline_->id() != pipeline_id)
return;
qLog(Warning) << "Gstreamer error:" << message;
qLog(Warning) << "Gstreamer error:" << domain << error_code << message;
current_pipeline_.reset();

@ -107,7 +107,6 @@ PlaylistBackend::Playlist PlaylistBackend::GetPlaylist(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery q(db);
q.prepare("SELECT ROWID, name, last_played, special_type, ui_path, is_favorite FROM playlists WHERE ROWID=:id");
@ -126,12 +125,11 @@ PlaylistBackend::Playlist PlaylistBackend::GetPlaylist(int id) {
p.favorite = q.value(5).toBool();
return p;
}
QSqlQuery PlaylistBackend::GetPlaylistRows(int playlist) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
@ -158,8 +156,6 @@ QSqlQuery PlaylistBackend::GetPlaylistRows(int playlist) {
QList<PlaylistItemPtr> PlaylistBackend::GetPlaylistItems(int playlist) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QSqlQuery q = GetPlaylistRows(playlist);
// Note that as this only accesses the query, not the db, we don't need the
// mutex.
@ -178,8 +174,6 @@ QList<PlaylistItemPtr> PlaylistBackend::GetPlaylistItems(int playlist) {
QList<Song> PlaylistBackend::GetPlaylistSongs(int playlist) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QSqlQuery q = GetPlaylistRows(playlist);
// Note that as this only accesses the query, not the db, we don't need the
// mutex.
@ -198,13 +192,9 @@ QList<Song> PlaylistBackend::GetPlaylistSongs(int playlist) {
PlaylistItemPtr PlaylistBackend::NewPlaylistItemFromQuery(const SqlRow &row, std::shared_ptr<NewSongFromQueryState> state) {
//qLog(Debug) << __PRETTY_FUNCTION__;
// The song tables get joined first, plus one each for the song ROWIDs
const int playlist_row = (Song::kColumns.count() + 1) * kSongTableJoins;
//qLog(Debug) << row.value(playlist_row).toString();
PlaylistItemPtr item(PlaylistItem::NewFromType(row.value(playlist_row).toString()));
if (item) {
item->InitFromQuery(row);
@ -218,8 +208,6 @@ PlaylistItemPtr PlaylistBackend::NewPlaylistItemFromQuery(const SqlRow &row, std
Song PlaylistBackend::NewSongFromQuery(const SqlRow &row, std::shared_ptr<NewSongFromQueryState> state) {
//qLog(Debug) << __PRETTY_FUNCTION__;
return NewPlaylistItemFromQuery(row, state)->Metadata();
}
@ -228,8 +216,6 @@ Song PlaylistBackend::NewSongFromQuery(const SqlRow &row, std::shared_ptr<NewSon
PlaylistItemPtr PlaylistBackend::RestoreCueData(PlaylistItemPtr item, std::shared_ptr<NewSongFromQueryState> state) {
//qLog(Debug) << __PRETTY_FUNCTION__;
// we need collection to run a CueParser; also, this method applies only to file-type PlaylistItems
if (item->type() != "File") return item;
@ -278,16 +264,12 @@ PlaylistItemPtr PlaylistBackend::RestoreCueData(PlaylistItemPtr item, std::share
void PlaylistBackend::SavePlaylistAsync(int playlist, const PlaylistItemList &items, int last_played) {
//qLog(Debug) << __PRETTY_FUNCTION__;
metaObject()->invokeMethod(this, "SavePlaylist", Qt::QueuedConnection, Q_ARG(int, playlist), Q_ARG(PlaylistItemList, items), Q_ARG(int, last_played));
}
void PlaylistBackend::SavePlaylist(int playlist, const PlaylistItemList& items, int last_played) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
@ -328,8 +310,6 @@ void PlaylistBackend::SavePlaylist(int playlist, const PlaylistItemList& items,
int PlaylistBackend::CreatePlaylist(const QString& name, const QString& special_type) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
@ -346,8 +326,6 @@ int PlaylistBackend::CreatePlaylist(const QString& name, const QString& special_
void PlaylistBackend::RemovePlaylist(int id) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery delete_playlist(db);
@ -372,8 +350,6 @@ void PlaylistBackend::RemovePlaylist(int id) {
void PlaylistBackend::RenamePlaylist(int id, const QString &new_name) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery q(db);
@ -388,8 +364,6 @@ void PlaylistBackend::RenamePlaylist(int id, const QString &new_name) {
void PlaylistBackend::FavoritePlaylist(int id, bool is_favorite) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery q(db);
@ -404,8 +378,6 @@ void PlaylistBackend::FavoritePlaylist(int id, bool is_favorite) {
void PlaylistBackend::SetPlaylistOrder(const QList<int> &ids) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
ScopedTransaction transaction(&db);
@ -429,8 +401,6 @@ void PlaylistBackend::SetPlaylistOrder(const QList<int> &ids) {
void PlaylistBackend::SetPlaylistUiPath(int id, const QString &path) {
//qLog(Debug) << __PRETTY_FUNCTION__;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery q(db);

@ -37,7 +37,7 @@ SongPlaylistItem::SongPlaylistItem(const Song &song)
bool SongPlaylistItem::InitFromQuery(const SqlRow &query) {
song_.InitFromQuery(query, false, (Song::kColumns.count() + 1) * 3);
song_.InitFromQuery(query, false, (Song::kColumns.count()+1));
return true;
}