Accepting request 774842 from multimedia:libs

OBS-URL: https://build.opensuse.org/request/show/774842
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/alsa-utils?expand=0&rev=120
This commit is contained in:
Dominique Leuenberger 2020-02-21 15:40:20 +00:00 committed by Git OBS Bridge
commit 4cd9e6478b
11 changed files with 1196 additions and 0 deletions

View File

@ -0,0 +1,452 @@
From cbabe7a3f0cc84ecd352d4cbf85148946fa6c0d5 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 19 Dec 2019 15:36:05 +0100
Subject: [PATCH 27/35] alsatplg: rewrite to use the new libatopology functions
Add '-u,--dump' operation.
Add '-g,--group' and '-x,--nocheck' modifiers.
Add '-z,--dapm-nosort' modifier.
Allow to operate with stdin/stdout for the file input/output.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
topology/alsatplg.rst | 17 ++-
topology/topology.c | 304 ++++++++++++++++++++++++++++++--------------------
2 files changed, 199 insertions(+), 122 deletions(-)
diff --git a/topology/alsatplg.rst b/topology/alsatplg.rst
index 855edff67ecf..e09c865cc9b2 100644
--- a/topology/alsatplg.rst
+++ b/topology/alsatplg.rst
@@ -50,12 +50,27 @@ Available options:
**-c**, **--compile** `FILE`
source configuration file for the compilation
+ **-n**, **--normalize** `FILE`
+ parse and save the configuration file in the normalized format
+
+ **-u**, **--dump** `FILE`
+ parse and save the configuration file in the specified format
+
**-o**, **--output** `FILE`
- output binary file
+ output file
**-v**, **--verbose** `LEVEL`
set verbose level
+ **-s**, **--sort**
+ sort the configuration identifiers (set for normalization)
+
+ **-x**, **--nocheck**
+ save the configuration without additional integrity check
+
+ **-z**, **--dapm-nosort**
+ do not sort DAPM graph items (like in version 1.2.1-)
+
FILES
=====
diff --git a/topology/topology.c b/topology/topology.c
index bc5797c5f14f..a94941ae762e 100644
--- a/topology/topology.c
+++ b/topology/topology.c
@@ -1,4 +1,5 @@
/*
+ Copyright(c) 2019 Red Hat Inc.
Copyright(c) 2014-2015 Intel Corporation
Copyright(c) 2010-2011 Texas Instruments Incorporated,
All rights reserved.
@@ -44,165 +45,205 @@ _("Usage: %s [OPTIONS]...\n"
"-h, --help help\n"
"-c, --compile=FILE compile file\n"
"-n, --normalize=FILE normalize file\n"
+"-u, --dump=FILE dump (reparse) file\n"
"-v, --verbose=LEVEL set verbosity level (0...1)\n"
"-o, --output=FILE set output file\n"
"-s, --sort sort the identifiers in the normalized output\n"
+"-g, --group save configuration by group indexes\n"
+"-x, --nocheck save configuration without additional integrity checks\n"
), name);
}
-static int _compar(const void *a, const void *b)
+static int load(snd_tplg_t **tplg, const char *source_file, int cflags)
{
- const snd_config_t *c1 = *(snd_config_t **)a;
- const snd_config_t *c2 = *(snd_config_t **)b;
- const char *id1, *id2;
- if (snd_config_get_id(c1, &id1)) return 0;
- if (snd_config_get_id(c2, &id2)) return 0;
- return strcmp(id1, id2);
-}
+ int fd, err;
+ char *buf, *buf2;
+ size_t size, pos;
+ ssize_t r;
-static snd_config_t *normalize_config(const char *id, snd_config_t *src, int sort)
-{
- snd_config_t *dst, **a;
- snd_config_iterator_t i, next;
- int index, count;
-
- if (snd_config_get_type(src) != SND_CONFIG_TYPE_COMPOUND) {
- if (snd_config_copy(&dst, src) >= 0)
- return dst;
- return NULL;
- }
- count = 0;
- snd_config_for_each(i, next, src)
- count++;
- a = malloc(sizeof(dst) * count);
- if (a == NULL)
- return NULL;
- index = 0;
- snd_config_for_each(i, next, src) {
- snd_config_t *s = snd_config_iterator_entry(i);
- a[index++] = s;
- }
- if (sort)
- qsort(a, count, sizeof(a[0]), _compar);
- if (snd_config_make_compound(&dst, id, count == 1)) {
- free(a);
- return NULL;
- }
- for (index = 0; index < count; index++) {
- snd_config_t *s = a[index];
- const char *id2;
- if (snd_config_get_id(s, &id2)) {
- snd_config_delete(dst);
- free(a);
- return NULL;
- }
- s = normalize_config(id2, s, sort);
- if (s == NULL || snd_config_add(dst, s)) {
- if (s)
- snd_config_delete(s);
- snd_config_delete(dst);
- free(a);
- return NULL;
+ if (strcmp(source_file, "-") == 0) {
+ fd = fileno(stdin);
+ } else {
+ fd = open(source_file, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, _("Unable to open input file '%s': %s\n"),
+ source_file, strerror(-errno));
+ return 1;
}
}
- free(a);
- return dst;
-}
-static int compile(const char *source_file, const char *output_file, int verbose)
-{
- snd_tplg_t *snd_tplg;
- int err;
+ size = 16*1024;
+ pos = 0;
+ buf = malloc(size);
+ if (buf == NULL)
+ goto _nomem;
+ while (1) {
+ r = read(fd, buf + pos, size - pos);
+ if (r < 0 && (errno == EAGAIN || errno == EINTR))
+ continue;
+ if (r <= 0)
+ break;
+ pos += r;
+ size += 8*1024;
+ buf2 = realloc(buf, size);
+ if (buf2 == NULL) {
+ free(buf);
+ goto _nomem;
+ }
+ buf = buf2;
+ }
+ if (fd != fileno(stdin))
+ close(fd);
+ if (r < 0) {
+ fprintf(stderr, _("Read error: %s\n"), strerror(-errno));
+ free(buf);
+ goto _err;
+ }
- snd_tplg = snd_tplg_new();
- if (snd_tplg == NULL) {
+ *tplg = snd_tplg_create(cflags);
+ if (*tplg == NULL) {
fprintf(stderr, _("failed to create new topology context\n"));
+ free(buf);
return 1;
}
- snd_tplg_verbose(snd_tplg, verbose);
-
- err = snd_tplg_build_file(snd_tplg, source_file, output_file);
+ err = snd_tplg_load(*tplg, buf, pos);
+ free(buf);
if (err < 0) {
- fprintf(stderr, _("failed to compile context %s\n"), source_file);
- snd_tplg_free(snd_tplg);
- unlink(output_file);
+ fprintf(stderr, _("Unable to load configuration: %s\n"),
+ snd_strerror(-err));
+ snd_tplg_free(*tplg);
return 1;
}
- snd_tplg_free(snd_tplg);
+ return 0;
+
+_nomem:
+ fprintf(stderr, _("No enough memory\n"));
+_err:
+ if (fd != fileno(stdin))
+ close(fd);
+ free(buf);
return 1;
}
-static int normalize(const char *source_file, const char *output_file, int sort)
+static int save(const char *output_file, void *buf, size_t size)
{
- snd_input_t *input;
- snd_output_t *output;
- snd_config_t *top, *norm;
- int err;
+ char *fname = NULL;
+ int fd;
+ ssize_t r;
- err = snd_input_stdio_open(&input, source_file, "r");
- if (err < 0) {
- fprintf(stderr, "Unable to open source file '%s': %s\n", source_file, snd_strerror(-err));
- return 0;
+ if (strcmp(output_file, "-") == 0) {
+ fd = fileno(stdout);
+ } else {
+ fname = alloca(strlen(output_file) + 5);
+ strcpy(fname, output_file);
+ strcat(fname, ".new");
+ fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ fprintf(stderr, _("Unable to open output file '%s': %s\n"),
+ fname, strerror(-errno));
+ return 1;
+ }
}
- err = snd_config_top(&top);
- if (err < 0) {
- snd_input_close(input);
- return 1;
+ r = 0;
+ while (size > 0) {
+ r = write(fd, buf, size);
+ if (r < 0 && (errno == EAGAIN || errno == EINTR))
+ continue;
+ if (r < 0)
+ break;
+ size -= r;
+ buf += r;
}
- err = snd_config_load(top, input);
- snd_input_close(input);
- if (err < 0) {
- snd_config_delete(top);
- fprintf(stderr, "Unable to parse source file '%s': %s\n", source_file, snd_strerror(-err));
- snd_config_delete(top);
+ if (r < 0) {
+ fprintf(stderr, _("Write error: %s\n"), strerror(-errno));
+ if (fd != fileno(stdout)) {
+ remove(fname);
+ close(fd);
+ }
return 1;
}
- err = snd_output_stdio_open(&output, output_file, "w+");
- if (err < 0) {
- fprintf(stderr, "Unable to open output file '%s': %s\n", output_file, snd_strerror(-err));
- snd_config_delete(top);
- return 1;
- }
+ if (fd != fileno(stdout))
+ close(fd);
- norm = normalize_config(NULL, top, sort);
- if (norm == NULL) {
- fprintf(stderr, "Unable to normalize configuration (out of memory?)\n");
- snd_output_close(output);
- snd_config_delete(top);
+ if (fname && rename(fname, output_file)) {
+ fprintf(stderr, _("Unable to rename file '%s' to '%s': %s\n"),
+ fname, output_file, strerror(-errno));
return 1;
}
- err = snd_config_save(norm, output);
- snd_output_close(output);
- snd_config_delete(norm);
- snd_config_delete(top);
+ return 0;
+}
+
+static int dump(const char *source_file, const char *output_file, int cflags, int sflags)
+{
+ snd_tplg_t *tplg;
+ char *text;
+ int err;
+
+ err = load(&tplg, source_file, cflags);
+ if (err)
+ return err;
+ err = snd_tplg_save(tplg, &text, sflags);
+ snd_tplg_free(tplg);
if (err < 0) {
- fprintf(stderr, "Unable to save normalized contents: %s\n", snd_strerror(-err));
+ fprintf(stderr, _("Unable to save parsed configuration: %s\n"),
+ snd_strerror(-err));
return 1;
}
+ err = save(output_file, text, strlen(text));
+ free(text);
+ return err;
+}
- return 0;
+static int compile(const char *source_file, const char *output_file, int cflags)
+{
+ snd_tplg_t *tplg;
+ void *bin;
+ size_t size;
+ int err;
+
+ err = load(&tplg, source_file, cflags);
+ if (err)
+ return err;
+ err = snd_tplg_build_bin(tplg, &bin, &size);
+ snd_tplg_free(tplg);
+ if (err < 0 || size == 0) {
+ fprintf(stderr, _("failed to compile context %s\n"), source_file);
+ return 1;
+ }
+ err = save(output_file, bin, size);
+ free(bin);
+ return err;
}
+#define OP_COMPILE 1
+#define OP_NORMALIZE 2
+#define OP_DUMP 3
+
int main(int argc, char *argv[])
{
- static const char short_options[] = "hc:n:v:o:s";
+ static const char short_options[] = "hc:n:u:v:o:sgxz";
static const struct option long_options[] = {
{"help", 0, NULL, 'h'},
{"verbose", 1, NULL, 'v'},
{"compile", 1, NULL, 'c'},
{"normalize", 1, NULL, 'n'},
+ {"dump", 1, NULL, 'u'},
{"output", 1, NULL, 'o'},
{"sort", 0, NULL, 's'},
+ {"group", 0, NULL, 'g'},
+ {"nocheck", 0, NULL, 'x'},
+ {"dapm-nosort", 0, NULL, 'z'},
{0, 0, 0, 0},
};
- char *source_file = NULL, *normalize_file = NULL, *output_file = NULL;
- int c, err, verbose = 0, sort = 0, option_index;
+ char *source_file = NULL;
+ char *output_file = NULL;
+ int c, err, op = 'c', cflags = 0, sflags = 0, option_index;
#ifdef ENABLE_NLS
setlocale(LC_ALL, "");
@@ -218,19 +259,32 @@ int main(int argc, char *argv[])
usage(argv[0]);
return 0;
case 'v':
- verbose = atoi(optarg);
+ cflags |= SND_TPLG_CREATE_VERBOSE;
break;
- case 'c':
- source_file = optarg;
+ case 'z':
+ cflags |= SND_TPLG_CREATE_DAPM_NOSORT;
break;
+ case 'c':
case 'n':
- normalize_file = optarg;
+ case 'u':
+ if (source_file) {
+ fprintf(stderr, _("Cannot combine operations (compile, normalize, dump)\n"));
+ return 1;
+ }
+ source_file = optarg;
+ op = c;
break;
case 'o':
output_file = optarg;
break;
case 's':
- sort = 1;
+ sflags |= SND_TPLG_SAVE_SORT;
+ break;
+ case 'g':
+ sflags |= SND_TPLG_SAVE_GROUPS;
+ break;
+ case 'x':
+ sflags |= SND_TPLG_SAVE_NOCHECK;
break;
default:
fprintf(stderr, _("Try `%s --help' for more information.\n"), argv[0]);
@@ -238,21 +292,29 @@ int main(int argc, char *argv[])
}
}
- if (source_file && normalize_file) {
- fprintf(stderr, "Cannot normalize and compile at a time!\n");
+ if (source_file == NULL || output_file == NULL) {
+ usage(argv[0]);
return 1;
}
- if ((source_file == NULL && normalize_file == NULL) || output_file == NULL) {
- usage(argv[0]);
- return 1;
+ if (op == 'n') {
+ if (sflags != 0 && sflags != SND_TPLG_SAVE_SORT) {
+ fprintf(stderr, _("Wrong parameters for the normalize operation!\n"));
+ return 1;
+ }
+ /* normalize has predefined output */
+ sflags = SND_TPLG_SAVE_SORT;
}
- if (source_file)
- err = compile(source_file, output_file, verbose);
- else
- err = normalize(normalize_file, output_file, sort);
+ switch (op) {
+ case 'c':
+ err = compile(source_file, output_file, cflags);
+ break;
+ default:
+ err = dump(source_file, output_file, cflags, sflags);
+ break;
+ }
snd_output_close(log);
- return 0;
+ return err ? 1 : 0;
}
--
2.16.4

View File

@ -0,0 +1,93 @@
From 32e7016fd710f6ed9d514100c7c05453974036d0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 20 Dec 2019 15:23:27 +0100
Subject: [PATCH 28/35] alsatplg: add -V,--version option
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
topology/alsatplg.rst | 3 +++
topology/topology.c | 20 ++++++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/topology/alsatplg.rst b/topology/alsatplg.rst
index e09c865cc9b2..260454bfc526 100644
--- a/topology/alsatplg.rst
+++ b/topology/alsatplg.rst
@@ -47,6 +47,9 @@ Available options:
**-h**, **--help**
this help
+ **-V**, **--version**
+ show the utility version and versions of used libraries
+
**-c**, **--compile** `FILE`
source configuration file for the compilation
diff --git a/topology/topology.c b/topology/topology.c
index a94941ae762e..101f8ccf16ea 100644
--- a/topology/topology.c
+++ b/topology/topology.c
@@ -34,10 +34,11 @@
#include <alsa/asoundlib.h>
#include <alsa/topology.h>
#include "gettext.h"
+#include "version.h"
static snd_output_t *log;
-static void usage(char *name)
+static void usage(const char *name)
{
printf(
_("Usage: %s [OPTIONS]...\n"
@@ -51,9 +52,20 @@ _("Usage: %s [OPTIONS]...\n"
"-s, --sort sort the identifiers in the normalized output\n"
"-g, --group save configuration by group indexes\n"
"-x, --nocheck save configuration without additional integrity checks\n"
+"-V, --version print version\n"
), name);
}
+static void version(const char *name)
+{
+ printf(
+_("%s version %s\n"
+"libasound version %s\n"
+"libatopology version %s\n"
+), name, SND_UTIL_VERSION_STR,
+ snd_asoundlib_version(), snd_tplg_version());
+}
+
static int load(snd_tplg_t **tplg, const char *source_file, int cflags)
{
int fd, err;
@@ -227,7 +239,7 @@ static int compile(const char *source_file, const char *output_file, int cflags)
int main(int argc, char *argv[])
{
- static const char short_options[] = "hc:n:u:v:o:sgxz";
+ static const char short_options[] = "hc:n:u:v:o:sgxzV";
static const struct option long_options[] = {
{"help", 0, NULL, 'h'},
{"verbose", 1, NULL, 'v'},
@@ -239,6 +251,7 @@ int main(int argc, char *argv[])
{"group", 0, NULL, 'g'},
{"nocheck", 0, NULL, 'x'},
{"dapm-nosort", 0, NULL, 'z'},
+ {"version", 0, NULL, 'V'},
{0, 0, 0, 0},
};
char *source_file = NULL;
@@ -286,6 +299,9 @@ int main(int argc, char *argv[])
case 'x':
sflags |= SND_TPLG_SAVE_NOCHECK;
break;
+ case 'V':
+ version(argv[0]);
+ return 0;
default:
fprintf(stderr, _("Try `%s --help' for more information.\n"), argv[0]);
return 1;
--
2.16.4

View File

@ -0,0 +1,237 @@
From 786c3ee8144893dfb56b35c46542d3ded78d746c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 22 Dec 2019 15:44:56 +0100
Subject: [PATCH 29/35] alsatplg: add decode command
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
topology/alsatplg.rst | 3 ++
topology/topology.c | 111 ++++++++++++++++++++++++++++++++++++++------------
2 files changed, 87 insertions(+), 27 deletions(-)
diff --git a/topology/alsatplg.rst b/topology/alsatplg.rst
index 260454bfc526..56324d52f883 100644
--- a/topology/alsatplg.rst
+++ b/topology/alsatplg.rst
@@ -53,6 +53,9 @@ Available options:
**-c**, **--compile** `FILE`
source configuration file for the compilation
+ **-d**, **--decode** `FILE`
+ source binary topology file for the decode
+
**-n**, **--normalize** `FILE`
parse and save the configuration file in the normalized format
diff --git a/topology/topology.c b/topology/topology.c
index 101f8ccf16ea..91d2fce655fe 100644
--- a/topology/topology.c
+++ b/topology/topology.c
@@ -44,9 +44,10 @@ static void usage(const char *name)
_("Usage: %s [OPTIONS]...\n"
"\n"
"-h, --help help\n"
-"-c, --compile=FILE compile file\n"
-"-n, --normalize=FILE normalize file\n"
-"-u, --dump=FILE dump (reparse) file\n"
+"-c, --compile=FILE compile configuration file\n"
+"-d, --decode=FILE decode binary topology file\n"
+"-n, --normalize=FILE normalize configuration file\n"
+"-u, --dump=FILE dump (reparse) configuration file\n"
"-v, --verbose=LEVEL set verbosity level (0...1)\n"
"-o, --output=FILE set output file\n"
"-s, --sort sort the identifiers in the normalized output\n"
@@ -66,10 +67,10 @@ _("%s version %s\n"
snd_asoundlib_version(), snd_tplg_version());
}
-static int load(snd_tplg_t **tplg, const char *source_file, int cflags)
+static int load(const char *source_file, void **dst, size_t *dst_size)
{
- int fd, err;
- char *buf, *buf2;
+ int fd;
+ void *buf, *buf2;
size_t size, pos;
ssize_t r;
@@ -112,15 +113,31 @@ static int load(snd_tplg_t **tplg, const char *source_file, int cflags)
goto _err;
}
+ *dst = buf;
+ *dst_size = pos;
+ return 0;
+
+_nomem:
+ fprintf(stderr, _("No enough memory\n"));
+_err:
+ if (fd != fileno(stdin))
+ close(fd);
+ free(buf);
+ return 1;
+}
+
+static int load_topology(snd_tplg_t **tplg, char *config,
+ size_t config_size, int cflags)
+{
+ int err;
+
*tplg = snd_tplg_create(cflags);
if (*tplg == NULL) {
fprintf(stderr, _("failed to create new topology context\n"));
- free(buf);
return 1;
}
- err = snd_tplg_load(*tplg, buf, pos);
- free(buf);
+ err = snd_tplg_load(*tplg, config, config_size);
if (err < 0) {
fprintf(stderr, _("Unable to load configuration: %s\n"),
snd_strerror(-err));
@@ -129,14 +146,6 @@ static int load(snd_tplg_t **tplg, const char *source_file, int cflags)
}
return 0;
-
-_nomem:
- fprintf(stderr, _("No enough memory\n"));
-_err:
- if (fd != fileno(stdin))
- close(fd);
- free(buf);
- return 1;
}
static int save(const char *output_file, void *buf, size_t size)
@@ -194,10 +203,15 @@ static int save(const char *output_file, void *buf, size_t size)
static int dump(const char *source_file, const char *output_file, int cflags, int sflags)
{
snd_tplg_t *tplg;
- char *text;
+ char *config, *text;
+ size_t size;
int err;
- err = load(&tplg, source_file, cflags);
+ err = load(source_file, (void **)&config, &size);
+ if (err)
+ return err;
+ err = load_topology(&tplg, config, size, cflags);
+ free(config);
if (err)
return err;
err = snd_tplg_save(tplg, &text, sflags);
@@ -215,17 +229,23 @@ static int dump(const char *source_file, const char *output_file, int cflags, in
static int compile(const char *source_file, const char *output_file, int cflags)
{
snd_tplg_t *tplg;
+ char *config;
void *bin;
- size_t size;
+ size_t config_size, size;
int err;
- err = load(&tplg, source_file, cflags);
+ err = load(source_file, (void **)&config, &config_size);
+ if (err)
+ return err;
+ err = load_topology(&tplg, config, config_size, cflags);
+ free(config);
if (err)
return err;
err = snd_tplg_build_bin(tplg, &bin, &size);
snd_tplg_free(tplg);
if (err < 0 || size == 0) {
- fprintf(stderr, _("failed to compile context %s\n"), source_file);
+ fprintf(stderr, _("failed to compile context %s: %s\n"),
+ source_file, snd_strerror(-err));
return 1;
}
err = save(output_file, bin, size);
@@ -233,17 +253,50 @@ static int compile(const char *source_file, const char *output_file, int cflags)
return err;
}
-#define OP_COMPILE 1
-#define OP_NORMALIZE 2
-#define OP_DUMP 3
+static int decode(const char *source_file, const char *output_file,
+ int cflags, int dflags, int sflags)
+{
+ snd_tplg_t *tplg;
+ void *bin;
+ char *text;
+ size_t size;
+ int err;
+
+ if (load(source_file, &bin, &size))
+ return 1;
+ tplg = snd_tplg_create(cflags);
+ if (tplg == NULL) {
+ fprintf(stderr, _("failed to create new topology context\n"));
+ return 1;
+ }
+ err = snd_tplg_decode(tplg, bin, size, dflags);
+ free(bin);
+ if (err < 0) {
+ snd_tplg_free(tplg);
+ fprintf(stderr, _("failed to decode context %s: %s\n"),
+ source_file, snd_strerror(-err));
+ return 1;
+ }
+ err = snd_tplg_save(tplg, &text, sflags);
+ snd_tplg_free(tplg);
+ if (err < 0) {
+ fprintf(stderr, _("Unable to save parsed configuration: %s\n"),
+ snd_strerror(-err));
+ return 1;
+ }
+ err = save(output_file, text, strlen(text));
+ free(text);
+ return err;
+}
int main(int argc, char *argv[])
{
- static const char short_options[] = "hc:n:u:v:o:sgxzV";
+ static const char short_options[] = "hc:d:n:u:v:o:sgxzV";
static const struct option long_options[] = {
{"help", 0, NULL, 'h'},
{"verbose", 1, NULL, 'v'},
{"compile", 1, NULL, 'c'},
+ {"decode", 1, NULL, 'd'},
{"normalize", 1, NULL, 'n'},
{"dump", 1, NULL, 'u'},
{"output", 1, NULL, 'o'},
@@ -256,7 +309,7 @@ int main(int argc, char *argv[])
};
char *source_file = NULL;
char *output_file = NULL;
- int c, err, op = 'c', cflags = 0, sflags = 0, option_index;
+ int c, err, op = 'c', cflags = 0, dflags = 0, sflags = 0, option_index;
#ifdef ENABLE_NLS
setlocale(LC_ALL, "");
@@ -278,6 +331,7 @@ int main(int argc, char *argv[])
cflags |= SND_TPLG_CREATE_DAPM_NOSORT;
break;
case 'c':
+ case 'd':
case 'n':
case 'u':
if (source_file) {
@@ -326,6 +380,9 @@ int main(int argc, char *argv[])
case 'c':
err = compile(source_file, output_file, cflags);
break;
+ case 'd':
+ err = decode(source_file, output_file, cflags, dflags, sflags);
+ break;
default:
err = dump(source_file, output_file, cflags, sflags);
break;
--
2.16.4

View File

@ -0,0 +1,25 @@
From 56e1b879d4bccda62e7c0177b0a395d57a37931c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 1 Jan 2020 17:45:06 +0100
Subject: [PATCH 30/35] alsatplg: add documentation for -z,--dapm-nosort (-h)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
topology/topology.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/topology/topology.c b/topology/topology.c
index 91d2fce655fe..ad0d108562df 100644
--- a/topology/topology.c
+++ b/topology/topology.c
@@ -53,6 +53,7 @@ _("Usage: %s [OPTIONS]...\n"
"-s, --sort sort the identifiers in the normalized output\n"
"-g, --group save configuration by group indexes\n"
"-x, --nocheck save configuration without additional integrity checks\n"
+"-z, --dapm-nosort do not sort the DAPM widgets\n"
"-V, --version print version\n"
), name);
}
--
2.16.4

View File

@ -0,0 +1,36 @@
From 996a638e04766df43cb8026673f93927b1047639 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Jan 2020 23:46:51 +0100
Subject: [PATCH 31/35] configure: fix new libatopology check
---
configure.ac | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac
index 4bee49be81ba..b7ed81a0d32c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -49,6 +49,7 @@ AC_CHECK_LIB([asound], [snd_seq_client_info_get_pid], [HAVE_SEQ_CLIENT_INFO_GET_
if test "$HAVE_SEQ_CLIENT_INFO_GET_PID" = "yes" ; then
AC_DEFINE([HAVE_SEQ_CLIENT_INFO_GET_PID], 1, [alsa-lib supports snd_seq_client_info_get_pid])
fi
+AC_CHECK_LIB([atopology], [snd_tplg_save], [have_topology="no"])
#
# NOTE: The library 'libffado' (at least v2.4.1) executes ctor/dtor of instances
@@ -70,11 +71,6 @@ AM_CONDITIONAL(HAVE_TOPOLOGY, test "$have_topology" = "yes")
AM_CONDITIONAL(HAVE_SAMPLERATE, test "$have_samplerate" = "yes")
AM_CONDITIONAL(HAVE_FFADO, test "$have_ffado" = "yes")
-# old libasound with the topology routines in the main library
-if test "x$have_topology" = "xyes" -a "x$ALSA_TOPOLOGY_LIBS" = "x"; then
- ALSA_TOPOLOGY_LIBS="$ALSA_LIBS"
-fi
-
dnl Use tinyalsa
alsabat_backend_tiny=
AC_ARG_ENABLE(alsabat_backend_tiny,
--
2.16.4

View File

@ -0,0 +1,67 @@
From f80a290153f210bb80165ac8dc6b1dccaa24781d Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Wed, 5 Feb 2020 00:12:18 -0800
Subject: [PATCH 32/35] Use __func__ instead of __FUNCTION__
They are equivalent, but __func__ is in C99. __FUNCTION__ exists only
for backwards compatibility with old gcc versions.
Signed-off-by: Michael Forney <mforney@mforney.org>
Reviewd-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
alsactl/alsactl.h | 16 ++++++++--------
aplay/aplay.c | 4 ++--
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
index 4f969ec2a4bc..69b539ca6be0 100644
--- a/alsactl/alsactl.h
+++ b/alsactl/alsactl.h
@@ -13,15 +13,15 @@ void cerror_(const char *fcn, long line, int cond, const char *fmt, ...);
void dbg_(const char *fcn, long line, const char *fmt, ...);
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-#define info(...) do { info_(__FUNCTION__, __LINE__, __VA_ARGS__); } while (0)
-#define error(...) do { error_(__FUNCTION__, __LINE__, __VA_ARGS__); } while (0)
-#define cerror(cond, ...) do { cerror_(__FUNCTION__, __LINE__, (cond) != 0, __VA_ARGS__); } while (0)
-#define dbg(...) do { dbg_(__FUNCTION__, __LINE__, __VA_ARGS__); } while (0)
+#define info(...) do { info_(__func__, __LINE__, __VA_ARGS__); } while (0)
+#define error(...) do { error_(__func__, __LINE__, __VA_ARGS__); } while (0)
+#define cerror(cond, ...) do { cerror_(__func__, __LINE__, (cond) != 0, __VA_ARGS__); } while (0)
+#define dbg(...) do { dbg_(__func__, __LINE__, __VA_ARGS__); } while (0)
#else
-#define info(args...) do { info_(__FUNCTION__, __LINE__, ##args); } while (0)
-#define error(args...) do { error_(__FUNCTION__, __LINE__, ##args); } while (0)
-#define cerror(cond, ...) do { error_(__FUNCTION__, __LINE__, (cond) != 0, ##args); } while (0)
-#define dbg(args...) do { dbg_(__FUNCTION__, __LINE__, ##args); } while (0)
+#define info(args...) do { info_(__func__, __LINE__, ##args); } while (0)
+#define error(args...) do { error_(__func__, __LINE__, ##args); } while (0)
+#define cerror(cond, ...) do { error_(__func__, __LINE__, (cond) != 0, ##args); } while (0)
+#define dbg(args...) do { dbg_(__func__, __LINE__, ##args); } while (0)
#endif
int init(const char *file, const char *cardname);
diff --git a/aplay/aplay.c b/aplay/aplay.c
index 1a887e412aae..908093c45c90 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -186,13 +186,13 @@ static const struct fmt_capture {
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
#define error(...) do {\
- fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \
+ fprintf(stderr, "%s: %s:%d: ", command, __func__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \
putc('\n', stderr); \
} while (0)
#else
#define error(args...) do {\
- fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \
+ fprintf(stderr, "%s: %s:%d: ", command, __func__, __LINE__); \
fprintf(stderr, ##args); \
putc('\n', stderr); \
} while (0)
--
2.16.4

View File

@ -0,0 +1,103 @@
From 62a765087e3885a463dbf0d888c5d666da9ee7b3 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Wed, 5 Feb 2020 00:12:19 -0800
Subject: [PATCH 33/35] Avoid pointer arithmetic on `void *`
The pointer operand to the binary `+` operator must be to a complete
object type.
Signed-off-by: Michael Forney <mforney@mforney.org>
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 4 ++--
axfer/xfer-libasound-irq-mmap.c | 7 ++++---
axfer/xfer-libasound-timer-mmap.c | 4 ++--
bat/common.c | 2 +-
seq/aplaymidi/aplaymidi.c | 2 +-
5 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index 908093c45c90..08395f695287 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -442,7 +442,7 @@ static ssize_t xwrite(int fd, const void *buf, size_t count)
size_t offset = 0;
while (offset < count) {
- written = write(fd, buf + offset, count - offset);
+ written = write(fd, (char *)buf + offset, count - offset);
if (written <= 0)
return written;
@@ -1210,7 +1210,7 @@ static int test_au(int fd, void *buffer)
hwparams.channels = BE_INT(ap->channels);
if (hwparams.channels < 1 || hwparams.channels > 256)
return -1;
- if ((size_t)safe_read(fd, buffer + sizeof(AuHeader), BE_INT(ap->hdr_size) - sizeof(AuHeader)) != BE_INT(ap->hdr_size) - sizeof(AuHeader)) {
+ if ((size_t)safe_read(fd, (char *)buffer + sizeof(AuHeader), BE_INT(ap->hdr_size) - sizeof(AuHeader)) != BE_INT(ap->hdr_size) - sizeof(AuHeader)) {
error(_("read error"));
prg_exit(EXIT_FAILURE);
}
diff --git a/axfer/xfer-libasound-irq-mmap.c b/axfer/xfer-libasound-irq-mmap.c
index a13b3c300354..386e741de733 100644
--- a/axfer/xfer-libasound-irq-mmap.c
+++ b/axfer/xfer-libasound-irq-mmap.c
@@ -146,9 +146,10 @@ static int irq_mmap_process_frames(struct libasound_state *state,
// TODO: Perhaps, the complex layout can be supported as a variation of
// vector type. However, there's no driver with this layout.
if (layout->vector == NULL) {
- frame_buf = areas[0].addr;
- frame_buf += snd_pcm_frames_to_bytes(state->handle,
- frame_offset);
+ char *buf;
+ buf = areas[0].addr;
+ buf += snd_pcm_frames_to_bytes(state->handle, frame_offset);
+ frame_buf = buf;
} else {
int i;
for (i = 0; i < layout->samples_per_frame; ++i) {
diff --git a/axfer/xfer-libasound-timer-mmap.c b/axfer/xfer-libasound-timer-mmap.c
index 1c642fe58b28..ba26e2995f5f 100644
--- a/axfer/xfer-libasound-timer-mmap.c
+++ b/axfer/xfer-libasound-timer-mmap.c
@@ -100,8 +100,8 @@ static void *get_buffer(struct libasound_state *state,
if (layout->vector == NULL) {
char *buf;
- buf = areas[0].addr + snd_pcm_frames_to_bytes(state->handle,
- frame_offset);
+ buf = areas[0].addr;
+ buf += snd_pcm_frames_to_bytes(state->handle, frame_offset);
frame_buf = buf;
} else {
int i;
diff --git a/bat/common.c b/bat/common.c
index d3d1f285449c..339e749fd74a 100644
--- a/bat/common.c
+++ b/bat/common.c
@@ -231,7 +231,7 @@ int generate_input_data(struct bat *bat, void *buffer, int bytes, int frames)
load = 0;
while (1) {
- err = fread(buffer + load, 1, bytes - load, bat->fp);
+ err = fread((char *)buffer + load, 1, bytes - load, bat->fp);
if (0 == err) {
if (feof(bat->fp)) {
fprintf(bat->log,
diff --git a/seq/aplaymidi/aplaymidi.c b/seq/aplaymidi/aplaymidi.c
index 12d6fac3b0dc..b086e7015aa2 100644
--- a/seq/aplaymidi/aplaymidi.c
+++ b/seq/aplaymidi/aplaymidi.c
@@ -633,7 +633,7 @@ static void handle_big_sysex(snd_seq_event_t *ev)
check_snd("sync output", err);
if (sleep(1))
fatal("aborted");
- ev->data.ext.ptr += MIDI_BYTES_PER_SEC;
+ ev->data.ext.ptr = (char *)ev->data.ext.ptr + MIDI_BYTES_PER_SEC;
length -= MIDI_BYTES_PER_SEC;
}
ev->data.ext.len = length;
--
2.16.4

View File

@ -0,0 +1,59 @@
From 646b3b1c0badbfd1b2ea7b82eb59d43a460c531c Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Wed, 5 Feb 2020 00:12:20 -0800
Subject: [PATCH 34/35] Use %lli for long long in printf
The `L` length modifier only applies to floating-point conversion
specifiers, and `ll` is used for `long long` integers.
Although glibc accepts %Li, musl does not and returns EINVAL.
Signed-off-by: Michael Forney <mforney@mforney.org>
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
alsactl/state.c | 4 ++--
amixer/amixer.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/alsactl/state.c b/alsactl/state.c
index 38e85c06c0b0..22e0269fd30a 100644
--- a/alsactl/state.c
+++ b/alsactl/state.c
@@ -336,9 +336,9 @@ static int get_control(snd_ctl_t *handle, snd_ctl_elem_id_t *id, snd_config_t *t
long long max = snd_ctl_elem_info_get_max64(info);
long long step = snd_ctl_elem_info_get_step64(info);
if (step)
- sprintf(buf, "%Li - %Li (step %Li)", min, max, step);
+ sprintf(buf, "%lli - %lli (step %lli)", min, max, step);
else
- sprintf(buf, "%Li - %Li", min, max);
+ sprintf(buf, "%lli - %lli", min, max);
err = snd_config_string_add(comment, "range", buf);
if (err < 0) {
error("snd_config_string_add: %s", snd_strerror(err));
diff --git a/amixer/amixer.c b/amixer/amixer.c
index 928f7c5d6482..4c19a583e5b1 100644
--- a/amixer/amixer.c
+++ b/amixer/amixer.c
@@ -620,7 +620,7 @@ static int show_control(const char *space, snd_hctl_elem_t *elem,
snd_ctl_elem_info_get_step(info));
break;
case SND_CTL_ELEM_TYPE_INTEGER64:
- printf(",min=%Li,max=%Li,step=%Li\n",
+ printf(",min=%lli,max=%lli,step=%lli\n",
snd_ctl_elem_info_get_min64(info),
snd_ctl_elem_info_get_max64(info),
snd_ctl_elem_info_get_step64(info));
@@ -662,7 +662,7 @@ static int show_control(const char *space, snd_hctl_elem_t *elem,
printf("%li", snd_ctl_elem_value_get_integer(control, idx));
break;
case SND_CTL_ELEM_TYPE_INTEGER64:
- printf("%Li", snd_ctl_elem_value_get_integer64(control, idx));
+ printf("%lli", snd_ctl_elem_value_get_integer64(control, idx));
break;
case SND_CTL_ELEM_TYPE_ENUMERATED:
printf("%u", snd_ctl_elem_value_get_enumerated(control, idx));
--
2.16.4

View File

@ -0,0 +1,86 @@
From cb47f6dcf4200c64559ed2f008cabf8cc5f9d9a3 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Wed, 5 Feb 2020 00:12:21 -0800
Subject: [PATCH 35/35] Avoid empty initializer list
To zero-initialize an object, use `{0}` instead.
Signed-off-by: Michael Forney <mforney@mforney.org>
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
alsamixer/cli.c | 2 +-
amidi/amidi.c | 2 +-
seq/aplaymidi/aplaymidi.c | 2 +-
seq/aplaymidi/arecordmidi.c | 2 +-
seq/aseqdump/aseqdump.c | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/alsamixer/cli.c b/alsamixer/cli.c
index 3f8f52f03d4d..74683255a30a 100644
--- a/alsamixer/cli.c
+++ b/alsamixer/cli.c
@@ -58,7 +58,7 @@ static void parse_options(int argc, char *argv[])
{ .name = "view", .has_arg = 1, .val = 'V' },
{ .name = "no-color", .val = 'g' },
{ .name = "abstraction", .has_arg = 1, .val = 'a' },
- { }
+ { 0 }
};
int option;
int card_index;
diff --git a/amidi/amidi.c b/amidi/amidi.c
index c6268e4c2ccd..cde4697c7e30 100644
--- a/amidi/amidi.c
+++ b/amidi/amidi.c
@@ -469,7 +469,7 @@ int main(int argc, char *argv[])
{"active-sensing", 0, NULL, 'a'},
{"clock", 0, NULL, 'c'},
{"sysex-interval", 1, NULL, 'i'},
- { }
+ {0}
};
int c, err, ok = 0;
int ignore_active_sensing = 1;
diff --git a/seq/aplaymidi/aplaymidi.c b/seq/aplaymidi/aplaymidi.c
index b086e7015aa2..e8491e13148d 100644
--- a/seq/aplaymidi/aplaymidi.c
+++ b/seq/aplaymidi/aplaymidi.c
@@ -869,7 +869,7 @@ int main(int argc, char *argv[])
{"list", 0, NULL, 'l'},
{"port", 1, NULL, 'p'},
{"delay", 1, NULL, 'd'},
- {}
+ {0}
};
int c;
int do_list = 0;
diff --git a/seq/aplaymidi/arecordmidi.c b/seq/aplaymidi/arecordmidi.c
index 604cd0d29722..2034df76b679 100644
--- a/seq/aplaymidi/arecordmidi.c
+++ b/seq/aplaymidi/arecordmidi.c
@@ -740,7 +740,7 @@ int main(int argc, char *argv[])
{"metronome", 1, NULL, 'm'},
{"timesig", 1, NULL, 'i'},
{"num-events", 1, NULL, 'n'},
- { }
+ {0}
};
char *filename = NULL;
diff --git a/seq/aseqdump/aseqdump.c b/seq/aseqdump/aseqdump.c
index 578e06fbcb22..44ae3bbc5654 100644
--- a/seq/aseqdump/aseqdump.c
+++ b/seq/aseqdump/aseqdump.c
@@ -357,7 +357,7 @@ int main(int argc, char *argv[])
{"version", 0, NULL, 'V'},
{"list", 0, NULL, 'l'},
{"port", 1, NULL, 'p'},
- { }
+ {0}
};
int do_list = 0;
--
2.16.4

View File

@ -1,3 +1,19 @@
-------------------------------------------------------------------
Wed Feb 12 20:57:05 CET 2020 - tiwai@suse.de
- Backport upstream fixes:
alsatplg fixes, misc cleanups:
0027-alsatplg-rewrite-to-use-the-new-libatopology-functio.patch
0028-alsatplg-add-V-version-option.patch
0029-alsatplg-add-decode-command.patch
0030-alsatplg-add-documentation-for-z-dapm-nosort-h.patch
0031-configure-fix-new-libatopology-check.patch
0032-Use-__func__-instead-of-__FUNCTION__.patch
0033-Avoid-pointer-arithmetic-on-void.patch
0034-Use-lli-for-long-long-in-printf.patch
0035-Avoid-empty-initializer-list.patch
- Fix build on SLE12-* target
-------------------------------------------------------------------
Tue Jan 21 15:57:03 CET 2020 - tiwai@suse.de

View File

@ -55,6 +55,15 @@ Patch23: 0023-alsa-info.sh-Condense-nested-commands-for-file-uploa.patch
Patch24: 0024-alsa-info.sh-Condense-nested-commands-for-formatting.patch
Patch25: 0025-alsa-info.sh-Perform-test-for-wget-earlier.patch
Patch26: 0026-alsa-info.sh-Warn-after-actual-upload-failure-do-not.patch
Patch27: 0027-alsatplg-rewrite-to-use-the-new-libatopology-functio.patch
Patch28: 0028-alsatplg-add-V-version-option.patch
Patch29: 0029-alsatplg-add-decode-command.patch
Patch30: 0030-alsatplg-add-documentation-for-z-dapm-nosort-h.patch
Patch31: 0031-configure-fix-new-libatopology-check.patch
Patch32: 0032-Use-__func__-instead-of-__FUNCTION__.patch
Patch33: 0033-Avoid-pointer-arithmetic-on-void.patch
Patch34: 0034-Use-lli-for-long-long-in-printf.patch
Patch35: 0035-Avoid-empty-initializer-list.patch
Patch101: alsa-utils-configure-version-revert.patch
BuildRequires: alsa-devel
BuildRequires: alsa-topology-devel
@ -62,7 +71,11 @@ BuildRequires: fftw3-devel
BuildRequires: libsamplerate-devel
BuildRequires: ncurses-devel
BuildRequires: pkgconfig
%if 0%{?suse_version} < 1500
BuildRequires: python-docutils
%else
BuildRequires: python3-docutils
%endif
BuildRequires: xmlto
BuildRequires: pkgconfig(systemd)
BuildRequires: pkgconfig(udev)
@ -117,6 +130,15 @@ and test audio before and after PM state changes.
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%if 0%{?do_autoreconf}
%patch101 -p1
# fix stupid automake's automatic action