1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4 
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #pragma once
9 
10 #include "media/streaming/media_streaming_common.h"
11 
12 class DocumentData;
13 
14 namespace Ui {
15 struct RadialState;
16 } // namespace Ui
17 
18 namespace Data {
19 struct FileOrigin;
20 } // namespace Data
21 
22 namespace Media {
23 namespace Streaming {
24 
25 class Document;
26 class Player;
27 
28 class Instance {
29 public:
30 	Instance(
31 		std::shared_ptr<Document> shared,
32 		Fn<void()> waitingCallback);
33 	Instance(
34 		not_null<DocumentData*> document,
35 		Data::FileOrigin origin,
36 		Fn<void()> waitingCallback);
37 	Instance(
38 		not_null<PhotoData*> photo,
39 		Data::FileOrigin origin,
40 		Fn<void()> waitingCallback);
41 	~Instance();
42 
43 	[[nodiscard]] bool valid() const;
44 	[[nodiscard]] std::shared_ptr<Document> shared() const;
45 
46 	[[nodiscard]] const Player &player() const;
47 	[[nodiscard]] const Information &info() const;
48 
49 	void play(const PlaybackOptions &options);
50 	void pause();
51 	void resume();
52 	void stop();
53 	void stopAudio();
54 	void saveFrameToCover();
55 
56 	[[nodiscard]] bool active() const;
57 	[[nodiscard]] bool ready() const;
58 	[[nodiscard]] std::optional<Error> failed() const;
59 
60 	[[nodiscard]] bool paused() const;
61 
62 	[[nodiscard]] float64 speed() const;
63 	void setSpeed(float64 speed); // 0.5 <= speed <= 2.
64 
65 	[[nodiscard]] bool waitingShown() const;
66 	[[nodiscard]] float64 waitingOpacity() const;
67 	[[nodiscard]] Ui::RadialState waitingState() const;
68 
69 	void callWaitingCallback();
70 
71 	[[nodiscard]] QImage frame(const FrameRequest &request) const;
72 	[[nodiscard]] FrameWithInfo frameWithInfo() const;
73 	bool markFrameShown() const;
74 
75 	void lockPlayer();
76 	void unlockPlayer();
77 	[[nodiscard]] bool playerLocked() const;
78 
79 	void setPriority(int priority);
80 	[[nodiscard]] int priority() const;
81 
82 	[[nodiscard]] rpl::lifetime &lifetime();
83 
84 private:
85 	const std::shared_ptr<Document> _shared;
86 	Fn<void()> _waitingCallback;
87 	int _priority = 1;
88 	bool _playerLocked = false;
89 	rpl::lifetime _lifetime;
90 
91 };
92 
93 } // namespace Streaming
94 } // namespace Media
95