From 90a9cb4f8d232d367663f48f881a559da648b764 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 25 Jun 2020 15:12:50 +0400 Subject: [PATCH] Fix playing music from a different account. --- Telegram/SourceFiles/mainwidget.cpp | 15 ++++--- .../media/player/media_player_instance.cpp | 41 +++++++++++++++---- .../media/player/media_player_instance.h | 6 +++ .../media/player/media_player_panel.cpp | 12 ++++-- .../media/view/media_view_overlay_widget.cpp | 6 +-- .../SourceFiles/media/view/media_view_pip.cpp | 6 +-- 6 files changed, 59 insertions(+), 27 deletions(-) diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 3b0d53b85a..404b52276c 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -251,11 +251,6 @@ MainWidget::MainWidget( connect(_dialogs, SIGNAL(cancelled()), this, SLOT(dialogsCancelled())); connect(_history, &HistoryWidget::cancelled, [=] { handleHistoryBack(); }); - Media::Player::instance()->updatedNotifier( - ) | rpl::start_with_next([=](const Media::Player::TrackState &state) { - handleAudioUpdate(state); - }, lifetime()); - subscribe(session().calls().currentCallChanged(), [=](Calls::Call *call) { setCurrentCall(call); }); @@ -268,6 +263,16 @@ MainWidget::MainWidget( _exportTopBar->finishAnimating(); } + Media::Player::instance()->updatedNotifier( + ) | rpl::start_with_next([=](const Media::Player::TrackState &state) { + handleAudioUpdate(state); + }, lifetime()); + handleAudioUpdate(Media::Player::instance()->getState(AudioMsgId::Type::Song)); + handleAudioUpdate(Media::Player::instance()->getState(AudioMsgId::Type::Voice)); + if (_player) { + _player->finishAnimating(); + } + subscribe(_controller->dialogsListFocused(), [this](bool) { updateDialogsWidthAnimated(); }); diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 7514e20848..3b5a294c22 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_domain.h" // Domain::activeSessionValue. #include "mainwindow.h" #include "main/main_session.h" +#include "main/main_account.h" // session->account().sessionChanges(). #include "main/main_session_settings.h" namespace Media { @@ -126,13 +127,6 @@ Instance::Instance() resumeOnCall(AudioMsgId::Type::Song); } }); - } else { - const auto reset = [&](AudioMsgId::Type type) { - const auto data = getData(type); - *data = Data(type, data->overview); - }; - reset(AudioMsgId::Type::Voice); - reset(AudioMsgId::Type::Song); } }, _lifetime); @@ -180,17 +174,45 @@ void Instance::setCurrent(const AudioMsgId &audioId) { ? audioId.audio()->owner().message(audioId.contextId()) : nullptr; if (item) { - data->history = item->history()->migrateToOrMe(); - data->migrated = data->history->migrateFrom(); + setHistory(data, item->history()); } else { data->history = nullptr; data->migrated = nullptr; + data->session = nullptr; } _trackChangedNotifier.notify(data->type, true); refreshPlaylist(data); } } +void Instance::setHistory(not_null data, History *history) { + if (history) { + data->history = history->migrateToOrMe(); + data->migrated = data->history->migrateFrom(); + setSession(data, &history->session()); + } else { + data->history = data->migrated = nullptr; + setSession(data, nullptr); + } +} + +void Instance::setSession(not_null data, Main::Session *session) { + if (data->session == session) { + return; + } + data->playlistLifetime.destroy(); + data->sessionLifetime.destroy(); + data->session = session; + if (session) { + session->account().sessionChanges( + ) | rpl::start_with_next([=] { + setSession(data, nullptr); + }, data->sessionLifetime); + } else { + *data = Data(data->type, data->overview); + } +} + void Instance::clearStreamed(not_null data, bool savePosition) { if (!data->streamed || data->streamed->clearing) { return; @@ -263,6 +285,7 @@ bool Instance::validPlaylist(not_null data) { } void Instance::validatePlaylist(not_null data) { + data->playlistLifetime.destroy(); if (const auto key = playlistKey(data)) { data->playlistRequestedKey = key; SharedMediaMergedViewer( diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index be8aa3a7df..a5d74c6f42 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -180,9 +180,11 @@ private: std::optional playlistRequestedKey; std::optional playlistIndex; rpl::lifetime playlistLifetime; + rpl::lifetime sessionLifetime; rpl::event_stream<> playlistChanges; History *history = nullptr; History *migrated = nullptr; + Main::Session *session = nullptr; bool repeatEnabled = false; bool isPlaying = false; bool resumeOnCallEnd = false; @@ -252,6 +254,10 @@ private: void requestRoundVideoResize() const; void requestRoundVideoRepaint() const; + + void setHistory(not_null data, History *history); + void setSession(not_null data, Main::Session *session); + Data _songData; Data _voiceData; diff --git a/Telegram/SourceFiles/media/player/media_player_panel.cpp b/Telegram/SourceFiles/media/player/media_player_panel.cpp index c5e03e2e50..2be6eb4dad 100644 --- a/Telegram/SourceFiles/media/player/media_player_panel.cpp +++ b/Telegram/SourceFiles/media/player/media_player_panel.cpp @@ -43,8 +43,8 @@ Panel::Panel( not_null window) : RpWidget(parent) , AbstractController(window) -, _showTimer([this] { startShow(); }) -, _hideTimer([this] { startHideChecked(); }) +, _showTimer([=] { startShow(); }) +, _hideTimer([=] { startHideChecked(); }) , _scroll(this, st::mediaPlayerScroll) { hide(); updateSize(); @@ -210,7 +210,7 @@ void Panel::ensureCreated() { _refreshListLifetime = instance()->playlistChanges( AudioMsgId::Type::Song - ) | rpl::start_with_next([this] { + ) | rpl::start_with_next([=] { refreshList(); }); refreshList(); @@ -229,6 +229,12 @@ void Panel::refreshList() { const auto current = instance()->current(AudioMsgId::Type::Song); const auto contextId = current.contextId(); const auto peer = [&]() -> PeerData* { + if (const auto document = current.audio()) { + if (&document->session() != &session()) { + // Different account is playing music. + return nullptr; + } + } const auto item = contextId ? session().data().message(contextId) : nullptr; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 2a617a1dce..3be0fc4968 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -3557,11 +3557,7 @@ void OverlayWidget::setSession(not_null session) { }, _sessionLifetime); session->account().sessionChanges( - ) | rpl::start_with_next_done([=](Main::Session *value) { - if (value != session) { - clearSession(); - } - }, [=] { + ) | rpl::start_with_next([=] { clearSession(); }, _sessionLifetime); } diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index e342828dee..7394753b8f 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -879,11 +879,7 @@ Pip::Pip( setupStreaming(); _data->session().account().sessionChanges( - ) | rpl::start_with_next_done([=](Main::Session *session) { - if (!session) { - _destroy(); - } - }, [=] { + ) | rpl::start_with_next([=] { _destroy(); }, _panel.lifetime()); }