forked from pool/alsa-utils
Takashi Iwai
f57427e846
- backport from upstream tree: * add support for the new chmap API OBS-URL: https://build.opensuse.org/request/show/138458 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa-utils?expand=0&rev=60
107 lines
3.1 KiB
Diff
107 lines
3.1 KiB
Diff
From a9add2252f44fae3eb0ce5470cb842f220fb0454 Mon Sep 17 00:00:00 2001
|
|
From: Takashi Iwai <tiwai@suse.de>
|
|
Date: Tue, 11 Sep 2012 12:20:55 +0200
|
|
Subject: [PATCH 2/5] aplay: Add support for channel mapping
|
|
|
|
With -m option, user can specify the order of channel map.
|
|
As of this commit, it just tries to override the channel map, thus it
|
|
works only on devices that support the channel map override like HDMI.
|
|
Adjusting the channel order in aplay itself will be added later.
|
|
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
aplay/aplay.c | 40 ++++++++++++++++++++++++++++++++++++++--
|
|
1 file changed, 38 insertions(+), 2 deletions(-)
|
|
|
|
--- a/aplay/aplay.c
|
|
+++ b/aplay/aplay.c
|
|
@@ -54,6 +54,10 @@
|
|
#include "formats.h"
|
|
#include "version.h"
|
|
|
|
+#ifdef SND_CHMAP_API_VERSION
|
|
+#define CONFIG_SUPPORT_CHMAP 1
|
|
+#endif
|
|
+
|
|
#ifndef LLONG_MAX
|
|
#define LLONG_MAX 9223372036854775807LL
|
|
#endif
|
|
@@ -140,6 +144,10 @@ static char *pidfile_name = NULL;
|
|
FILE *pidf = NULL;
|
|
static int pidfile_written = 0;
|
|
|
|
+#ifdef CONFIG_SUPPORT_CHMAP
|
|
+static snd_pcm_chmap_t *channel_map = NULL;
|
|
+#endif
|
|
+
|
|
/* needed prototypes */
|
|
|
|
static void done_stdin(void);
|
|
@@ -227,7 +235,9 @@ _("Usage: %s [OPTION]... [FILE]...\n"
|
|
" --process-id-file write the process ID here\n"
|
|
" --use-strftime apply the strftime facility to the output file name\n"
|
|
" --dump-hw-params dump hw_params of the device\n"
|
|
-" --fatal-errors treat all errors as fatal\n")
|
|
+" --fatal-errors treat all errors as fatal\n"
|
|
+"-m, --chmap=ch1,ch2,.. Give the channel map to override\n"
|
|
+ )
|
|
, command);
|
|
printf(_("Recognized sample formats are:"));
|
|
for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) {
|
|
@@ -428,7 +438,11 @@ enum {
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int option_index;
|
|
- static const char short_options[] = "hnlLD:qt:c:f:r:d:MNF:A:R:T:B:vV:IPCi";
|
|
+ static const char short_options[] = "hnlLD:qt:c:f:r:d:MNF:A:R:T:B:vV:IPCi"
|
|
+#ifdef CONFIG_SUPPORT_CHMAP
|
|
+ "m:"
|
|
+#endif
|
|
+ ;
|
|
static const struct option long_options[] = {
|
|
{"help", 0, 0, 'h'},
|
|
{"version", 0, 0, OPT_VERSION},
|
|
@@ -469,6 +483,9 @@ int main(int argc, char *argv[])
|
|
{"interactive", 0, 0, 'i'},
|
|
{"dump-hw-params", 0, 0, OPT_DUMP_HWPARAMS},
|
|
{"fatal-errors", 0, 0, OPT_FATAL_ERRORS},
|
|
+#ifdef CONFIG_SUPPORT_CHMAP
|
|
+ {"chmap", 1, 0, 'm'},
|
|
+#endif
|
|
{0, 0, 0, 0}
|
|
};
|
|
char *pcm_name = "default";
|
|
@@ -676,6 +693,15 @@ int main(int argc, char *argv[])
|
|
case OPT_FATAL_ERRORS:
|
|
fatal_errors = 1;
|
|
break;
|
|
+#ifdef CONFIG_SUPPORT_CHMAP
|
|
+ case 'm':
|
|
+ channel_map = snd_pcm_chmap_parse_string(optarg);
|
|
+ if (!channel_map) {
|
|
+ fprintf(stderr, _("Unable to parse channel map string: %s\n"), optarg);
|
|
+ return 1;
|
|
+ }
|
|
+ break;
|
|
+#endif
|
|
default:
|
|
fprintf(stderr, _("Try `%s --help' for more information.\n"), command);
|
|
return 1;
|
|
@@ -1206,6 +1232,16 @@ static void set_params(void)
|
|
prg_exit(EXIT_FAILURE);
|
|
}
|
|
|
|
+#ifdef CONFIG_SUPPORT_CHMAP
|
|
+ if (channel_map) {
|
|
+ err = snd_pcm_set_chmap(handle, channel_map);
|
|
+ if (err < 0) {
|
|
+ error(_("Unable to set channel map"));
|
|
+ prg_exit(EXIT_FAILURE);
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
if (verbose)
|
|
snd_pcm_dump(handle, log);
|
|
|