From e79dc1ff93eb0752fdfd36475f3d45273c1217a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 10 Feb 2020 22:22:35 +0100 Subject: [PATCH] desklink: recycle MixerControl and correctly release media nodes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id00a7fdb3bfd995bf6891bac85d21931f527606c Reviewed-on: https://review.haiku-os.org/c/haiku/+/2237 Reviewed-by: waddlesplash Reviewed-by: Stephan Aßmus --- src/bin/desklink/MediaReplicant.cpp | 14 ++++++++++---- src/bin/desklink/MixerControl.cpp | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/bin/desklink/MediaReplicant.cpp b/src/bin/desklink/MediaReplicant.cpp index 5bbc523348..d37a205738 100644 --- a/src/bin/desklink/MediaReplicant.cpp +++ b/src/bin/desklink/MediaReplicant.cpp @@ -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; } diff --git a/src/bin/desklink/MixerControl.cpp b/src/bin/desklink/MixerControl.cpp index cdc6d3ffa7..7b989f3aff 100644 --- a/src/bin/desklink/MixerControl.cpp +++ b/src/bin/desklink/MixerControl.cpp @@ -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; }