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