Index: uspace/app/modplay/modplay.c
===================================================================
--- uspace/app/modplay/modplay.c	(revision 21374e03107e5b1bc843b1d8e853a323ab9db107)
+++ uspace/app/modplay/modplay.c	(revision 485281ee109cb67a53bd978db893bb14a9b75e5c)
@@ -39,4 +39,5 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <str.h>
 #include <str_error.h>
 #include <trackmod.h>
@@ -67,4 +68,11 @@
 }
 
+static void print_syntax(void)
+{
+	printf("syntax: modplay [<options>] <filename.mod>\n");
+	printf("options:\n");
+	printf("\t-t <target>\tOutput to specified audio target.\n");
+}
+
 int main(int argc, char *argv[])
 {
@@ -78,8 +86,33 @@
 	void *buffer;
 	size_t buffer_size;
+	const char *target = HOUND_DEFAULT_TARGET;
 	errno_t rc;
 
-	if (argc != 2) {
-		printf("syntax: modplay <filename.mod>\n");
+	++argv;
+	--argc;
+
+	while (argc > 0 && (*argv)[0] == '-') {
+		if (str_cmp(*argv, "-t") == 0) {
+			++argv;
+			--argc;
+
+			if (argc < 1) {
+				printf("Option '-t' requires an argument.\n");
+				print_syntax();
+				return 1;
+			}
+
+			target = *argv++;
+			--argc;
+			continue;
+		}
+
+		printf("Invalid option '%s'\n", *argv);
+		print_syntax();
+		return 1;
+	}
+
+	if (argc != 1) {
+		print_syntax();
 		return 1;
 	}
@@ -87,7 +120,7 @@
 	con = console_init(stdin, stdout);
 
-	rc = trackmod_module_load(argv[1], &mod);
+	rc = trackmod_module_load(argv[0], &mod);
 	if (rc != EOK) {
-		printf("Error loading %s.\n", argv[1]);
+		printf("Error loading %s.\n", argv[0]);
 		return 1;
 	}
@@ -114,7 +147,18 @@
 	}
 
-	rc = hound_context_connect_target(hound, HOUND_DEFAULT_TARGET);
+	rc = hound_context_connect_target(hound, target);
 	if (rc != EOK) {
-		printf("Error connecting default audio target: %s.\n", str_error(rc));
+		printf("Error connecting audio target '%s': %s.\n",
+		    target, str_error(rc));
+
+		char **names = NULL;
+		size_t count = 0;
+		rc = hound_context_get_available_targets(hound, &names, &count);
+		if (rc == EOK) {
+			printf("Available targets:\n");
+			for (size_t i = 0; i < count; i++)
+				printf(" - %s\n", names[i]);
+		}
+
 		return 1;
 	}
Index: uspace/app/wavplay/main.c
===================================================================
--- uspace/app/wavplay/main.c	(revision 21374e03107e5b1bc843b1d8e853a323ab9db107)
+++ uspace/app/wavplay/main.c	(revision 485281ee109cb67a53bd978db893bb14a9b75e5c)
@@ -119,5 +119,5 @@
  * @return Error code
  */
-static errno_t hplay(const char *filename)
+static errno_t hplay(const char *filename, const char *target)
 {
 	printf("Hound playback: %s\n", filename);
@@ -158,8 +158,18 @@
 	}
 
-	ret = hound_context_connect_target(hound, HOUND_DEFAULT_TARGET);
+	ret = hound_context_connect_target(hound, target);
 	if (ret != EOK) {
-		printf("Failed to connect to default target: %s\n",
+		printf("Failed to connect to target '%s': %s\n", target,
 		    str_error(ret));
+
+		char **names = NULL;
+		size_t count = 0;
+		ret = hound_context_get_available_targets(hound, &names, &count);
+		if (ret == EOK) {
+			printf("Available targets:\n");
+			for (size_t i = 0; i < count; i++)
+				printf(" - %s\n", names[i]);
+		}
+
 		hound_context_destroy(hound);
 		fclose(source);
@@ -215,4 +225,5 @@
 	{ "parallel", no_argument, 0, 'p' },
 	{ "record", no_argument, 0, 'r' },
+	{ "target", required_argument, 0, 't' },
 	{ "help", no_argument, 0, 'h' },
 	{ 0, 0, 0, 0 }
@@ -230,6 +241,7 @@
 	printf("\t -r, --record\t Start recording instead of playback. "
 	    "(Not implemented)\n");
-	printf("\t -d, --device\t Use specified device instead of the sound "
-	    "service. Use location path or a special device `default'\n");
+	printf("\t -d, --device\t Direct output to specified device instead of "
+	    "the sound service. Use location path or a special device `default'\n");
+	printf("\t -t, --target\t Output to the specified audio target.\n");
 	printf("\t -p, --parallel\t Play given files in parallel instead of "
 	    "sequentially (does not work with -d).\n");
@@ -239,4 +251,5 @@
 {
 	const char *device = "default";
+	const char *target = HOUND_DEFAULT_TARGET;
 	int idx = 0;
 	bool direct = false, record = false, parallel = false;
@@ -246,5 +259,5 @@
 	/* Parse command line options */
 	while (ret != -1) {
-		ret = getopt_long(argc, argv, "d:prh", opts, &idx);
+		ret = getopt_long(argc, argv, "d:prt:h", opts, &idx);
 		switch (ret) {
 		case 'd':
@@ -257,4 +270,7 @@
 		case 'p':
 			parallel = true;
+			break;
+		case 't':
+			target = optarg;
 			break;
 		case 'h':
@@ -334,5 +350,5 @@
 				fibril_add_ready(fid);
 			} else {
-				hplay(file);
+				hplay(file, target);
 			}
 		}
