From 2e74ad6fbef45de18b9ef92313c01530ed628dbb Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 23 Jan 2025 11:58:20 +0400 Subject: [PATCH] Use common code for local sound disk cache. --- .../media/audio/media_audio_local_cache.cpp | 35 ++++++++++--- .../media/audio/media_audio_local_cache.h | 15 ++++-- .../linux/notifications_manager_linux.cpp | 7 ++- .../platform/mac/notifications_manager_mac.mm | 51 +++++-------------- 4 files changed, 61 insertions(+), 47 deletions(-) diff --git a/Telegram/SourceFiles/media/audio/media_audio_local_cache.cpp b/Telegram/SourceFiles/media/audio/media_audio_local_cache.cpp index dd1fa6de1..5e5f9771f 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_local_cache.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_local_cache.cpp @@ -312,12 +312,6 @@ constexpr auto kFrameSize = 4096; } // namespace -LocalCache::~LocalCache() { - for (const auto &[id, path] : _cache) { - QFile::remove(path); - } -} - LocalSound LocalCache::sound( DocumentId id, Fn resolveOriginalBytes, @@ -334,4 +328,33 @@ LocalSound LocalCache::sound( : LocalSound(); } +LocalDiskCache::LocalDiskCache(const QString &folder) +: _base(folder + '/') { + QDir().mkpath(_base); +} + +QString LocalDiskCache::path(const LocalSound &sound) { + if (!sound) { + return {}; + } + const auto i = _paths.find(sound.id); + if (i != end(_paths)) { + return i->second; + } + + auto result = u"TDesktop-%1"_q.arg(sound.id + ? QString::number(sound.id, 16).toUpper() + : u"Default"_q); + const auto path = _base + u"%1.wav"_q.arg(result); + + auto f = QFile(path); + if (f.open(QIODevice::WriteOnly)) { + f.write(sound.wav); + f.close(); + } + + _paths.emplace(sound.id, result); + return result; +} + } // namespace Media::Audio diff --git a/Telegram/SourceFiles/media/audio/media_audio_local_cache.h b/Telegram/SourceFiles/media/audio/media_audio_local_cache.h index ee21b3f1b..09886c9b3 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_local_cache.h +++ b/Telegram/SourceFiles/media/audio/media_audio_local_cache.h @@ -20,9 +20,6 @@ struct LocalSound { class LocalCache final { public: - LocalCache() = default; - ~LocalCache(); - [[nodiscard]] LocalSound sound( DocumentId id, Fn resolveOriginalBytes, @@ -33,4 +30,16 @@ private: }; +class LocalDiskCache final { +public: + explicit LocalDiskCache(const QString &folder); + + [[nodiscard]] QString path(const LocalSound &sound); + +private: + const QString _base; + base::flat_map _paths; + +}; + } // namespace Media::Audio diff --git a/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp b/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp index 0a51e5a44..a46c9907e 100644 --- a/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" #include "main/main_session.h" +#include "media/audio/media_audio_local_cache.h" #include "lang/lang_keys.h" #include "base/weak_ptr.h" #include "window/notifications_utilities.h" @@ -191,6 +192,8 @@ private: const not_null _manager; NotificationId _id; + //Media::Audio::LocalDiskCache _sounds; + Gio::Application _application; Gio::Notification _notification; const std::string _guid; @@ -219,6 +222,7 @@ NotificationData::NotificationData( NotificationId id) : _manager(manager) , _id(id) +//, _sounds(cWorkingDir() + u"tdata/audio_cache"_q) , _application(UseGNotification() ? Gio::Application::get_default() : nullptr) @@ -232,7 +236,8 @@ NotificationData::NotificationData( bool NotificationData::init(const Info &info) { const auto &title = info.title; const auto &subtitle = info.subtitle; - //const auto sound = info.sound ? info.sound() : QString(); + //const auto sound = info.sound ? info.sound() : Media::Audio::LocalSound(); + //const auto path = sound ? _sounds.path(sound) : QString(); if (_application) { _notification = Gio::Notification::new_( subtitle.isEmpty() diff --git a/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm b/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm index ad115143f..290cce13f 100644 --- a/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm +++ b/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm @@ -226,8 +226,6 @@ private: void clearingThreadLoop(); - [[nodiscard]] QString cacheSound(const Media::Audio::LocalSound &sound); - const uint64 _managerId = 0; QString _managerIdString; @@ -262,17 +260,27 @@ private: ClearFinish>; std::vector _clearingTasks; - std::vector> _focusedCallbacks; - base::flat_map _cachedSounds; + Media::Audio::LocalDiskCache _sounds; rpl::lifetime _lifetime; }; +[[nodiscard]] QString ResolveSoundsFolder() { + NSArray *paths = NSSearchPathForDirectoriesInDomains( + NSLibraryDirectory, + NSUserDomainMask, + YES); + NSString *library = [paths firstObject]; + NSString *sounds = [library stringByAppendingPathComponent : @"Sounds"]; + return NS2QString(sounds); +} + Manager::Private::Private(Manager *manager) : _managerId(base::RandomValue()) , _managerIdString(QString::number(_managerId)) -, _delegate([[NotificationDelegate alloc] initWithManager:manager managerId:_managerId]) { +, _delegate([[NotificationDelegate alloc] initWithManager:manager managerId:_managerId]) +, _sounds(ResolveSoundsFolder()) { Core::App().settings().workModeValue( ) | rpl::start_with_next([=](Core::Settings::WorkMode mode) { // We need to update the delegate _after_ the tray icon change was done in Qt. @@ -283,37 +291,6 @@ Manager::Private::Private(Manager *manager) }, _lifetime); } -QString Manager::Private::cacheSound(const Media::Audio::LocalSound &sound) { - const auto i = _cachedSounds.find(sound.id); - if (i != end(_cachedSounds)) { - return i->second; - } - - auto result = u"TDesktop-%1"_q.arg(sound.id - ? QString::number(sound.id, 16).toUpper() - : u"Default"_q); - - NSArray *paths = NSSearchPathForDirectoriesInDomains( - NSLibraryDirectory, - NSUserDomainMask, - YES); - NSString *library = [paths firstObject]; - NSString *sounds = [library stringByAppendingPathComponent:@"Sounds"]; - const auto folder = NS2QString(sounds); - - const auto path = folder + u"/%1.wav"_q.arg(result); - QDir().mkpath(folder); - - auto f = QFile(path); - if (f.open(QIODevice::WriteOnly)) { - f.write(sound.wav); - f.close(); - } - - _cachedSounds.emplace(sound.id, result); - return result; -} - void Manager::Private::showNotification( NotificationInfo &&info, Ui::PeerUserpicView &userpicView) { @@ -361,7 +338,7 @@ void Manager::Private::showNotification( const auto sound = info.sound ? info.sound() : Media::Audio::LocalSound(); if (sound) { - [notification setSoundName:Q2NSString(cacheSound(sound))]; + [notification setSoundName:Q2NSString(_sounds.path(sound))]; } else { [notification setSoundName:nil]; }