Fix Clementine getting stuck when transitioning from a local track to a Spotify track with crossfade disabled.
Two problems here: - the first was that "StartPlaybackLater" wasn't called from the thread which created SpotifyServer, so the timer never started. - then the playback sometimes failed or started with an offset: just hack to ignore sourcedrained signal in this case.
This commit is contained in:
parent
a7ae275153
commit
d9150ec165
@ -174,8 +174,12 @@ bool GstEnginePipeline::ReplaceDecodeBin(const QUrl& url) {
|
|||||||
gst_object_unref(GST_OBJECT(pad));
|
gst_object_unref(GST_OBJECT(pad));
|
||||||
|
|
||||||
// Tell spotify to start sending data to us.
|
// Tell spotify to start sending data to us.
|
||||||
InternetModel::Service<SpotifyService>()->server()->StartPlaybackLater(
|
SpotifyServer* spotify_server = InternetModel::Service<SpotifyService>()->server();
|
||||||
url.toString(), port);
|
// Need to schedule this in the spotify server's thread
|
||||||
|
QMetaObject::invokeMethod(spotify_server, "StartPlayback",
|
||||||
|
Qt::QueuedConnection,
|
||||||
|
Q_ARG(QString, url.toString()),
|
||||||
|
Q_ARG(quint16, port));
|
||||||
} else {
|
} else {
|
||||||
new_bin = engine_->CreateElement("uridecodebin");
|
new_bin = engine_->CreateElement("uridecodebin");
|
||||||
g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(),
|
g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(),
|
||||||
@ -920,7 +924,14 @@ void GstEnginePipeline::SourceDrainedCallback(GstURIDecodeBin* bin,
|
|||||||
gpointer self) {
|
gpointer self) {
|
||||||
GstEnginePipeline* instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline* instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
if (instance->has_next_valid_url()) {
|
if (instance->has_next_valid_url() &&
|
||||||
|
// I'm not sure why, but calling this when previous track is a local song
|
||||||
|
// and the next track is a Spotify song is buggy: the Spotify song will
|
||||||
|
// not start or with some offset. So just do nothing here: when the song
|
||||||
|
// finished, EndOfStreamReached/TrackEnded will be emitted anyway so
|
||||||
|
// NextItem will be called.
|
||||||
|
!(instance->url_.scheme() != "spotify" &&
|
||||||
|
instance->next_url_.scheme() == "spotify")) {
|
||||||
instance->TransitionToNext();
|
instance->TransitionToNext();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,15 +260,6 @@ void SpotifyServer::RemoveSongsFromPlaylist(
|
|||||||
SendOrQueueMessage(message);
|
SendOrQueueMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpotifyServer::StartPlaybackLater(const QString& uri, quint16 port) {
|
|
||||||
QTimer* timer = new QTimer(this);
|
|
||||||
connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
|
|
||||||
|
|
||||||
timer->start(100); // lol
|
|
||||||
NewClosure(timer, SIGNAL(timeout()), this,
|
|
||||||
SLOT(StartPlayback(QString, quint16)), uri, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpotifyServer::StartPlayback(const QString& uri, quint16 port) {
|
void SpotifyServer::StartPlayback(const QString& uri, quint16 port) {
|
||||||
pb::spotify::Message message;
|
pb::spotify::Message message;
|
||||||
pb::spotify::PlaybackRequest* req = message.mutable_playback_request();
|
pb::spotify::PlaybackRequest* req = message.mutable_playback_request();
|
||||||
|
@ -53,7 +53,6 @@ class SpotifyServer : public AbstractMessageHandler<pb::spotify::Message> {
|
|||||||
void RemoveSongsFromUserPlaylist(int playlist_index,
|
void RemoveSongsFromUserPlaylist(int playlist_index,
|
||||||
const QList<int>& songs_indices_to_remove);
|
const QList<int>& songs_indices_to_remove);
|
||||||
void RemoveSongsFromStarred(const QList<int>& songs_indices_to_remove);
|
void RemoveSongsFromStarred(const QList<int>& songs_indices_to_remove);
|
||||||
void StartPlaybackLater(const QString& uri, quint16 port);
|
|
||||||
void Search(const QString& text, int limit, int limit_album = 0);
|
void Search(const QString& text, int limit, int limit_album = 0);
|
||||||
void LoadImage(const QString& id);
|
void LoadImage(const QString& id);
|
||||||
void AlbumBrowse(const QString& uri);
|
void AlbumBrowse(const QString& uri);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user