From 991d9dbf6dd562590f62b82d1015fa9cd515264e Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Wed, 18 Jan 2017 20:16:53 +0100 Subject: [PATCH] MediaConnection: Implement auto release --- .../private/media/experimental/MediaClient.h | 3 ++ .../media/experimental/MediaClientDefs.h | 5 ++- src/kits/media/experimental/MediaClient.cpp | 41 +++++++++++++++++++ .../media/experimental/MediaClientDefs.cpp | 16 +++++++- .../media/experimental/MediaConnection.cpp | 20 ++++++++- 5 files changed, 80 insertions(+), 5 deletions(-) diff --git a/headers/private/media/experimental/MediaClient.h b/headers/private/media/experimental/MediaClient.h index 518b1ec6ce..2f7e593d36 100755 --- a/headers/private/media/experimental/MediaClient.h +++ b/headers/private/media/experimental/MediaClient.h @@ -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; diff --git a/headers/private/media/experimental/MediaClientDefs.h b/headers/private/media/experimental/MediaClientDefs.h index 7f44631c3d..37af1d6ec0 100644 --- a/headers/private/media/experimental/MediaClientDefs.h +++ b/headers/private/media/experimental/MediaClientDefs.h @@ -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; diff --git a/src/kits/media/experimental/MediaClient.cpp b/src/kits/media/experimental/MediaClient.cpp index 482b04ffa6..c37d29a710 100755 --- a/src/kits/media/experimental/MediaClient.cpp +++ b/src/kits/media/experimental/MediaClient.cpp @@ -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(conn)); + fInputs.RemoveItem(&obj); + return B_OK; + } else { + OutputReleaser obj = OutputReleaser(dynamic_cast(conn)); + fOutputs.RemoveItem(&obj); + return B_OK; + } + + return B_ERROR; +} + + void BMediaClient::_ReservedMediaClient0() {} void BMediaClient::_ReservedMediaClient1() {} void BMediaClient::_ReservedMediaClient2() {} diff --git a/src/kits/media/experimental/MediaClientDefs.cpp b/src/kits/media/experimental/MediaClientDefs.cpp index be88def3a0..6985e95cf4 100644 --- a/src/kits/media/experimental/MediaClientDefs.cpp +++ b/src/kits/media/experimental/MediaClientDefs.cpp @@ -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; } diff --git a/src/kits/media/experimental/MediaConnection.cpp b/src/kits/media/experimental/MediaConnection.cpp index 1cfd726c37..06bddac0e1 100644 --- a/src/kits/media/experimental/MediaConnection.cpp +++ b/src/kits/media/experimental/MediaConnection.cpp @@ -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; }