From abd87fdcf86c1062c6fe514c424cfcfac3cfebfa Mon Sep 17 00:00:00 2001
From: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
Date: Sun, 27 Sep 2026 12:25:50 -0300
Subject: Fix ALSA cleanup after PCM setup failure
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Playback-only mode leaves m_pcm_capture null. When setPcmParams() fails, the open() cleanup previously passed that null handle to snd_pcm_close(), triggering ALSA assertion failure and preventing artsd from reaching its -f null-output fallback. Guard each handle before closing it, including the capture-open error path.

Signed-off-by: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
---
 flow/audioioalsa.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/flow/audioioalsa.cpp b/flow/audioioalsa.cpp
index 9162d41..1c04e38 100644
--- a/flow/audioioalsa.cpp
+++ b/flow/audioioalsa.cpp
@@ -177,7 +177,9 @@ bool AudioIOALSA::open()
 			_error += " can't be opened for capture (";
 			_error += snd_strerror(err);
 			_error += ")";
-			snd_pcm_close(m_pcm_playback);
+			if (m_pcm_playback) {
+				snd_pcm_close(m_pcm_playback);
+			}
 			return false;
 		}
 		snd_pcm_nonblock(m_pcm_capture, 0);
@@ -191,8 +193,12 @@ bool AudioIOALSA::open()
 	/* set PCM communication parameters */
 	if (((_direction & directionWrite) && setPcmParams(m_pcm_playback)) ||
 	    ((_direction & directionRead) && setPcmParams(m_pcm_capture))) {
-		snd_pcm_close(m_pcm_playback);
-		snd_pcm_close(m_pcm_capture);
+		if (m_pcm_playback) {
+			snd_pcm_close(m_pcm_playback);
+		}
+		if (m_pcm_capture) {
+			snd_pcm_close(m_pcm_capture);
+		}
 		return false;
 	}
 
-- 
cgit v1.2.3

