diff --git a/headers/private/media/MediaClientNode.h b/headers/private/media/MediaClientNode.h index d151ad9dbd..e7a27c60e3 100755 --- a/headers/private/media/MediaClientNode.h +++ b/headers/private/media/MediaClientNode.h @@ -128,11 +128,13 @@ protected: virtual ~BMediaClientNode(); private: + void _ScheduleConnections(bigtime_t eventTime); void _HandleBuffer(BBuffer* buffer); void _ProduceNewBuffer(const media_timed_event* event, bigtime_t late); BMediaClient* fOwner; + bigtime_t fStartTime; }; } diff --git a/headers/private/media/MediaConnection.h b/headers/private/media/MediaConnection.h index 97694a15d3..98bac5237f 100644 --- a/headers/private/media/MediaConnection.h +++ b/headers/private/media/MediaConnection.h @@ -185,6 +185,7 @@ private: media_output MediaOutput() const; bool fEnabled; + size_t fFramesSent; virtual void _ReservedMediaOutput0(); virtual void _ReservedMediaOutput1(); diff --git a/src/kits/media/MediaClientNode.cpp b/src/kits/media/MediaClientNode.cpp index 563a9ace1a..84a0eab78d 100755 --- a/src/kits/media/MediaClientNode.cpp +++ b/src/kits/media/MediaClientNode.cpp @@ -467,10 +467,8 @@ BMediaClientNode::Disconnect(const media_source& source, if (conn == NULL) return; - if (conn->Destination() == dest) { + if (conn->Destination() == dest) conn->Disconnect(); - conn->Disconnected(); - } } @@ -481,10 +479,8 @@ BMediaClientNode::EnableOutput(const media_source& source, CALLED(); BMediaOutput* conn = fOwner->FindOutput(source); - if (conn != NULL) { + if (conn != NULL) conn->SetEnabled(enabled); - return; - } } @@ -523,7 +519,7 @@ BMediaClientNode::HandleEvent(const media_timed_event* event, switch (event->type) { // This event is used for inputs which consumes buffers - // or binded connections which also sent them to an output. + // or binded connections which also send them to an output. case BTimedEventQueue::B_HANDLE_BUFFER: _HandleBuffer((BBuffer*)event->pointer); break; @@ -537,6 +533,8 @@ BMediaClientNode::HandleEvent(const media_timed_event* event, { if (RunState() != B_STARTED) fOwner->HandleStart(event->event_time); + + _ScheduleConnections(event->event_time); break; } @@ -568,6 +566,27 @@ BMediaClientNode::~BMediaClientNode() } +void +BMediaClientNode::_ScheduleConnections(bigtime_t eventTime) +{ + for (int32 i = 0; i < fOwner->CountOutputs(); i++) { + BMediaOutput* output = fOwner->OutputAt(i); + + if (output->HasBinding()) + continue; + + fStartTime = eventTime; + media_timed_event firstBufferEvent(eventTime, + B_NEW_BUFFER); + + output->fFramesSent = 0; + + firstBufferEvent.pointer = (void*) output; + EventQueue()->AddEvent(firstBufferEvent); + } +} + + void BMediaClientNode::_HandleBuffer(BBuffer* buffer) { @@ -579,7 +598,13 @@ BMediaClientNode::_HandleBuffer(BBuffer* buffer) if (conn != NULL) conn->BufferReceived(buffer); - // TODO: this should be logged someway + + // TODO: Investigate system level latency logging + + if (conn->HasBinding()) { + BMediaOutput* output = dynamic_cast(conn->Binding()); + output->SendBuffer(buffer); + } }