xref: /haiku/src/apps/mediaplayer/Controller.h (revision 3995592cdf304335132305e27c40cbb0b1ac46e3)
1 /*
2  * Controller.h - Media Player for the Haiku Operating System
3  *
4  * Copyright (C) 2006 Marcus Overhagen <marcus@overhagen.de>
5  * Copyright (C) 2007-2008 Stephan Aßmus <superstippi@gmx.de> (MIT Ok)
6  *
7  * Released under the terms of the MIT license.
8  */
9 #ifndef __CONTROLLER_H
10 #define __CONTROLLER_H
11 
12 
13 #include <Entry.h>
14 #include <MediaDefs.h>
15 #include <MediaFormats.h>
16 #include <MediaNode.h>
17 #include <List.h>
18 #include <Locker.h>
19 #include <String.h>
20 
21 #include "ListenerAdapter.h"
22 #include "NodeManager.h"
23 #include "PlaylistItem.h"
24 
25 
26 class AudioTrackSupplier;
27 class TrackSupplier;
28 class PlaylistItem;
29 class ProxyAudioSupplier;
30 class ProxyVideoSupplier;
31 class SubTitles;
32 class VideoTrackSupplier;
33 class VideoView;
34 
35 
36 class Controller : public NodeManager {
37 public:
38 	class Listener {
39 	public:
40 								Listener();
41 		virtual					~Listener();
42 
43 		virtual	void			FileFinished();
44 		virtual	void			FileChanged(PlaylistItem* item,
45 									status_t result);
46 
47 		virtual	void			VideoTrackChanged(int32 index);
48 		virtual	void			AudioTrackChanged(int32 index);
49 		virtual	void			SubTitleTrackChanged(int32 index);
50 
51 		virtual	void			VideoStatsChanged();
52 		virtual	void			AudioStatsChanged();
53 
54 		virtual	void			PlaybackStateChanged(uint32 state);
55 		virtual	void			PositionChanged(float position);
56 		virtual	void			SeekHandled(int64 seekFrame);
57 		virtual	void			VolumeChanged(float volume);
58 		virtual	void			MutedChanged(bool muted);
59 	};
60 
61 								Controller();
62 	virtual 					~Controller();
63 
64 	// PlaybackManager interface
65 	virtual	void				MessageReceived(BMessage* message);
66 	virtual	int64				Duration();
67 
68 	// NodeManager interface
69 	virtual	VideoTarget*		CreateVideoTarget();
70 	virtual	VideoSupplier*		CreateVideoSupplier();
71 	virtual	AudioSupplier*		CreateAudioSupplier();
72 
73 	// Controller
74 			status_t			SetToAsync(const PlaylistItemRef& item);
75 			status_t			SetTo(const PlaylistItemRef& item);
76 			const PlaylistItem*	Item() const
77 									{ return fItem.Get(); }
78 			void				PlayerActivated(bool active);
79 
80 			void				GetSize(int *width, int *height,
81 									int* widthAspect = NULL,
82 									int* heightAspect = NULL);
83 
84 			int					AudioTrackCount();
85 			int					VideoTrackCount();
86 			int					SubTitleTrackCount();
87 
88 			status_t			SelectAudioTrack(int n);
89 			int					CurrentAudioTrack();
90 			int					AudioTrackChannelCount();
91 			status_t			SelectVideoTrack(int n);
92 			int					CurrentVideoTrack();
93 			status_t			SelectSubTitleTrack(int n);
94 			int					CurrentSubTitleTrack();
95 			const char*			SubTitleTrackName(int n);
96 
97 			void				Stop();
98 			void				Play();
99 			void				Pause();
100 			void				TogglePlaying();
101 
102 			uint32				PlaybackState();
103 
104 			bigtime_t			TimeDuration();
105 			bigtime_t			TimePosition();
106 
107 	virtual	void				SetVolume(float factor);
108 			float				Volume();
109 			void				VolumeUp();
110 			void				VolumeDown();
111 			void				ToggleMute();
112 
113 			int64				SetPosition(float value);
114 			int64				SetFramePosition(int64 frame);
115 			int64				SetTimePosition(bigtime_t position);
116 
117 			bool				HasFile();
118 			status_t			GetFileFormatInfo(
119 									media_file_format* fileFormat);
120 			status_t			GetCopyright(BString* copyright);
121 			status_t			GetLocation(BString* location);
122 			status_t			GetName(BString* name);
123 			status_t			GetEncodedVideoFormat(media_format* format);
124 			status_t			GetVideoCodecInfo(media_codec_info* info);
125 			status_t			GetEncodedAudioFormat(media_format* format);
126 			status_t			GetAudioCodecInfo(media_codec_info* info);
127 
128 			status_t			GetMetaData(BMessage* metaData);
129 			status_t			GetVideoMetaData(int32 track,
130 									BMessage* metaData);
131 			status_t			GetAudioMetaData(int32 track,
132 									BMessage* metaData);
133 
134 	// video view
135 			void				SetVideoView(VideoView *view);
136 
137 			bool				IsOverlayActive();
138 
139 	// notification support
140 			bool				AddListener(Listener* listener);
141 			void				RemoveListener(Listener* listener);
142 
143 private:
144 			void				_AdoptGlobalSettings();
145 
146 			uint32				_PlaybackState(int32 playingMode) const;
147 			int64				_FrameDuration() const;
148 			bigtime_t			_TimePosition() const;
149 
150 			void				_NotifyFileChanged(PlaylistItem* item,
151 									status_t result) const;
152 			void				_NotifyFileFinished() const;
153 			void				_NotifyVideoTrackChanged(int32 index) const;
154 			void				_NotifyAudioTrackChanged(int32 index) const;
155 			void				_NotifySubTitleTrackChanged(int32 index) const;
156 
157 			void				_NotifyVideoStatsChanged() const;
158 			void				_NotifyAudioStatsChanged() const;
159 
160 			void				_NotifyPlaybackStateChanged(uint32 state) const;
161 			void				_NotifyPositionChanged(float position) const;
162 			void				_NotifySeekHandled(int64 seekFrame) const;
163 			void				_NotifyVolumeChanged(float volume) const;
164 			void				_NotifyMutedChanged(bool muted) const;
165 
166 	// overridden from PlaybackManager so that we
167 	// can use our own Listener mechanism
168 	virtual	void				NotifyPlayModeChanged(int32 mode) const;
169 	virtual	void				NotifyLoopModeChanged(int32 mode) const;
170 	virtual	void				NotifyLoopingEnabledChanged(
171 									bool enabled) const;
172 	virtual	void				NotifyVideoBoundsChanged(BRect bounds) const;
173 	virtual	void				NotifyFPSChanged(float fps) const;
174 	virtual	void				NotifyCurrentFrameChanged(int64 frame) const;
175 	virtual	void				NotifySpeedChanged(float speed) const;
176 	virtual	void				NotifyFrameDropped() const;
177 	virtual	void				NotifyStopFrameReached() const;
178 	virtual	void				NotifySeekHandled(int64 seekedFrame) const;
179 
180 
181 private:
182 			VideoView*			fVideoView;
183 			float				fVolume;
184 			float				fActiveVolume;
185 			bool				fMuted;
186 
187 			PlaylistItemRef		fItem;
188 
189 			ProxyVideoSupplier*	fVideoSupplier;
190 			ProxyAudioSupplier*	fAudioSupplier;
191 			VideoTrackSupplier*	fVideoTrackSupplier;
192 			AudioTrackSupplier*	fAudioTrackSupplier;
193 			const SubTitles*	fSubTitles;
194 			int32				fSubTitlesIndex;
195 
196 	mutable	int64				fCurrentFrame;
197 			bigtime_t			fDuration;
198 			float				fVideoFrameRate;
199 
200 	mutable	int32				fPendingSeekRequests;
201 	mutable int64				fSeekFrame;
202 	mutable int64				fRequestedSeekFrame;
203 
204 			ListenerAdapter		fGlobalSettingsListener;
205 
206 			bool				fAutoplaySetting;
207 				// maintains the auto-play setting
208 			bool 				fAutoplay;
209 				// is true if the player is already playing
210 				// otherwise it's the same as fAutoplaySetting
211 			bool				fLoopMovies;
212 			bool				fLoopSounds;
213 			uint32				fBackgroundMovieVolumeMode;
214 
215 			BList				fListeners;
216 };
217 
218 
219 #endif	// __CONTROLLER_H
220