diff --git a/NEWS b/NEWS
index 355281c61..4a9237bc8 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ ver 0.23.8 (not yet released)
   - alsa: fix setting volume before playback starts
   - pipewire: fix crash bug
   - pipewire: fix volume change events with PipeWire 0.3.53
+  - pipewire: don't force initial volume=100%
 * support libfmt 9
 
 ver 0.23.7 (2022/05/09)
diff --git a/src/output/plugins/PipeWireOutputPlugin.cxx b/src/output/plugins/PipeWireOutputPlugin.cxx
index a64471a15..524ab3d87 100644
--- a/src/output/plugins/PipeWireOutputPlugin.cxx
+++ b/src/output/plugins/PipeWireOutputPlugin.cxx
@@ -89,8 +89,12 @@ class PipeWireOutput final : AudioOutput {
 
 	/**
 	 * The current volume level (0.0 .. 1.0).
+	 *
+	 * This get initialized to -1 which means "unknown", so
+	 * restore_volume will not attempt to override PipeWire's
+	 * initial volume level.
 	 */
-	float volume = 1.0f;
+	float volume = -1;
 
 	PipeWireMixer *mixer = nullptr;
 	unsigned channels;
@@ -669,12 +673,14 @@ PipeWireOutput::ParamChanged([[maybe_unused]] uint32_t id,
 	if (restore_volume) {
 		restore_volume = false;
 
-		try {
-			::SetVolume(*stream, channels, volume);
-		} catch (...) {
-			FmtError(pipewire_output_domain,
-				 FMT_STRING("Failed to restore volume: {}"),
-				 std::current_exception());
+		if (volume >= 0) {
+			try {
+				::SetVolume(*stream, channels, volume);
+			} catch (...) {
+				FmtError(pipewire_output_domain,
+					 FMT_STRING("Failed to restore volume: {}"),
+					 std::current_exception());
+			}
 		}
 	}