mirror of
https://github.com/kotatogram/kotatogram-desktop
synced 2025-08-31 14:45:14 +00:00
Implement media devices tracking on Windows.
This commit is contained in:
@@ -88,6 +88,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "storage/localstorage.h"
|
||||
#include "payments/payments_checkout_process.h"
|
||||
#include "export/export_manager.h"
|
||||
#include "webrtc/webrtc_environment.h"
|
||||
#include "window/window_session_controller.h"
|
||||
#include "window/window_controller.h"
|
||||
#include "boxes/abstract_box.h"
|
||||
@@ -150,6 +151,7 @@ Application::Application()
|
||||
, _private(std::make_unique<Private>())
|
||||
, _platformIntegration(Platform::Integration::Create())
|
||||
, _batterySaving(std::make_unique<base::BatterySaving>())
|
||||
, _mediaDevices(std::make_unique<Webrtc::Environment>())
|
||||
, _databases(std::make_unique<Storage::Databases>())
|
||||
, _animationsManager(std::make_unique<Ui::Animations::Manager>())
|
||||
, _clearEmojiImageLoaderTimer([=] { clearEmojiSourceImages(); })
|
||||
|
@@ -101,6 +101,10 @@ namespace Calls {
|
||||
class Instance;
|
||||
} // namespace Calls
|
||||
|
||||
namespace Webrtc {
|
||||
class Environment;
|
||||
} // namespace Webrtc
|
||||
|
||||
namespace Core {
|
||||
|
||||
struct LocalUrlHandler;
|
||||
@@ -238,6 +242,9 @@ public:
|
||||
[[nodiscard]] Media::Audio::Instance &audio() {
|
||||
return *_audio;
|
||||
}
|
||||
[[nodiscard]] Webrtc::Environment &mediaDevices() {
|
||||
return *_mediaDevices;
|
||||
}
|
||||
|
||||
// Langpack and emoji keywords.
|
||||
[[nodiscard]] Lang::Instance &langpack() {
|
||||
@@ -383,6 +390,7 @@ private:
|
||||
const std::unique_ptr<Private> _private;
|
||||
const std::unique_ptr<Platform::Integration> _platformIntegration;
|
||||
const std::unique_ptr<base::BatterySaving> _batterySaving;
|
||||
const std::unique_ptr<Webrtc::Environment> _mediaDevices;
|
||||
|
||||
const std::unique_ptr<Storage::Databases> _databases;
|
||||
const std::unique_ptr<Ui::Animations::Manager> _animationsManager;
|
||||
|
@@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "ui/gl/gl_detection.h"
|
||||
#include "ui/widgets/fields/input_field.h"
|
||||
#include "webrtc/webrtc_create_adm.h"
|
||||
#include "webrtc/webrtc_device_common.h"
|
||||
#include "window/section_widget.h"
|
||||
|
||||
namespace Core {
|
||||
@@ -159,8 +160,8 @@ QByteArray Settings::serialize() const {
|
||||
+ Serialize::stringSize(_downloadPath.current())
|
||||
+ Serialize::bytearraySize(_downloadPathBookmark)
|
||||
+ sizeof(qint32) * 9
|
||||
+ Serialize::stringSize(_callOutputDeviceId)
|
||||
+ Serialize::stringSize(_callInputDeviceId)
|
||||
+ Serialize::stringSize(_callPlaybackDeviceId.current())
|
||||
+ Serialize::stringSize(_callCaptureDeviceId.current())
|
||||
+ sizeof(qint32) * 5;
|
||||
for (const auto &[key, value] : _soundOverrides) {
|
||||
size += Serialize::stringSize(key) + Serialize::stringSize(value);
|
||||
@@ -170,7 +171,7 @@ QByteArray Settings::serialize() const {
|
||||
+ sizeof(qint32)
|
||||
+ (_dictionariesEnabled.current().size() * sizeof(quint64))
|
||||
+ sizeof(qint32) * 12
|
||||
+ Serialize::stringSize(_callVideoInputDeviceId)
|
||||
+ Serialize::stringSize(_cameraDeviceId.current())
|
||||
+ sizeof(qint32) * 2
|
||||
+ Serialize::bytearraySize(_groupCallPushToTalkShortcut)
|
||||
+ sizeof(qint64)
|
||||
@@ -194,7 +195,7 @@ QByteArray Settings::serialize() const {
|
||||
+ (_accountsOrder.size() * sizeof(quint64))
|
||||
+ sizeof(qint32) * 7
|
||||
+ (skipLanguages.size() * sizeof(quint64))
|
||||
+ sizeof(qint32)
|
||||
+ sizeof(qint32) * 2
|
||||
+ sizeof(quint64)
|
||||
+ sizeof(qint32) * 3
|
||||
+ Serialize::bytearraySize(mediaViewPosition)
|
||||
@@ -204,6 +205,9 @@ QByteArray Settings::serialize() const {
|
||||
for (const auto &id : _recentEmojiSkip) {
|
||||
size += Serialize::stringSize(id);
|
||||
}
|
||||
size += sizeof(qint32) * 2
|
||||
+ Serialize::stringSize(_playbackDeviceId.current())
|
||||
+ Serialize::stringSize(_captureDeviceId.current());
|
||||
|
||||
auto result = QByteArray();
|
||||
result.reserve(size);
|
||||
@@ -228,8 +232,8 @@ QByteArray Settings::serialize() const {
|
||||
<< qint32(_notificationsCount)
|
||||
<< static_cast<qint32>(_notificationsCorner)
|
||||
<< qint32(_autoLock)
|
||||
<< _callOutputDeviceId
|
||||
<< _callInputDeviceId
|
||||
<< _callPlaybackDeviceId.current()
|
||||
<< _callCaptureDeviceId.current()
|
||||
<< qint32(_callOutputVolume)
|
||||
<< qint32(_callInputVolume)
|
||||
<< qint32(_callAudioDuckingEnabled ? 1 : 0)
|
||||
@@ -273,7 +277,7 @@ QByteArray Settings::serialize() const {
|
||||
<< qint32(_notifyFromAll ? 1 : 0)
|
||||
<< qint32(_nativeWindowFrame.current() ? 1 : 0)
|
||||
<< qint32(_systemDarkModeEnabled.current() ? 1 : 0)
|
||||
<< _callVideoInputDeviceId
|
||||
<< _cameraDeviceId.current()
|
||||
<< qint32(_ipRevealWarning ? 1 : 0)
|
||||
<< qint32(_groupCallPushToTalk ? 1 : 0)
|
||||
<< _groupCallPushToTalkShortcut
|
||||
@@ -327,9 +331,7 @@ QByteArray Settings::serialize() const {
|
||||
}
|
||||
|
||||
stream
|
||||
<< qint32(_rememberedDeleteMessageOnlyForYou ? 1 : 0);
|
||||
|
||||
stream
|
||||
<< qint32(_rememberedDeleteMessageOnlyForYou ? 1 : 0)
|
||||
<< qint32(_translateChatEnabled.current() ? 1 : 0)
|
||||
<< quint64(QLocale::Language(_translateToRaw.current()))
|
||||
<< qint32(_windowTitleContent.current().hideChatName ? 1 : 0)
|
||||
@@ -339,14 +341,18 @@ QByteArray Settings::serialize() const {
|
||||
<< qint32(_ignoreBatterySaving.current() ? 1 : 0)
|
||||
<< quint64(_macRoundIconDigest.value_or(0))
|
||||
<< qint32(_storiesClickTooltipHidden.current() ? 1 : 0)
|
||||
<< qint32(_recentEmojiSkip.size())
|
||||
<< qint32(_ttlVoiceClickTooltipHidden.current() ? 1 : 0);
|
||||
<< qint32(_recentEmojiSkip.size());
|
||||
for (const auto &id : _recentEmojiSkip) {
|
||||
stream << id;
|
||||
}
|
||||
stream
|
||||
<< qint32(_trayIconMonochrome.current() ? 1 : 0);
|
||||
<< qint32(_trayIconMonochrome.current() ? 1 : 0)
|
||||
<< qint32(_ttlVoiceClickTooltipHidden.current() ? 1 : 0)
|
||||
<< _playbackDeviceId.current()
|
||||
<< _captureDeviceId.current();
|
||||
}
|
||||
|
||||
Ensures(result.size() == size);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -375,9 +381,11 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
qint32 notificationsCount = _notificationsCount;
|
||||
qint32 notificationsCorner = static_cast<qint32>(_notificationsCorner);
|
||||
qint32 autoLock = _autoLock;
|
||||
QString callOutputDeviceId = _callOutputDeviceId;
|
||||
QString callInputDeviceId = _callInputDeviceId;
|
||||
QString callVideoInputDeviceId = _callVideoInputDeviceId;
|
||||
QString playbackDeviceId = _playbackDeviceId.current();
|
||||
QString captureDeviceId = _captureDeviceId.current();
|
||||
QString cameraDeviceId = _cameraDeviceId.current();
|
||||
QString callPlaybackDeviceId = _callPlaybackDeviceId.current();
|
||||
QString callCaptureDeviceId = _callCaptureDeviceId.current();
|
||||
qint32 callOutputVolume = _callOutputVolume;
|
||||
qint32 callInputVolume = _callInputVolume;
|
||||
qint32 callAudioDuckingEnabled = _callAudioDuckingEnabled ? 1 : 0;
|
||||
@@ -475,8 +483,8 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
>> notificationsCount
|
||||
>> notificationsCorner
|
||||
>> autoLock
|
||||
>> callOutputDeviceId
|
||||
>> callInputDeviceId
|
||||
>> callPlaybackDeviceId
|
||||
>> callCaptureDeviceId
|
||||
>> callOutputVolume
|
||||
>> callInputVolume
|
||||
>> callAudioDuckingEnabled
|
||||
@@ -539,7 +547,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
stream >> systemDarkModeEnabled;
|
||||
}
|
||||
if (!stream.atEnd()) {
|
||||
stream >> callVideoInputDeviceId;
|
||||
stream >> cameraDeviceId;
|
||||
}
|
||||
if (!stream.atEnd()) {
|
||||
stream >> ipRevealWarning;
|
||||
@@ -666,7 +674,8 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (!stream.atEnd()) {
|
||||
stream >> rememberedDeleteMessageOnlyForYou;
|
||||
}
|
||||
if (!stream.atEnd()) {
|
||||
@@ -714,6 +723,11 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
if (!stream.atEnd()) {
|
||||
stream >> ttlVoiceClickTooltipHidden;
|
||||
}
|
||||
if (!stream.atEnd()) {
|
||||
stream
|
||||
>> playbackDeviceId
|
||||
>> captureDeviceId;
|
||||
}
|
||||
if (stream.status() != QDataStream::Ok) {
|
||||
LOG(("App Error: "
|
||||
"Bad data for Core::Settings::constructFromSerialized()"));
|
||||
@@ -757,9 +771,12 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||
_countUnreadMessages = (countUnreadMessages == 1);
|
||||
_notifyAboutPinned = (notifyAboutPinned == 1);
|
||||
_autoLock = autoLock;
|
||||
_callOutputDeviceId = callOutputDeviceId;
|
||||
_callInputDeviceId = callInputDeviceId;
|
||||
_callVideoInputDeviceId = callVideoInputDeviceId;
|
||||
_playbackDeviceId = playbackDeviceId;
|
||||
_captureDeviceId = captureDeviceId;
|
||||
const auto kOldDefault = u"default"_q;
|
||||
_cameraDeviceId = cameraDeviceId;
|
||||
_callPlaybackDeviceId = callPlaybackDeviceId;
|
||||
_callCaptureDeviceId = callCaptureDeviceId;
|
||||
_callOutputVolume = callOutputVolume;
|
||||
_callInputVolume = callInputVolume;
|
||||
_callAudioDuckingEnabled = (callAudioDuckingEnabled == 1);
|
||||
@@ -1216,9 +1233,11 @@ void Settings::resetOnLastLogout() {
|
||||
_notifyAboutPinned = true;
|
||||
//_autoLock = 3600;
|
||||
|
||||
//_callOutputDeviceId = u"default"_q;
|
||||
//_callInputDeviceId = u"default"_q;
|
||||
//_callVideoInputDeviceId = u"default"_q;
|
||||
//_playbackDeviceId = QString();
|
||||
//_captureDeviceId = QString();
|
||||
//_cameraDeviceId = QString();
|
||||
//_callPlaybackDeviceId = QString();
|
||||
//_callCaptureDeviceId = QString();
|
||||
//_callOutputVolume = 100;
|
||||
//_callInputVolume = 100;
|
||||
//_callAudioDuckingEnabled = true;
|
||||
|
@@ -263,30 +263,68 @@ public:
|
||||
void setAutoLock(int value) {
|
||||
_autoLock = value;
|
||||
}
|
||||
[[nodiscard]] QString callOutputDeviceId() const {
|
||||
return _callOutputDeviceId.isEmpty()
|
||||
? u"default"_q
|
||||
: _callOutputDeviceId;
|
||||
|
||||
[[nodiscard]] QString playbackDeviceId() const {
|
||||
return _playbackDeviceId.current();
|
||||
}
|
||||
void setCallOutputDeviceId(const QString &value) {
|
||||
_callOutputDeviceId = value;
|
||||
[[nodiscard]] rpl::producer<QString> playbackDeviceIdChanges() const {
|
||||
return _playbackDeviceId.changes();
|
||||
}
|
||||
[[nodiscard]] QString callInputDeviceId() const {
|
||||
return _callInputDeviceId.isEmpty()
|
||||
? u"default"_q
|
||||
: _callInputDeviceId;
|
||||
[[nodiscard]] rpl::producer<QString> playbackDeviceIdValue() const {
|
||||
return _playbackDeviceId.value();
|
||||
}
|
||||
void setCallInputDeviceId(const QString &value) {
|
||||
_callInputDeviceId = value;
|
||||
void setPlaybackDeviceId(const QString &value) {
|
||||
_playbackDeviceId = value;
|
||||
}
|
||||
[[nodiscard]] QString callVideoInputDeviceId() const {
|
||||
return _callVideoInputDeviceId.isEmpty()
|
||||
? u"default"_q
|
||||
: _callVideoInputDeviceId;
|
||||
[[nodiscard]] QString captureDeviceId() const {
|
||||
return _captureDeviceId.current();
|
||||
}
|
||||
void setCallVideoInputDeviceId(const QString &value) {
|
||||
_callVideoInputDeviceId = value;
|
||||
[[nodiscard]] rpl::producer<QString> captureDeviceIdChanges() const {
|
||||
return _captureDeviceId.changes();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> captureDeviceIdValue() const {
|
||||
return _captureDeviceId.value();
|
||||
}
|
||||
void setCaptureDeviceId(const QString &value) {
|
||||
_captureDeviceId = value;
|
||||
}
|
||||
[[nodiscard]] QString cameraDeviceId() const {
|
||||
return _cameraDeviceId.current();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> cameraDeviceIdChanges() const {
|
||||
return _cameraDeviceId.changes();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> cameraDeviceIdValue() const {
|
||||
return _cameraDeviceId.value();
|
||||
}
|
||||
void setCameraDeviceId(const QString &value) {
|
||||
_cameraDeviceId = value;
|
||||
}
|
||||
[[nodiscard]] QString callPlaybackDeviceId() const {
|
||||
return _callPlaybackDeviceId.current();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> callPlaybackDeviceIdChanges() const {
|
||||
return _callPlaybackDeviceId.changes();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> callPlaybackDeviceIdValue() const {
|
||||
return _callPlaybackDeviceId.value();
|
||||
}
|
||||
void setCallPlaybackDeviceId(const QString &value) {
|
||||
_callPlaybackDeviceId = value;
|
||||
}
|
||||
[[nodiscard]] QString callCaptureDeviceId() const {
|
||||
return _callCaptureDeviceId.current();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> callCaptureDeviceIdChanges() const {
|
||||
return _callCaptureDeviceId.changes();
|
||||
}
|
||||
[[nodiscard]] rpl::producer<QString> callCaptureDeviceIdValue() const {
|
||||
return _callCaptureDeviceId.value();
|
||||
}
|
||||
void setCallCaptureDeviceId(const QString &value) {
|
||||
_callCaptureDeviceId = value;
|
||||
}
|
||||
|
||||
[[nodiscard]] int callOutputVolume() const {
|
||||
return _callOutputVolume;
|
||||
}
|
||||
@@ -875,9 +913,11 @@ private:
|
||||
bool _countUnreadMessages = true;
|
||||
rpl::variable<bool> _notifyAboutPinned = true;
|
||||
int _autoLock = 3600;
|
||||
QString _callOutputDeviceId = u"default"_q;
|
||||
QString _callInputDeviceId = u"default"_q;
|
||||
QString _callVideoInputDeviceId = u"default"_q;
|
||||
rpl::variable<QString> _playbackDeviceId;
|
||||
rpl::variable<QString> _captureDeviceId;
|
||||
rpl::variable<QString> _cameraDeviceId;
|
||||
rpl::variable<QString> _callPlaybackDeviceId;
|
||||
rpl::variable<QString> _callCaptureDeviceId;
|
||||
int _callOutputVolume = 100;
|
||||
int _callInputVolume = 100;
|
||||
bool _callAudioDuckingEnabled = true;
|
||||
|
Reference in New Issue
Block a user