Index: uspace/srv/audio/hound/audio_client.c
===================================================================
--- uspace/srv/audio/hound/audio_client.c	(revision bb67def56a2705d6c852baf616430e445e8b28e6)
+++ uspace/srv/audio/hound/audio_client.c	(revision 389ef250f758435cc00319532ba5a66e0074ec08)
@@ -80,5 +80,5 @@
 	init_common(client, name, f, sess);
 	audio_sink_init(&client->sink, name, client,
-	    client_sink_connection_change, f);
+	    client_sink_connection_change, NULL, f);
 	client->is_recording = true;
 	return client;
Index: uspace/srv/audio/hound/audio_device.c
===================================================================
--- uspace/srv/audio/hound/audio_device.c	(revision bb67def56a2705d6c852baf616430e445e8b28e6)
+++ uspace/srv/audio/hound/audio_device.c	(revision 389ef250f758435cc00319532ba5a66e0074ec08)
@@ -51,4 +51,5 @@
 static int device_source_connection_callback(audio_source_t *source);
 static void device_event_callback(ipc_callid_t iid, ipc_call_t *icall, void *arg);
+static int device_check_format(audio_sink_t* sink);
 static int get_buffer(audio_device_t *dev);
 static int release_buffer(audio_device_t *dev);
@@ -68,5 +69,5 @@
 
 	audio_sink_init(&dev->sink, name, dev, device_sink_connection_callback,
-	    &AUDIO_FORMAT_ANY);
+	    device_check_format, &AUDIO_FORMAT_ANY);
 	audio_source_init(&dev->source, name, dev,
 	    device_source_connection_callback, NULL, &AUDIO_FORMAT_ANY);
@@ -222,4 +223,13 @@
 	}
 }
+static int device_check_format(audio_sink_t* sink)
+{
+	assert(sink);
+	audio_device_t *dev = sink->private_data;
+	assert(dev);
+	log_verbose("Checking format on sink %s", sink->name);
+	return audio_pcm_test_format(dev->sess, &sink->format.channels,
+	    &sink->format.sampling_rate, &sink->format.sample_format);
+}
 
 static int get_buffer(audio_device_t *dev)
Index: uspace/srv/audio/hound/audio_sink.c
===================================================================
--- uspace/srv/audio/hound/audio_sink.c	(revision bb67def56a2705d6c852baf616430e445e8b28e6)
+++ uspace/srv/audio/hound/audio_sink.c	(revision 389ef250f758435cc00319532ba5a66e0074ec08)
@@ -46,5 +46,5 @@
 int audio_sink_init(audio_sink_t *sink, const char *name,
     void *private_data, int (*connection_change)(audio_sink_t *, bool),
-    const audio_format_t *f)
+    int (*check_format)(audio_sink_t *sink), const audio_format_t *f)
 {
 	assert(sink);
@@ -59,4 +59,5 @@
 	sink->format = *f;
 	sink->connection_change = connection_change;
+	sink->check_format = check_format;
 	log_verbose("Initialized sink (%p) '%s'", sink, sink->name);
 	return EOK;
@@ -70,5 +71,4 @@
 	sink->name = NULL;
 }
-
 
 int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source)
@@ -85,20 +85,7 @@
 		/* Set audio format according to the first source */
 		if (audio_format_is_any(&sink->format)) {
-			/* Source does not care */
-			if (audio_format_is_any(&source->format)) {
-				log_verbose("Set default format for sink %s.",
-				    sink->name);
-				sink->format = AUDIO_FORMAT_DEFAULT;
-			} else {
-				log_verbose("Set format based on the first "
-				    "source(%s): %u channel(s), %uHz, %s for "
-				    "sink %s.", source->name,
-				    source->format.channels,
-				    source->format.sampling_rate,
-				    pcm_sample_format_str(
-				        source->format.sample_format),
-				    sink->name);
-				sink->format = source->format;
-			}
+			int ret = audio_sink_set_format(sink, &source->format);
+			if (ret != EOK)
+				return ret;
 		}
 	}
@@ -120,4 +107,34 @@
 	    source->name, sink->name);
 
+	return EOK;
+}
+
+int audio_sink_set_format(audio_sink_t *sink, const audio_format_t *format)
+{
+	assert(sink);
+	assert(format);
+	if (!audio_format_is_any(&sink->format)) {
+		log_debug("Sink %s already has a format", sink->name);
+		return EEXISTS;
+	}
+	const audio_format_t old_format;
+
+	if (audio_format_is_any(format)) {
+		log_verbose("Setting DEFAULT format for sink %s", sink->name);
+		sink->format = AUDIO_FORMAT_DEFAULT;
+	} else {
+		sink->format = *format;
+	}
+	if (sink->check_format) {
+		const int ret = sink->check_format(sink);
+		if (ret != EOK && ret != ELIMIT) {
+			log_debug("Format check failed on sink %s", sink->name);
+			sink->format = old_format;
+			return ret;
+		}
+	}
+	log_verbose("Set format for sink %s: %u channel(s), %uHz, %s",
+	    sink->name, format->channels, format->sampling_rate,
+	    pcm_sample_format_str(format->sample_format));
 	return EOK;
 }
Index: uspace/srv/audio/hound/audio_sink.h
===================================================================
--- uspace/srv/audio/hound/audio_sink.h	(revision bb67def56a2705d6c852baf616430e445e8b28e6)
+++ uspace/srv/audio/hound/audio_sink.h	(revision 389ef250f758435cc00319532ba5a66e0074ec08)
@@ -54,4 +54,5 @@
 	void *private_data;
 	int (*connection_change)(audio_sink_t *, bool);
+	int (*check_format)(audio_sink_t *);
 };
 
@@ -63,7 +64,8 @@
 int audio_sink_init(audio_sink_t *sink, const char *name,
     void *private_data, int (*connection_change)(audio_sink_t *, bool),
-    const audio_format_t *f);
+    int (*check_format)(audio_sink_t *), const audio_format_t *f);
 void audio_sink_fini(audio_sink_t *sink);
 
+int audio_sink_set_format(audio_sink_t *sink, const audio_format_t *format);
 int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source);
 int audio_sink_remove_source(audio_sink_t *sink, audio_source_t *source);
