desklink: recycle MixerControl and correctly release media nodes.
Change-Id: Id00a7fdb3bfd995bf6891bac85d21931f527606c Reviewed-on: https://review.haiku-os.org/c/haiku/+/2237 Reviewed-by: waddlesplash <[email protected]> Reviewed-by: Stephan Aßmus <[email protected]>
This commit is contained in:
@@ -180,6 +180,7 @@ MediaReplicant::MediaReplicant(BRect frame, const char* name,
|
|||||||
uint32 resizeMask, uint32 flags)
|
uint32 resizeMask, uint32 flags)
|
||||||
:
|
:
|
||||||
BView(frame, name, resizeMask, flags),
|
BView(frame, name, resizeMask, flags),
|
||||||
|
fMixerControl(NULL),
|
||||||
fVolumeSlider(NULL),
|
fVolumeSlider(NULL),
|
||||||
fMuted(false)
|
fMuted(false)
|
||||||
{
|
{
|
||||||
@@ -190,6 +191,7 @@ MediaReplicant::MediaReplicant(BRect frame, const char* name,
|
|||||||
MediaReplicant::MediaReplicant(BMessage* message)
|
MediaReplicant::MediaReplicant(BMessage* message)
|
||||||
:
|
:
|
||||||
BView(message),
|
BView(message),
|
||||||
|
fMixerControl(NULL),
|
||||||
fVolumeSlider(NULL),
|
fVolumeSlider(NULL),
|
||||||
fMuted(false)
|
fMuted(false)
|
||||||
{
|
{
|
||||||
@@ -414,12 +416,11 @@ MediaReplicant::MessageReceived(BMessage* message)
|
|||||||
media_node_id mixerNodeID;
|
media_node_id mixerNodeID;
|
||||||
BMediaRoster* roster = BMediaRoster::CurrentRoster();
|
BMediaRoster* roster = BMediaRoster::CurrentRoster();
|
||||||
if (roster != NULL
|
if (roster != NULL
|
||||||
&& message->FindInt32("media_node_id",&mixerNodeID) == B_OK
|
&& message->FindInt32("media_node_id", &mixerNodeID) == B_OK
|
||||||
&& roster->GetNodeFor(mixerNodeID, &mixerNode) == B_OK) {
|
&& roster->GetNodeFor(mixerNodeID, &mixerNode) == B_OK) {
|
||||||
if (mixerNode.kind == B_SYSTEM_MIXER) {
|
if (mixerNode.kind == B_SYSTEM_MIXER)
|
||||||
_ConnectMixer();
|
_ConnectMixer();
|
||||||
roster->ReleaseNode(mixerNode);
|
roster->ReleaseNode(mixerNode);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -595,6 +596,9 @@ MediaReplicant::_DisconnectMixer()
|
|||||||
|
|
||||||
roster->StopWatching(this, B_MEDIA_SERVER_STARTED | B_MEDIA_NODE_CREATED);
|
roster->StopWatching(this, B_MEDIA_SERVER_STARTED | B_MEDIA_NODE_CREATED);
|
||||||
|
|
||||||
|
if (fMixerControl == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (fMixerControl->MuteNode() != media_node::null) {
|
if (fMixerControl->MuteNode() != media_node::null) {
|
||||||
roster->StopWatching(this, fMixerControl->MuteNode(),
|
roster->StopWatching(this, fMixerControl->MuteNode(),
|
||||||
B_MEDIA_NEW_PARAMETER_VALUE);
|
B_MEDIA_NEW_PARAMETER_VALUE);
|
||||||
@@ -624,6 +628,8 @@ MediaReplicant::_ConnectMixer()
|
|||||||
|
|
||||||
if (errorString != NULL) {
|
if (errorString != NULL) {
|
||||||
SetToolTip(errorString);
|
SetToolTip(errorString);
|
||||||
|
delete fMixerControl;
|
||||||
|
fMixerControl = NULL;
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ MixerControl::Connect(int32 volumeWhich, float* _value, const char** _error)
|
|||||||
errorString = "Media services not running";
|
errorString = "Media services not running";
|
||||||
|
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
fGainMediaNode = media_node::null;
|
_Disconnect();
|
||||||
fMuteMediaNode = media_node::null;
|
fMuteMediaNode = media_node::null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user