MediaConnection: Implement auto release

This commit is contained in:
Dario Casalinuovo 2017-01-18 20:16:53 +01:00
parent 0844ddf4d9
commit 991d9dbf6d
5 changed files with 80 additions and 5 deletions

View File

@ -167,6 +167,9 @@ private:
status_t _ConnectOutput(BMediaInput* input,
const media_connection& output);
status_t _DisconnectConnection(BMediaConnection* conn);
status_t _ReleaseConnection(BMediaConnection* conn);
status_t fInitErr;
media_client fClient;

View File

@ -72,13 +72,14 @@ private:
const media_source& _Source() const;
const media_destination& _Destination() const;
media_node _Node() const;
media_node _RemoteNode() const;
media_connection_id id;
media_client client;
// TODO really needed?
media_client remote_client;
media_node remote_node;
media_source source;
media_destination destination;

View File

@ -576,6 +576,47 @@ BMediaClient::_ConnectOutput(BMediaInput* input,
}
status_t
BMediaClient::_DisconnectConnection(BMediaConnection* conn)
{
if (conn->Client() != this)
return B_ERROR;
const media_connection& handle = conn->Connection();
if (handle.IsInput()) {
return BMediaRoster::CurrentRoster()->Disconnect(
handle._RemoteNode().node, handle._Source(),
handle._Node().node, handle._Destination());
} else {
return BMediaRoster::CurrentRoster()->Disconnect(
handle._Node().node, handle._Source(),
handle._RemoteNode().node, handle._Destination());
}
return B_ERROR;
}
status_t
BMediaClient::_ReleaseConnection(BMediaConnection* conn)
{
if (conn->Client() != this)
return B_ERROR;
if (conn->Connection().IsInput()) {
InputReleaser obj = InputReleaser(dynamic_cast<BMediaInput*>(conn));
fInputs.RemoveItem(&obj);
return B_OK;
} else {
OutputReleaser obj = OutputReleaser(dynamic_cast<BMediaOutput*>(conn));
fOutputs.RemoveItem(&obj);
return B_OK;
}
return B_ERROR;
}
void BMediaClient::_ReservedMediaClient0() {}
void BMediaClient::_ReservedMediaClient1() {}
void BMediaClient::_ReservedMediaClient2() {}

View File

@ -23,6 +23,13 @@ media_client::Kinds() const
}
const media_client&
media_connection::Client() const
{
return client;
}
media_connection_id
media_connection::Id() const
{
@ -92,5 +99,12 @@ media_connection::_Destination() const
media_node
media_connection::_RemoteNode() const
{
return remote_client.node;
return remote_node;
}
media_node
media_connection::_Node() const
{
return client.node;
}

View File

@ -40,6 +40,13 @@ BMediaConnection::Connection() const
}
BMediaClient*
BMediaConnection::Client() const
{
return fOwner;
}
bool
BMediaConnection::HasBinding() const
{
@ -90,10 +97,14 @@ BMediaConnection::Disconnect()
{
CALLED();
status_t ret = fOwner->_DisconnectConnection(this);
if (ret != B_OK)
return ret;
delete fBufferGroup;
fBufferGroup = NULL;
return B_OK;
return ret;
}
@ -102,7 +113,12 @@ BMediaConnection::Release()
{
CALLED();
return B_OK;
status_t ret = fOwner->_ReleaseConnection(this);
if (ret != B_OK)
return ret;
delete this;
return ret;
}