#ifndef _ESDSINK_NODE_H
#define _ESDSINK_NODE_H
#include <MediaDefs.h>
#include <MediaNode.h>
#include <FileInterface.h>
#include <BufferConsumer.h>
#include <BufferProducer.h>
#include <Controllable.h>
#include <MediaEventLooper.h>
#include <ParameterWeb.h>
#include <TimeSource.h>
#include <Controllable.h>
#include <File.h>
#include <Entry.h>
#include "ESDEndpoint.h"
enum {
PARAM_ENABLED,
PARAM_HOST,
PARAM_PORT
};
class ESDSinkNode :
public BBufferConsumer,
#if ENABLE_INPUT
public BBufferProducer,
#endif
#ifdef ENABLE_TS
public BTimeSource,
#endif
public BMediaEventLooper,
public BControllable
{
protected:
virtual ~ESDSinkNode(void);
public:
explicit ESDSinkNode(BMediaAddOn *addon, char* name, BMessage * config);
virtual status_t InitCheck(void) const;
public:
virtual BMediaAddOn* AddOn(
int32 * internal_id) const;
protected:
virtual void Preroll(void);
public:
virtual status_t HandleMessage(
int32 message,
const void * data,
size_t size);
protected:
virtual void NodeRegistered(void);
virtual status_t RequestCompleted(const media_request_info &info);
virtual void SetTimeSource(BTimeSource *timeSource);
virtual status_t AcceptFormat(
const media_destination & dest,
media_format * format);
virtual status_t GetNextInput(
int32 * cookie,
media_input * out_input);
virtual void DisposeInputCookie(
int32 cookie);
virtual void BufferReceived(
BBuffer * buffer);
virtual void ProducerDataStatus(
const media_destination & for_whom,
int32 status,
bigtime_t at_performance_time);
virtual status_t GetLatencyFor(
const media_destination & for_whom,
bigtime_t * out_latency,
media_node_id * out_timesource);
virtual status_t Connected(
const media_source & producer,
const media_destination & where,
const media_format & with_format,
media_input * out_input);
virtual void Disconnected(
const media_source & producer,
const media_destination & where);
virtual status_t FormatChanged(
const media_source & producer,
const media_destination & consumer,
int32 change_tag,
const media_format & format);
virtual status_t SeekTagRequested(
const media_destination & destination,
bigtime_t in_target_time,
uint32 in_flags,
media_seek_tag * out_seek_tag,
bigtime_t * out_tagged_time,
uint32 * out_flags);
#if 0
virtual status_t FormatSuggestionRequested( media_type type,
int32 quality,
media_format* format);
virtual status_t FormatProposal( const media_source& output,
media_format* format);
virtual status_t FormatChangeRequested( const media_source& source,
const media_destination& destination,
media_format* io_format,
int32* _deprecated_);
virtual status_t GetNextOutput( int32* cookie,
media_output* out_output);
virtual status_t DisposeOutputCookie( int32 cookie);
virtual status_t SetBufferGroup( const media_source& for_source,
BBufferGroup* group);
virtual status_t PrepareToConnect( const media_source& what,
const media_destination& where,
media_format* format,
media_source* out_source,
char* out_name);
virtual void Connect( status_t error,
const media_source& source,
const media_destination& destination,
const media_format& format,
char* io_name);
virtual void Disconnect( const media_source& what,
const media_destination& where);
virtual void LateNoticeReceived( const media_source& what,
bigtime_t how_much,
bigtime_t performance_time);
virtual void EnableOutput( const media_source & what,
bool enabled,
int32* _deprecated_);
virtual void AdditionalBufferRequested( const media_source& source,
media_buffer_id prev_buffer,
bigtime_t prev_time,
const media_seek_tag* prev_tag);
#endif
protected:
virtual void HandleEvent( const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
#ifdef ENABLE_TS
protected:
virtual void SetRunMode( run_mode mode);
virtual status_t TimeSourceOp( const time_source_op_info &op,
void *_reserved);
#endif
protected:
virtual status_t GetParameterValue( int32 id,
bigtime_t* last_change,
void* value,
size_t* ioSize);
virtual void SetParameterValue( int32 id,
bigtime_t when,
const void* value,
size_t size);
virtual BParameterWeb* MakeParameterWeb();
protected:
virtual status_t HandleStart(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleSeek(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleWarp(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleStop(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleBuffer(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleDataStatus(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleParameter(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
public:
static void GetFlavor(flavor_info * outInfo, int32 id);
static void GetFormat(media_format * outFormat);
status_t GetConfigurationFor(BMessage * into_message);
private:
ESDSinkNode(
const ESDSinkNode & clone);
ESDSinkNode & operator=(
const ESDSinkNode & clone);
#if 0
void AllocateBuffers(node_output &channel);
BBuffer* FillNextBuffer( multi_buffer_info &MBI,
node_output &channel);
void UpdateTimeSource(multi_buffer_info &MBI,
multi_buffer_info &oldMBI,
node_input &input);
#endif
status_t fInitCheckStatus;
BMediaAddOn *fAddOn;
int32 fId;
BList fInputs;
media_input fInput;
bigtime_t fLatency;
BList fOutputs;
media_output fOutput;
media_format fPreferredFormat;
bigtime_t fInternalLatency;
bigtime_t fBufferPeriod;
sem_id fBuffer_free;
thread_id fThread;
BString fHostname;
uint16 fPort;
bool fEnabled;
ESDEndpoint *fDevice;
bool fTimeSourceStarted;
BParameterWeb *fWeb;
BMessage fConfig;
};
#endif