MediaClientNode: Schedule outgoing connections on start
* Add preliminary binding support.
This commit is contained in:
parent
86e8c37605
commit
2c9fa0f278
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -185,6 +185,7 @@ private:
|
|||
media_output MediaOutput() const;
|
||||
|
||||
bool fEnabled;
|
||||
size_t fFramesSent;
|
||||
|
||||
virtual void _ReservedMediaOutput0();
|
||||
virtual void _ReservedMediaOutput1();
|
||||
|
|
|
@ -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<BMediaOutput*>(conn->Binding());
|
||||
output->SendBuffer(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue