diff --git a/src/spice-gstaudio.c b/src/spice-gstaudio.c
index d67727fbcf1af0faefe310128cf9a97563dba0dd..e2b06157f6966ac236ac38ab4e0e8327db092ddb 100644
--- a/src/spice-gstaudio.c
+++ b/src/spice-gstaudio.c
@@ -519,7 +519,11 @@ static gboolean connect_channel(SpiceAudio *audio, SpiceChannel *channel)
     SpiceGstaudioPrivate *p = gstaudio->priv;
 
     if (SPICE_IS_PLAYBACK_CHANNEL(channel)) {
-        g_return_val_if_fail(p->pchannel == NULL, FALSE);
+        if (p->pchannel) {
+            SPICE_DEBUG("replacing playback channel");
+            g_object_weak_unref(G_OBJECT(p->pchannel), channel_weak_notified, audio);
+            playback_stop(gstaudio);
+        }
 
         p->pchannel = channel;
         g_object_weak_ref(G_OBJECT(p->pchannel), channel_weak_notified, audio);
@@ -538,7 +542,11 @@ static gboolean connect_channel(SpiceAudio *audio, SpiceChannel *channel)
     }
 
     if (SPICE_IS_RECORD_CHANNEL(channel)) {
-        g_return_val_if_fail(p->rchannel == NULL, FALSE);
+        if (p->rchannel) {
+            SPICE_DEBUG("replacing record channel");
+            g_object_weak_unref(G_OBJECT(p->rchannel), channel_weak_notified, audio);
+            record_stop(gstaudio);
+        }
 
         p->rchannel = channel;
         g_object_weak_ref(G_OBJECT(p->rchannel), channel_weak_notified, audio);