diff --git a/src/decoder/plugins/Mpg123DecoderPlugin.cxx b/src/decoder/plugins/Mpg123DecoderPlugin.cxx
index 8277cb2dd..3e4894202 100644
--- a/src/decoder/plugins/Mpg123DecoderPlugin.cxx
+++ b/src/decoder/plugins/Mpg123DecoderPlugin.cxx
@@ -175,27 +175,13 @@ mpd_mpg123_meta(DecoderClient &client, mpg123_handle *const handle)
 }
 
 static void
-mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
+Decode(DecoderClient &client, mpg123_handle &handle)
 {
-	/* open the file */
-
-	int error;
-	mpg123_handle *const handle = mpg123_new(nullptr, &error);
-	if (handle == nullptr) {
-		FmtError(mpg123_domain,
-			 "mpg123_new() failed: {}",
-			 mpg123_plain_strerror(error));
-		return;
-	}
-
-	AtScopeExit(handle) { mpg123_delete(handle); };
-
 	AudioFormat audio_format;
-	if (!mpd_mpg123_open(handle, path_fs) ||
-	    !GetAudioFormat(*handle, audio_format))
+	if (!GetAudioFormat(handle, audio_format))
 		return;
 
-	const off_t num_samples = mpg123_length(handle);
+	const off_t num_samples = mpg123_length(&handle);
 
 	/* tell MPD core we're ready */
 
@@ -206,7 +192,7 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
 	client.Ready(audio_format, true, duration);
 
 	struct mpg123_frameinfo info;
-	if (mpg123_info(handle, &info) != MPG123_OK) {
+	if (mpg123_info(&handle, &info) != MPG123_OK) {
 		info.vbr = MPG123_CBR;
 		info.bitrate = 0;
 	}
@@ -225,14 +211,14 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
 	DecoderCommand cmd;
 	do {
 		/* read metadata */
-		mpd_mpg123_meta(client, handle);
+		mpd_mpg123_meta(client, &handle);
 
 		/* decode */
 
 		unsigned char buffer[8192];
 		size_t nbytes;
-		error = mpg123_read(handle, buffer, sizeof(buffer), &nbytes);
-		if (error != MPG123_OK) {
+		if (int error = mpg123_read(&handle, buffer, sizeof(buffer), &nbytes);
+		    error != MPG123_OK) {
 			if (error != MPG123_DONE)
 				FmtWarning(mpg123_domain,
 					   "mpg123_read() failed: {}",
@@ -244,7 +230,7 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
 		if (info.vbr != MPG123_CBR) {
 			/* FIXME: maybe skip, as too expensive? */
 			/* FIXME: maybe, (info.vbr == MPG123_VBR) ? */
-			if (mpg123_info (handle, &info) != MPG123_OK)
+			if (mpg123_info(&handle, &info) != MPG123_OK)
 				info.bitrate = 0;
 		}
 
@@ -255,7 +241,7 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
 
 		if (cmd == DecoderCommand::SEEK) {
 			off_t c = client.GetSeekFrame();
-			c = mpg123_seek(handle, c, SEEK_SET);
+			c = mpg123_seek(&handle, c, SEEK_SET);
 			if (c < 0)
 				client.SeekError();
 			else {
@@ -268,6 +254,28 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
 	} while (cmd == DecoderCommand::NONE);
 }
 
+static void
+mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
+{
+	/* open the file */
+
+	int error;
+	mpg123_handle *const handle = mpg123_new(nullptr, &error);
+	if (handle == nullptr) {
+		FmtError(mpg123_domain,
+			 "mpg123_new() failed: {}",
+			 mpg123_plain_strerror(error));
+		return;
+	}
+
+	AtScopeExit(handle) { mpg123_delete(handle); };
+
+	if (!mpd_mpg123_open(handle, path_fs))
+		return;
+
+	Decode(client, *handle);
+}
+
 static bool
 mpd_mpg123_scan_file(Path path_fs, TagHandler &handler) noexcept
 {