media_streaming_instance.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "media/streaming/media_streaming_instance.h"
  8. #include "media/streaming/media_streaming_document.h"
  9. #include "data/data_file_origin.h"
  10. #include "data/data_photo.h"
  11. #include "data/data_document.h"
  12. #include "data/data_session.h"
  13. #include "data/data_streaming.h"
  14. namespace Media {
  15. namespace Streaming {
  16. Instance::Instance(const Instance &other)
  17. : _shared(other._shared)
  18. , _waitingCallback(other._waitingCallback)
  19. , _priority(other._priority)
  20. , _playerLocked(other._playerLocked) {
  21. if (_shared) {
  22. _shared->registerInstance(this);
  23. if (_playerLocked) {
  24. _shared->player().lock();
  25. }
  26. }
  27. }
  28. Instance::Instance(
  29. std::shared_ptr<Document> shared,
  30. Fn<void()> waitingCallback)
  31. : _shared(std::move(shared))
  32. , _waitingCallback(std::move(waitingCallback)) {
  33. if (_shared) {
  34. _shared->registerInstance(this);
  35. }
  36. }
  37. Instance::Instance(
  38. not_null<DocumentData*> document,
  39. Data::FileOrigin origin,
  40. Fn<void()> waitingCallback)
  41. : Instance(
  42. document->owner().streaming().sharedDocument(document, origin),
  43. std::move(waitingCallback)) {
  44. }
  45. Instance::Instance(
  46. not_null<DocumentData*> quality,
  47. not_null<DocumentData*> original,
  48. HistoryItem *context,
  49. Data::FileOrigin origin,
  50. Fn<void()> waitingCallback)
  51. : Instance(
  52. quality->owner().streaming().sharedDocument(
  53. quality,
  54. original,
  55. context,
  56. origin),
  57. std::move(waitingCallback)) {
  58. }
  59. Instance::Instance(
  60. not_null<PhotoData*> photo,
  61. Data::FileOrigin origin,
  62. Fn<void()> waitingCallback)
  63. : Instance(
  64. photo->owner().streaming().sharedDocument(photo, origin),
  65. std::move(waitingCallback)) {
  66. }
  67. Instance::~Instance() {
  68. if (_shared) {
  69. unlockPlayer();
  70. _shared->unregisterInstance(this);
  71. }
  72. }
  73. bool Instance::valid() const {
  74. return (_shared != nullptr);
  75. }
  76. std::shared_ptr<Document> Instance::shared() const {
  77. return _shared;
  78. }
  79. const Player &Instance::player() const {
  80. Expects(_shared != nullptr);
  81. return _shared->player();
  82. }
  83. const Information &Instance::info() const {
  84. Expects(_shared != nullptr);
  85. return _shared->info();
  86. }
  87. rpl::producer<int> Instance::switchQualityRequests() const {
  88. return _shared->switchQualityRequests();
  89. }
  90. void Instance::play(const PlaybackOptions &options) {
  91. Expects(_shared != nullptr);
  92. _shared->play(options);
  93. }
  94. void Instance::pause() {
  95. Expects(_shared != nullptr);
  96. _shared->player().pause();
  97. }
  98. void Instance::resume() {
  99. Expects(_shared != nullptr);
  100. _shared->player().resume();
  101. }
  102. void Instance::stop() {
  103. Expects(_shared != nullptr);
  104. _shared->player().stop();
  105. }
  106. void Instance::stopAudio() {
  107. Expects(_shared != nullptr);
  108. _shared->player().stopAudio();
  109. }
  110. void Instance::saveFrameToCover() {
  111. Expects(_shared != nullptr);
  112. _shared->saveFrameToCover();
  113. }
  114. bool Instance::active() const {
  115. Expects(_shared != nullptr);
  116. return _shared->player().active();
  117. }
  118. bool Instance::ready() const {
  119. Expects(_shared != nullptr);
  120. return _shared->player().ready();
  121. }
  122. std::optional<Error> Instance::failed() const {
  123. Expects(_shared != nullptr);
  124. return _shared->player().failed();
  125. }
  126. bool Instance::paused() const {
  127. Expects(_shared != nullptr);
  128. return _shared->player().paused();
  129. }
  130. float64 Instance::speed() const {
  131. Expects(_shared != nullptr);
  132. return _shared->player().speed();
  133. }
  134. void Instance::setSpeed(float64 speed) {
  135. Expects(_shared != nullptr);
  136. _shared->player().setSpeed(speed);
  137. }
  138. bool Instance::waitingShown() const {
  139. Expects(_shared != nullptr);
  140. return _shared->waitingShown();
  141. }
  142. float64 Instance::waitingOpacity() const {
  143. Expects(_shared != nullptr);
  144. return _shared->waitingOpacity();
  145. }
  146. Ui::RadialState Instance::waitingState() const {
  147. Expects(_shared != nullptr);
  148. return _shared->waitingState();
  149. }
  150. void Instance::callWaitingCallback() {
  151. if (_waitingCallback) {
  152. _waitingCallback();
  153. }
  154. }
  155. QImage Instance::frame(const FrameRequest &request) const {
  156. return player().frame(request, this);
  157. }
  158. FrameWithInfo Instance::frameWithInfo(const FrameRequest &request) const {
  159. return player().frameWithInfo(request, this);
  160. }
  161. FrameWithInfo Instance::frameWithInfo() const {
  162. return player().frameWithInfo(this);
  163. }
  164. bool Instance::markFrameShown() const {
  165. Expects(_shared != nullptr);
  166. return _shared->player().markFrameShown();
  167. }
  168. void Instance::lockPlayer() {
  169. Expects(_shared != nullptr);
  170. if (!_playerLocked) {
  171. _playerLocked = true;
  172. _shared->player().lock();
  173. }
  174. }
  175. void Instance::unlockPlayer() {
  176. Expects(_shared != nullptr);
  177. if (_playerLocked) {
  178. _playerLocked = false;
  179. _shared->player().unlock();
  180. }
  181. }
  182. bool Instance::playerLocked() const {
  183. Expects(_shared != nullptr);
  184. return _shared->player().locked();
  185. }
  186. void Instance::setPriority(int priority) {
  187. Expects(_shared != nullptr);
  188. if (_priority == priority) {
  189. return;
  190. }
  191. _priority = priority;
  192. _shared->refreshPlayerPriority();
  193. }
  194. int Instance::priority() const {
  195. return _priority;
  196. }
  197. rpl::lifetime &Instance::lifetime() {
  198. return _lifetime;
  199. }
  200. } // namespace Streaming
  201. } // namespace Media