* Copyright (c) 2000-2008, Ingo Weinhold <ingo_weinhold@gmx.de>,
* Copyright (c) 2000-2008, Stephan Aßmus <superstippi@gmx.de>,
* All Rights Reserved. Distributed under the terms of the MIT license.
*/
#ifndef NODE_MANAGER_H
#define NODE_MANAGER_H
#include <MediaNode.h>
#include "PlaybackManager.h"
class BMediaRoster;
class AudioProducer;
class VideoTarget;
class VideoProducer;
class VideoConsumer;
class AudioSupplier;
class VideoSupplier;
class NodeManager : public PlaybackManager {
public:
NodeManager();
virtual ~NodeManager();
virtual VideoTarget* CreateVideoTarget() = 0;
virtual VideoSupplier* CreateVideoSupplier() = 0;
virtual AudioSupplier* CreateAudioSupplier() = 0;
enum {
AUDIO_AND_VIDEO = 0,
VIDEO_ONLY,
AUDIO_ONLY
};
status_t Init(BRect videoBounds, float videoFrameRate,
color_space preferredVideoFormat,
float audioFrameRate, uint32 audioChannels,
int32 loopingMode, bool loopingEnabled,
float speed, uint32 enabledNodes,
bool useOverlays);
status_t InitCheck();
status_t CleanupNodes();
status_t FormatChanged(BRect videoBounds,
float videoFrameRate,
color_space preferredVideoFormat,
float audioFrameRate, uint32 audioChannels,
uint32 enabledNodes,
bool useOverlays,
bool force = false);
virtual void SetPlayMode(int32 mode,
bool continuePlaying = true);
virtual bigtime_t RealTimeForTime(bigtime_t time) const;
virtual bigtime_t TimeForRealTime(bigtime_t time) const;
virtual void SetCurrentAudioTime(bigtime_t time);
void SetVideoBounds(BRect bounds);
virtual BRect VideoBounds() const;
void SetVideoTarget(VideoTarget* vcTarget);
VideoTarget* GetVideoTarget() const;
virtual void SetVolume(float percent);
void SetPeakListener(BHandler* handler);
private:
status_t _SetUpNodes(color_space preferredVideoFormat,
uint32 enabledNodes, bool useOverlays,
float audioFrameRate,
uint32 audioChannels);
status_t _SetUpVideoNodes(
color_space preferredVideoFormat,
bool useOverlays);
status_t _SetUpAudioNodes(float audioFrameRate,
uint32 audioChannels);
status_t _TearDownNodes(bool disconnect = true);
status_t _StartNodes();
void _StopNodes();
private:
struct Connection {
Connection();
media_node producer;
media_node consumer;
media_source source;
media_destination destination;
media_format format;
bool connected;
};
private:
BMediaRoster* fMediaRoster;
AudioProducer* fAudioProducer;
VideoConsumer* fVideoConsumer;
VideoProducer* fVideoProducer;
media_node fTimeSource;
Connection fAudioConnection;
Connection fVideoConnection;
bigtime_t fPerformanceTimeBase;
status_t fStatus;
VideoTarget* fVideoTarget;
AudioSupplier* fAudioSupplier;
VideoSupplier* fVideoSupplier;
BRect fVideoBounds;
BHandler* fPeakListener;
};
#endif