Files
haiku-beta6/src/apps/mediaplayer/Controller.h
T
Stephan Aßmus 2a72b9fead * re-enabled the InfoWin
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21335 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-06-05 23:23:44 +00:00

231 lines
5.7 KiB
C++

/*
* Controller.h - Media Player for the Haiku Operating System
*
* Copyright (C) 2006 Marcus Overhagen <[email protected]>
* Copyright (C) 2007 Stephan Aßmus <[email protected]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef __CONTROLLER_H
#define __CONTROLLER_H
#include <Entry.h>
#include <MediaDefs.h>
#include <MediaFormats.h>
#include <MediaNode.h>
#include <List.h>
#include <Locker.h>
#include <String.h>
class AudioSupplier;
class BBitmap;
class BMediaFile;
class BMediaTrack;
class SoundOutput;
class VideoSupplier;
class VideoView;
class Controller {
public:
class Listener {
public:
Listener();
virtual ~Listener();
virtual void FileFinished();
virtual void FileChanged();
virtual void VideoTrackChanged(int32 index);
virtual void AudioTrackChanged(int32 index);
virtual void VideoStatsChanged();
virtual void AudioStatsChanged();
virtual void PlaybackStateChanged(uint32 state);
virtual void PositionChanged(float position);
virtual void VolumeChanged(float volume);
};
Controller();
virtual ~Controller();
bool Lock();
status_t LockWithTimeout(bigtime_t timeout);
void Unlock();
status_t SetTo(const entry_ref &ref);
void GetSize(int *width, int *height);
int AudioTrackCount();
int VideoTrackCount();
status_t SelectAudioTrack(int n);
status_t SelectVideoTrack(int n);
void Stop();
void Play();
void Pause();
void TogglePlaying();
bool IsPaused() const;
bool IsStopped() const;
uint32 PlaybackState() const;
bigtime_t Duration();
bigtime_t Position();
void SetVolume(float value);
float Volume() const;
void SetPosition(float value);
bool HasFile();
status_t GetFileFormatInfo(media_file_format* fileFormat);
status_t GetCopyright(BString* copyright);
status_t GetLocation(BString* location);
status_t GetName(BString* name);
status_t GetEncodedVideoFormat(media_format* format);
status_t GetVideoCodecInfo(media_codec_info* info);
status_t GetEncodedAudioFormat(media_format* format);
status_t GetAudioCodecInfo(media_codec_info* info);
// video view
void SetVideoView(VideoView *view);
bool IsOverlayActive();
bool LockBitmap();
void UnlockBitmap();
BBitmap * Bitmap();
// notification support
bool AddListener(Listener* listener);
void RemoveListener(Listener* listener);
private:
void _AudioDecodeThread();
void _AudioPlayThread();
void _VideoDecodeThread();
void _VideoPlayThread();
void _StartThreads();
void _StopThreads();
void _EndOfStreamReached(bool isVideo = false);
void _UpdatePosition(bigtime_t position,
bool isVideoPosition = false,
bool force = false);
static int32 _VideoDecodeThreadEntry(void *self);
static int32 _VideoPlayThreadEntry(void *self);
static int32 _AudioDecodeThreadEntry(void *self);
static int32 _AudioPlayThreadEntry(void *self);
private:
void _NotifyFileChanged();
void _NotifyFileFinished();
void _NotifyVideoTrackChanged(int32 index);
void _NotifyAudioTrackChanged(int32 index);
void _NotifyVideoStatsChanged();
void _NotifyAudioStatsChanged();
void _NotifyPlaybackStateChanged();
void _NotifyPositionChanged(float position);
void _NotifyVolumeChanged(float volume);
friend class InfoWin;
enum {
MAX_AUDIO_BUFFERS = 8,
MAX_VIDEO_BUFFERS = 3,
};
struct buffer_info {
char * buffer;
BBitmap * bitmap;
size_t sizeUsed;
size_t sizeMax;
bigtime_t startTime;
bool formatChanged;
bool endOfStream;
media_format mediaFormat;
};
VideoView * fVideoView;
volatile bool fPaused;
volatile bool fStopped;
float fVolume;
entry_ref fRef;
BMediaFile * fMediaFile;
mutable BLocker fDataLock;
VideoSupplier* fVideoSupplier;
AudioSupplier* fAudioSupplier;
BLocker fVideoSupplierLock;
BLocker fAudioSupplierLock;
BList * fAudioTrackList;
BList * fVideoTrackList;
media_format fAudioFormat;
media_format fVideoFormat;
sem_id fAudioDecodeSem;
sem_id fVideoDecodeSem;
sem_id fAudioPlaySem;
sem_id fVideoPlaySem;
sem_id fThreadWaitSem;
thread_id fAudioDecodeThread;
thread_id fVideoDecodeThread;
thread_id fAudioPlayThread;
thread_id fVideoPlayThread;
SoundOutput * fSoundOutput;
volatile bool fSeekAudio;
volatile bool fSeekVideo;
volatile bigtime_t fSeekPosition;
bigtime_t fPosition;
bigtime_t fDuration;
int32 fAudioBufferCount;
int32 fAudioBufferReadIndex;
int32 fAudioBufferWriteIndex;
int32 fVideoBufferCount;
int32 fVideoBufferReadIndex;
int32 fVideoBufferWriteIndex;
buffer_info fAudioBuffer[MAX_AUDIO_BUFFERS];
buffer_info fVideoBuffer[MAX_VIDEO_BUFFERS];
BLocker fTimeSourceLock;
bigtime_t fTimeSourceSysTime;
bigtime_t fTimeSourcePerfTime;
bool fAutoplay;
volatile bool fPauseAtEndOfStream;
volatile bool fSeekToStartAfterPause;
BBitmap * fCurrentBitmap;
BLocker fBitmapLock;
BList fListeners;
};
#endif