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();
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue