MediaClientNode: Schedule outgoing connections on start

* Add preliminary binding support.
This commit is contained in:
Dario Casalinuovo 2017-01-15 14:43:33 +01:00
parent 86e8c37605
commit 2c9fa0f278
3 changed files with 36 additions and 8 deletions

View File

@ -128,11 +128,13 @@ protected:
virtual ~BMediaClientNode(); virtual ~BMediaClientNode();
private: private:
void _ScheduleConnections(bigtime_t eventTime);
void _HandleBuffer(BBuffer* buffer); void _HandleBuffer(BBuffer* buffer);
void _ProduceNewBuffer(const media_timed_event* event, void _ProduceNewBuffer(const media_timed_event* event,
bigtime_t late); bigtime_t late);
BMediaClient* fOwner; BMediaClient* fOwner;
bigtime_t fStartTime;
}; };
} }

View File

@ -185,6 +185,7 @@ private:
media_output MediaOutput() const; media_output MediaOutput() const;
bool fEnabled; bool fEnabled;
size_t fFramesSent;
virtual void _ReservedMediaOutput0(); virtual void _ReservedMediaOutput0();
virtual void _ReservedMediaOutput1(); virtual void _ReservedMediaOutput1();

View File

@ -467,10 +467,8 @@ BMediaClientNode::Disconnect(const media_source& source,
if (conn == NULL) if (conn == NULL)
return; return;
if (conn->Destination() == dest) { if (conn->Destination() == dest)
conn->Disconnect(); conn->Disconnect();
conn->Disconnected();
}
} }
@ -481,10 +479,8 @@ BMediaClientNode::EnableOutput(const media_source& source,
CALLED(); CALLED();
BMediaOutput* conn = fOwner->FindOutput(source); BMediaOutput* conn = fOwner->FindOutput(source);
if (conn != NULL) { if (conn != NULL)
conn->SetEnabled(enabled); conn->SetEnabled(enabled);
return;
}
} }
@ -523,7 +519,7 @@ BMediaClientNode::HandleEvent(const media_timed_event* event,
switch (event->type) { switch (event->type) {
// This event is used for inputs which consumes buffers // 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: case BTimedEventQueue::B_HANDLE_BUFFER:
_HandleBuffer((BBuffer*)event->pointer); _HandleBuffer((BBuffer*)event->pointer);
break; break;
@ -537,6 +533,8 @@ BMediaClientNode::HandleEvent(const media_timed_event* event,
{ {
if (RunState() != B_STARTED) if (RunState() != B_STARTED)
fOwner->HandleStart(event->event_time); fOwner->HandleStart(event->event_time);
_ScheduleConnections(event->event_time);
break; 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 void
BMediaClientNode::_HandleBuffer(BBuffer* buffer) BMediaClientNode::_HandleBuffer(BBuffer* buffer)
{ {
@ -579,7 +598,13 @@ BMediaClientNode::_HandleBuffer(BBuffer* buffer)
if (conn != NULL) if (conn != NULL)
conn->BufferReceived(buffer); conn->BufferReceived(buffer);
// TODO: this should be logged someway
// TODO: Investigate system level latency logging
if (conn->HasBinding()) {
BMediaOutput* output = dynamic_cast<BMediaOutput*>(conn->Binding());
output->SendBuffer(buffer);
}
} }