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:
Jérôme Duval
2020-02-11 18:59:37 +00:00
parent 90bf90fac5
commit e79dc1ff93
2 changed files with 11 additions and 5 deletions
+10 -4
View File
@@ -180,6 +180,7 @@ MediaReplicant::MediaReplicant(BRect frame, const char* name,
uint32 resizeMask, uint32 flags)
:
BView(frame, name, resizeMask, flags),
fMixerControl(NULL),
fVolumeSlider(NULL),
fMuted(false)
{
@@ -190,6 +191,7 @@ MediaReplicant::MediaReplicant(BRect frame, const char* name,
MediaReplicant::MediaReplicant(BMessage* message)
:
BView(message),
fMixerControl(NULL),
fVolumeSlider(NULL),
fMuted(false)
{
@@ -414,12 +416,11 @@ MediaReplicant::MessageReceived(BMessage* message)
media_node_id mixerNodeID;
BMediaRoster* roster = BMediaRoster::CurrentRoster();
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) {
if (mixerNode.kind == B_SYSTEM_MIXER) {
if (mixerNode.kind == B_SYSTEM_MIXER)
_ConnectMixer();
roster->ReleaseNode(mixerNode);
}
roster->ReleaseNode(mixerNode);
}
break;
}
@@ -595,6 +596,9 @@ MediaReplicant::_DisconnectMixer()
roster->StopWatching(this, B_MEDIA_SERVER_STARTED | B_MEDIA_NODE_CREATED);
if (fMixerControl == NULL)
return;
if (fMixerControl->MuteNode() != media_node::null) {
roster->StopWatching(this, fMixerControl->MuteNode(),
B_MEDIA_NEW_PARAMETER_VALUE);
@@ -624,6 +628,8 @@ MediaReplicant::_ConnectMixer()
if (errorString != NULL) {
SetToolTip(errorString);
delete fMixerControl;
fMixerControl = NULL;
return B_ERROR;
}
+1 -1
View File
@@ -155,7 +155,7 @@ MixerControl::Connect(int32 volumeWhich, float* _value, const char** _error)
errorString = "Media services not running";
if (status != B_OK) {
fGainMediaNode = media_node::null;
_Disconnect();
fMuteMediaNode = media_node::null;
}