From b28e374e060d532e6ca71bb26f49017c198f4387 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 1 Feb 2019 10:09:55 +0300 Subject: [PATCH] Fix Media::Audio::Instance destruction. --- Telegram/SourceFiles/core/application.cpp | 4 ++-- Telegram/SourceFiles/media/media_audio.cpp | 23 ++++++++++--------- Telegram/SourceFiles/media/media_audio.h | 12 ++++++---- .../SourceFiles/media/media_audio_track.cpp | 4 ++-- .../media/player/media_player_instance.cpp | 8 +++---- .../media/player/media_player_instance.h | 10 +++++--- 6 files changed, 35 insertions(+), 26 deletions(-) diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 2c598ad15..48fc5284a 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -111,7 +111,7 @@ void Application::run() { anim::startManager(); Ui::InitTextOptions(); Ui::Emoji::Init(); - Media::Player::start(); + Media::Player::start(_audio.get()); DEBUG_LOG(("Application Info: inited...")); @@ -1117,7 +1117,7 @@ Application::~Application() { Window::Theme::Unload(); - Media::Player::finish(); + Media::Player::finish(_audio.get()); style::stopManager(); Local::finish(); diff --git a/Telegram/SourceFiles/media/media_audio.cpp b/Telegram/SourceFiles/media/media_audio.cpp index cb0cacb39..b9843c296 100644 --- a/Telegram/SourceFiles/media/media_audio.cpp +++ b/Telegram/SourceFiles/media/media_audio.cpp @@ -183,7 +183,7 @@ bool CreatePlaybackDevice() { } // Thread: Main. Must be locked: AudioMutex. -void ClosePlaybackDevice() { +void ClosePlaybackDevice(not_null instance) { if (!AudioDevice) return; LOG(("Audio Info: Closing audio playback device.")); @@ -201,7 +201,7 @@ void ClosePlaybackDevice() { if (Player::mixer()) { Player::mixer()->detachTracks(); } - Current().detachTracks(); + instance->detachTracks(); DestroyPlaybackDevice(); } @@ -209,7 +209,7 @@ void ClosePlaybackDevice() { } // namespace // Thread: Main. -void Start() { +void Start(not_null instance) { Assert(AudioDevice == nullptr); qRegisterMetaType(); @@ -221,13 +221,13 @@ void Start() { EnumeratePlaybackDevices(); EnumerateCaptureDevices(); - MixerInstance = new Player::Mixer(); + MixerInstance = new Player::Mixer(instance); Platform::Audio::Init(); } // Thread: Main. -void Finish() { +void Finish(not_null instance) { Platform::Audio::DeInit(); // MixerInstance variable should be modified under AudioMutex protection. @@ -235,7 +235,7 @@ void Finish() { delete MixerInstance; // No sync required already. - ClosePlaybackDevice(); + ClosePlaybackDevice(instance); } // Thread: Main. Locks: AudioMutex. @@ -489,8 +489,9 @@ void Mixer::Track::resetStream() { Mixer::Track::~Track() = default; -Mixer::Mixer() -: _volumeVideo(kVolumeRound) +Mixer::Mixer(not_null instance) +: _instance(instance) +, _volumeVideo(kVolumeRound) , _volumeSong(kVolumeRound) , _fader(new Fader(&_faderThread)) , _loader(new Loaders(&_loaderThread)) { @@ -530,7 +531,7 @@ Mixer::~Mixer() { } _videoTrack.clear(); - Audio::ClosePlaybackDevice(); + Audio::ClosePlaybackDevice(_instance); Audio::MixerInstance = nullptr; } @@ -1467,9 +1468,9 @@ bool CheckAudioDeviceConnected() { } // Thread: Main. Locks: AudioMutex. -void DetachFromDevice() { +void DetachFromDevice(not_null instance) { QMutexLocker lock(&AudioMutex); - Audio::ClosePlaybackDevice(); + Audio::ClosePlaybackDevice(instance); if (mixer()) { mixer()->reattachIfNeeded(); } diff --git a/Telegram/SourceFiles/media/media_audio.h b/Telegram/SourceFiles/media/media_audio.h index ef7320b92..036577f21 100644 --- a/Telegram/SourceFiles/media/media_audio.h +++ b/Telegram/SourceFiles/media/media_audio.h @@ -16,9 +16,11 @@ struct VideoSoundPart; namespace Media { namespace Audio { +class Instance; + // Thread: Main. -void Start(); -void Finish(); +void Start(not_null instance); +void Finish(not_null instance); // Thread: Main. Locks: AudioMutex. bool IsAttachedToDevice(); @@ -104,7 +106,7 @@ class Mixer : public QObject, private base::Subscriber { Q_OBJECT public: - Mixer(); + explicit Mixer(not_null instance); void play(const AudioMsgId &audio, TimeMs positionMs = 0); void play(const AudioMsgId &audio, std::unique_ptr videoData, TimeMs positionMs = 0); @@ -229,6 +231,8 @@ private: int *currentIndex(AudioMsgId::Type type); const int *currentIndex(AudioMsgId::Type type) const; + not_null _instance; + int _audioCurrent = 0; Track _audioTracks[kTogetherLimit]; @@ -309,7 +313,7 @@ namespace internal { bool CheckAudioDeviceConnected(); // Thread: Main. Locks: AudioMutex. -void DetachFromDevice(); +void DetachFromDevice(not_null instance); // Thread: Any. QMutex *audioPlayerMutex(); diff --git a/Telegram/SourceFiles/media/media_audio_track.cpp b/Telegram/SourceFiles/media/media_audio_track.cpp index d62acd737..19d9e4fab 100644 --- a/Telegram/SourceFiles/media/media_audio_track.cpp +++ b/Telegram/SourceFiles/media/media_audio_track.cpp @@ -258,9 +258,9 @@ Instance::Instance() { } }); - _detachFromDeviceTimer.setCallback([this] { + _detachFromDeviceTimer.setCallback([=] { _detachFromDeviceForce = false; - Player::internal::DetachFromDevice(); + Player::internal::DetachFromDevice(this); }); } diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index f04502cdf..115ea42d6 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -36,18 +36,18 @@ constexpr auto kIdsPreloadAfter = 28; } // namespace -void start() { - Audio::Start(); +void start(not_null instance) { + Audio::Start(instance); Capture::Start(); SingleInstance = new Instance(); } -void finish() { +void finish(not_null instance) { delete base::take(SingleInstance); Capture::Finish(); - Audio::Finish(); + Audio::Finish(instance); } Instance::Instance() diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index c9f7eeace..e20197833 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -12,10 +12,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class AudioMsgId; namespace Media { +namespace Audio { +class Instance; +} // namespace Audio + namespace Player { -void start(); -void finish(); +void start(not_null instance); +void finish(not_null instance); class Instance; Instance *instance(); @@ -125,7 +129,7 @@ public: private: Instance(); - friend void start(); + friend void start(not_null instance); void setupShortcuts();