#ifndef _MEDIA_CLIENT_H
#define _MEDIA_CLIENT_H
#include <Buffer.h>
#include <MediaAddOn.h>
#include <MediaClientDefs.h>
#include <MediaDefs.h>
#include <ObjectList.h>
namespace BPrivate { namespace media {
class BMediaClientNode;
class BMediaConnection;
class BMediaInput;
class BMediaOutput;
class InputReleaser;
class OutputReleaser;
class BMediaClient {
public:
BMediaClient(const char* name,
media_type type
= B_MEDIA_UNKNOWN_TYPE,
media_client_kinds
kind = B_MEDIA_PLAYER
& B_MEDIA_RECORDER);
virtual ~BMediaClient();
const media_client& Client() const;
media_client_id Id() const;
const char* Name() const;
media_client_kinds Kinds() const;
media_type MediaType() const;
status_t InitCheck() const;
virtual void ClientRegistered();
virtual status_t RegisterInput(BMediaInput* input);
virtual status_t RegisterOutput(BMediaOutput* output);
virtual status_t Bind(BMediaInput* input,
BMediaOutput* output);
virtual status_t Unbind(BMediaInput* input,
BMediaOutput* output);
virtual status_t Connect(BMediaConnection* ourConnection,
BMediaConnection* theirConnection);
virtual status_t Connect(BMediaConnection* ourConnection,
const media_connection& theirConnection);
virtual status_t Connect(BMediaConnection* ourConnection,
const media_client& client);
virtual status_t Disconnect();
int32 CountInputs() const;
int32 CountOutputs() const;
BMediaInput* InputAt(int32 index) const;
BMediaOutput* OutputAt(int32 index) const;
BMediaInput* FindInput(
const media_connection& input) const;
BMediaOutput* FindOutput(
const media_connection& output) const;
bool IsStarted() const;
status_t Start();
status_t Stop();
status_t Seek(bigtime_t mediaTime,
bigtime_t performanceTime);
status_t Roll(bigtime_t start, bigtime_t stop,
bigtime_t seek);
bigtime_t CurrentTime() const;
virtual BMediaAddOn* AddOn(int32* id) const;
protected:
virtual void HandleStart(bigtime_t performanceTime);
virtual void HandleStop(bigtime_t performanceTime);
virtual void HandleSeek(bigtime_t mediaTime,
bigtime_t performanceTime);
virtual status_t FormatSuggestion(media_type type,
int32 quality, media_format* format);
private:
void _Init();
void _Deinit();
void _AddInput(BMediaInput* input);
void _AddOutput(BMediaOutput* output);
BMediaInput* _FindInput(
const media_destination& dest) const;
BMediaOutput* _FindOutput(
const media_source& source) const;
status_t _ConnectInput(BMediaOutput* output,
const media_connection& input);
status_t _ConnectOutput(BMediaInput* input,
const media_connection& output);
status_t _DisconnectConnection(BMediaConnection* conn);
status_t _ReleaseConnection(BMediaConnection* conn);
status_t fInitErr;
media_client fClient;
bool fRunning;
BMediaClientNode* fNode;
bigtime_t fCurrentTime;
BObjectList<InputReleaser> fInputs;
BObjectList<OutputReleaser> fOutputs;
media_connection_id fLastID;
virtual void _ReservedMediaClient0();
virtual void _ReservedMediaClient1();
virtual void _ReservedMediaClient2();
virtual void _ReservedMediaClient3();
virtual void _ReservedMediaClient4();
virtual void _ReservedMediaClient5();
virtual void _ReservedMediaClient6();
virtual void _ReservedMediaClient7();
virtual void _ReservedMediaClient8();
virtual void _ReservedMediaClient9();
virtual void _ReservedMediaClient10();
uint32 fPadding[64];
friend class BMediaClientNode;
friend class BMediaConnection;
friend class BMediaInput;
friend class BMediaOutput;
};
}
}
using namespace BPrivate::media;
#endif