Accepting request 784658 from home:tiwai:branches:multimedia:libs

- Update to alsa-lib 1.2.2:
  including previous fixes
- Backport recent upstream fixes:
  conf updates, PCM ordering fix, configure fix;
  0001-conf-change-the-order-of-PCM-devices-in-alsa.conf.patch
  0002-conf-namehint-add-omit_noargs-to-the-hint-section.patch
  0003-Change-PCM-device-number-of-Asus-Xonar-U5.patch
  0004-configure-add-embed-for-python3-config-python-3.8.patch
  0005-conf-USB-Audio-Add-C-Media-USB-Headphone-Set-to-the-.patch
- Drop obsoleted patches:
  0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
  0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
  0003-ucm-add-_identifiers-list.patch
  0004-namehint-correct-the-args-check.patch
  0005-namehint-improve-the-previous-patch-check-the-return.patch
  0006-ucm-docs-allow-spaces-in-device-names-for-JackHWMute.patch
  0007-use-case-docs-add-PlaybackMixerCopy-and-CaptureMixer.patch
  0008-ucm-docs-add-JackCTL-rearrange-JackControl-and-JackD.patch
  0009-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
  0010-src-ucm-main.c-fix-build-without-mixer.patch
  0011-alsa.m4-another-try-to-fix-the-libatopology-detectio.patch
  0012-ucm-docs-add-Mic-DigitalMic-and-multiple-devices-com.patch
  0013-ucm-docs-remove-DigitalMic-it-does-not-have-sense.patch
  0014-ucm-docs-change-the-Mic-description-to-simple-Microp.patch
  0015-ucm-docs-add-note-about-the-sequences-and-device-spl.patch
  0016-ucm-docs-remove-MixerCopy-values-add-Priority-for-ve.patch
  0017-ucm-setup-conf_format-after-getting-ALSA_CONFIG_UCM_.patch
  0018-alsa-lib-fix-the-array-parser-unique-compound-keys.patch
  0019-topology-remove-vendor_fd-name-from-snd_tplg-structu.patch
  0020-topology-file-position-and-size-cleanups.patch

OBS-URL: https://build.opensuse.org/request/show/784658
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=269
This commit is contained in:
Takashi Iwai 2020-03-13 14:12:44 +00:00 committed by Git OBS Bridge
parent 0fcb2a0c4b
commit f9a48e9cd9
83 changed files with 374 additions and 23616 deletions

View File

@ -0,0 +1,81 @@
From 27c7927842a691ef13724cd16fb26264680c6aa2 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 29 Feb 2020 10:30:37 +0100
Subject: [PATCH 1/5] conf: change the order of PCM devices in alsa.conf
Appearently, some applications use the first device for probe or so.
Fixes: https://github.com/alsa-project/alsa-lib/issues/27
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf/alsa.conf | 46 +++++++++++++++++++++++-----------------------
1 file changed, 23 insertions(+), 23 deletions(-)
diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf
index 099805864788..a091b810f9ed 100644
--- a/src/conf/alsa.conf
+++ b/src/conf/alsa.conf
@@ -119,29 +119,6 @@ defaults.timer.subdevice 0
# PCM interface
#
-# redirect to load-on-demand extended pcm definitions
-pcm.cards cards.pcm
-
-pcm.default cards.pcm.default
-pcm.sysdefault cards.pcm.default
-pcm.front cards.pcm.front
-pcm.rear cards.pcm.rear
-pcm.center_lfe cards.pcm.center_lfe
-pcm.side cards.pcm.side
-pcm.surround21 cards.pcm.surround21
-pcm.surround40 cards.pcm.surround40
-pcm.surround41 cards.pcm.surround41
-pcm.surround50 cards.pcm.surround50
-pcm.surround51 cards.pcm.surround51
-pcm.surround71 cards.pcm.surround71
-pcm.iec958 cards.pcm.iec958
-pcm.spdif iec958
-pcm.hdmi cards.pcm.hdmi
-pcm.dmix cards.pcm.dmix
-pcm.dsnoop cards.pcm.dsnoop
-pcm.modem cards.pcm.modem
-pcm.phoneline cards.pcm.phoneline
-
pcm.hw {
@args [ CARD DEV SUBDEV ]
@args.CARD {
@@ -323,6 +300,29 @@ pcm.null {
}
}
+# redirect to load-on-demand extended pcm definitions
+pcm.cards cards.pcm
+
+pcm.default cards.pcm.default
+pcm.sysdefault cards.pcm.default
+pcm.front cards.pcm.front
+pcm.rear cards.pcm.rear
+pcm.center_lfe cards.pcm.center_lfe
+pcm.side cards.pcm.side
+pcm.surround21 cards.pcm.surround21
+pcm.surround40 cards.pcm.surround40
+pcm.surround41 cards.pcm.surround41
+pcm.surround50 cards.pcm.surround50
+pcm.surround51 cards.pcm.surround51
+pcm.surround71 cards.pcm.surround71
+pcm.iec958 cards.pcm.iec958
+pcm.spdif iec958
+pcm.hdmi cards.pcm.hdmi
+pcm.dmix cards.pcm.dmix
+pcm.dsnoop cards.pcm.dsnoop
+pcm.modem cards.pcm.modem
+pcm.phoneline cards.pcm.phoneline
+
#
# Control interface
#
--
2.16.4

View File

@ -1,38 +0,0 @@
From c79f09e1f5e8b559b58dacdb00708d995b2e3aa5 Mon Sep 17 00:00:00 2001
From: paulhsia <paulhsia@chromium.org>
Date: Sat, 30 Nov 2019 03:35:30 +0800
Subject: [PATCH 01/30] ucm: Use strncmp to avoid access-out-of-boundary
If the length of the identifier is less than the length of the prefix,
access-out-of-boundary will occur in memcmp().
Signed-off-by: paulhsia <paulhsia@chromium.org>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/main.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/ucm/main.c b/src/ucm/main.c
index b0b6ffb34be5..252e50d9a387 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -61,11 +61,13 @@ static int check_identifier(const char *identifier, const char *prefix)
{
int len;
- if (strcmp(identifier, prefix) == 0)
- return 1;
len = strlen(prefix);
- if (memcmp(identifier, prefix, len) == 0 && identifier[len] == '/')
+ if (strncmp(identifier, prefix, len) != 0)
+ return 0;
+
+ if (identifier[len] == 0 || identifier[len] == '/')
return 1;
+
return 0;
}
--
2.16.4

View File

@ -0,0 +1,109 @@
From 09e78da4cade7b8fecb8f36717b85c456f2e5487 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 1 Mar 2020 19:57:06 +0100
Subject: [PATCH 2/5] conf: namehint - add omit_noargs to the hint section
Do not list simple surround devices in the namehint function by default.
Fixes: https://github.com/alsa-project/alsa-lib/issues/27
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf/pcm/surround21.conf | 1 +
src/conf/pcm/surround40.conf | 1 +
src/conf/pcm/surround41.conf | 1 +
src/conf/pcm/surround50.conf | 1 +
src/conf/pcm/surround51.conf | 1 +
src/conf/pcm/surround71.conf | 1 +
src/control/namehint.c | 6 +++++-
7 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/conf/pcm/surround21.conf b/src/conf/pcm/surround21.conf
index 1cf1b7af8dc6..ad19507bba58 100644
--- a/src/conf/pcm/surround21.conf
+++ b/src/conf/pcm/surround21.conf
@@ -57,5 +57,6 @@ pcm.!surround21 {
hint {
description "2.1 Surround output to Front and Subwoofer speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/conf/pcm/surround40.conf b/src/conf/pcm/surround40.conf
index 9788ad4884fd..7c615022f500 100644
--- a/src/conf/pcm/surround40.conf
+++ b/src/conf/pcm/surround40.conf
@@ -55,5 +55,6 @@ pcm.!surround40 {
hint {
description "4.0 Surround output to Front and Rear speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/conf/pcm/surround41.conf b/src/conf/pcm/surround41.conf
index 7b4ef3beb43a..cb6c0445ae07 100644
--- a/src/conf/pcm/surround41.conf
+++ b/src/conf/pcm/surround41.conf
@@ -61,5 +61,6 @@ pcm.!surround41 {
hint {
description "4.1 Surround output to Front, Rear and Subwoofer speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/conf/pcm/surround50.conf b/src/conf/pcm/surround50.conf
index 7d9a9e798fd8..70d54069f8a3 100644
--- a/src/conf/pcm/surround50.conf
+++ b/src/conf/pcm/surround50.conf
@@ -61,5 +61,6 @@ pcm.!surround50 {
hint {
description "5.0 Surround output to Front, Center and Rear speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/conf/pcm/surround51.conf b/src/conf/pcm/surround51.conf
index e67f007ef305..d0236e42d332 100644
--- a/src/conf/pcm/surround51.conf
+++ b/src/conf/pcm/surround51.conf
@@ -57,5 +57,6 @@ pcm.!surround51 {
hint {
description "5.1 Surround output to Front, Center, Rear and Subwoofer speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/conf/pcm/surround71.conf b/src/conf/pcm/surround71.conf
index a26c3f36c437..66792ddebbc0 100644
--- a/src/conf/pcm/surround71.conf
+++ b/src/conf/pcm/surround71.conf
@@ -59,5 +59,6 @@ pcm.!surround71 {
hint {
description "7.1 Surround output to Front, Center, Side, Rear and Woofer speakers"
device_output $DEV
+ omit_noargs true
}
}
diff --git a/src/control/namehint.c b/src/control/namehint.c
index 60c48ae32877..169bd4215fc5 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -287,10 +287,14 @@ static int try_config(snd_config_t *config,
err = -EINVAL;
goto __cleanup;
}
+ if (list->card < 0 &&
+ snd_config_search(cfg, "omit_noargs", &n) >= 0 &&
+ snd_config_get_bool(n) > 0)
+ goto __skip_add;
if (level == 1 &&
snd_config_search(cfg, "show", &n) >= 0 &&
snd_config_get_bool(n) <= 0)
- goto __skip_add;
+ goto __skip_add;
if (buf1 == NULL &&
snd_config_search(cfg, "description", &n) >= 0 &&
snd_config_get_string(n, &str) >= 0) {
--
2.16.4

View File

@ -1,42 +0,0 @@
From 9baf64da2f26844434ecea4825052937a3abe06c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 29 Nov 2019 22:28:26 +0100
Subject: [PATCH 02/30] ucm: return always at least NULL if no list is
available in snd_use_case_get_list()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/main.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/ucm/main.c b/src/ucm/main.c
index 252e50d9a387..b80db65fa93b 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -1160,8 +1160,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
modifier = find_modifier(uc_mgr, verb, name, 0);
if (modifier) {
- if (modifier->dev_list.type != type)
+ if (modifier->dev_list.type != type) {
+ *list = NULL;
return 0;
+ }
return get_list(&modifier->dev_list.list, list,
struct dev_list_node, list,
name);
@@ -1169,8 +1171,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
device = find_device(uc_mgr, verb, name, 0);
if (device) {
- if (device->dev_list.type != type)
+ if (device->dev_list.type != type) {
+ *list = NULL;
return 0;
+ }
return get_list(&device->dev_list.list, list,
struct dev_list_node, list,
name);
--
2.16.4

View File

@ -0,0 +1,27 @@
From c7efaef195b92e30efb3049a1c03fa1b50310477 Mon Sep 17 00:00:00 2001
From: be-marc <marcbecker@posteo.de>
Date: Tue, 3 Mar 2020 11:01:09 +0100
Subject: [PATCH 3/5] Change PCM device number of Asus Xonar U5
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf/cards/USB-Audio.conf | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index 1c6779379c89..dd99c44d859b 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -39,7 +39,8 @@ USB-Audio.pcm.iec958_device {
# "NoiseBlaster 3000" 42
"USB Sound Blaster HD" 1
"Xonar U7" 1
-
+ "ASUS XONAR U5" 1
+
# The below don't have digital in/out, so prevent them from being opened.
"Andrea PureAudio USB-SA Headset" 999
"Blue Snowball" 999
--
2.16.4

View File

@ -1,353 +0,0 @@
From ebdd2b6cdb8119cf75f0dd0a3b283d271b3a547e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 30 Nov 2019 20:31:55 +0100
Subject: [PATCH 03/30] ucm: add _identifiers list
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 1 +
src/ucm/main.c | 268 +++++++++++++++++++++++++++++++++++++++++------------
2 files changed, 208 insertions(+), 61 deletions(-)
diff --git a/include/use-case.h b/include/use-case.h
index 8e7e838c9cb9..85c58ac0614a 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -206,6 +206,7 @@ int snd_use_case_free_list(const char *list[], int items);
* - _enadevs - get list of enabled devices
* - _enamods - get list of enabled modifiers
*
+ * - _identifiers/{modifier}|{device}[/{verb}] - list of value identifiers
* - _supporteddevs/{modifier}|{device}[/{verb}] - list of supported devices
* - _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices
*
diff --git a/src/ucm/main.c b/src/ucm/main.c
index b80db65fa93b..d2078a2381d3 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -1072,7 +1072,6 @@ int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr)
/**
* \brief Get list of verbs in pair verbname+comment
* \param list Returned list
- * \param verbname For verb (NULL = current)
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_verb_list(snd_use_case_mgr_t *uc_mgr, const char **list[])
@@ -1181,7 +1180,6 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
}
return -ENOENT;
-
}
/**
@@ -1210,41 +1208,201 @@ static int get_conflicting_device_list(snd_use_case_mgr_t *uc_mgr,
#ifndef DOC_HIDDEN
struct myvalue {
- struct list_head list;
- char *value;
+ struct list_head list;
+ const char *text;
};
#endif
+/**
+ * \brief Convert myvalue list string list
+ * \param list myvalue list
+ * \param res string list
+ * \retval Number of list entries if success, otherwise a negativer error code
+ */
+static int myvalue_to_str_list(struct list_head *list, char ***res)
+{
+ struct list_head *pos;
+ struct myvalue *value;
+ char **p;
+ int cnt;
+
+ cnt = alloc_str_list(list, 1, res);
+ if (cnt < 0)
+ return cnt;
+ p = *res;
+ list_for_each(pos, list) {
+ value = list_entry(pos, struct myvalue, list);
+ *p = strdup(value->text);
+ if (*p == NULL) {
+ snd_use_case_free_list((const char **)p, cnt);
+ return -ENOMEM;
+ }
+ p++;
+ }
+ return cnt;
+}
+
+/**
+ * \brief Free myvalue list
+ * \param list myvalue list
+ */
+static void myvalue_list_free(struct list_head *list)
+{
+ struct list_head *pos, *npos;
+ struct myvalue *value;
+
+ list_for_each_safe(pos, npos, list) {
+ value = list_entry(pos, struct myvalue, list);
+ list_del(&value->list);
+ free(value);
+ }
+}
+
+/**
+ * \brief Merge one value to the myvalue list
+ * \param list The list with values
+ * \param value The value to be merged (without duplicates)
+ * \return 1 if dup, 0 if success, otherwise a negative error code
+ */
+static int merge_value(struct list_head *list, const char *text)
+{
+ struct list_head *pos;
+ struct myvalue *value;
+
+ list_for_each(pos, list) {
+ value = list_entry(pos, struct myvalue, list);
+ if (strcmp(value->text, text) == 0)
+ return 1;
+ }
+ value = malloc(sizeof(*value));
+ if (value == NULL)
+ return -ENOMEM;
+ value->text = text;
+ list_add_tail(&value->list, list);
+ return 0;
+}
+
+/**
+ * \brief Find all values for given identifier
+ * \param list Returned list
+ * \param source Source list with ucm_value structures
+ * \return Zero if success, otherwise a negative error code
+ */
+static int add_identifiers(struct list_head *list,
+ struct list_head *source)
+{
+ struct ucm_value *v;
+ struct list_head *pos;
+ int err;
+
+ list_for_each(pos, source) {
+ v = list_entry(pos, struct ucm_value, list);
+ err = merge_value(list, v->name);
+ if (err < 0)
+ return err;
+ }
+ return 0;
+}
+
+/**
+ * \brief Find all values for given identifier
+ * \param list Returned list
+ * \param identifier Identifier
+ * \param source Source list with ucm_value structures
+ */
static int add_values(struct list_head *list,
const char *identifier,
struct list_head *source)
{
- struct ucm_value *v;
- struct myvalue *val;
- struct list_head *pos, *pos1;
- int match;
+ struct ucm_value *v;
+ struct list_head *pos;
+ int err;
- list_for_each(pos, source) {
- v = list_entry(pos, struct ucm_value, list);
- if (check_identifier(identifier, v->name)) {
- match = 0;
- list_for_each(pos1, list) {
- val = list_entry(pos1, struct myvalue, list);
- if (strcmp(val->value, v->data) == 0) {
- match = 1;
- break;
- }
- }
- if (!match) {
- val = malloc(sizeof(struct myvalue));
- if (val == NULL)
- return -ENOMEM;
- val->value = v->data;
- list_add_tail(&val->list, list);
- }
- }
- }
- return 0;
+ list_for_each(pos, source) {
+ v = list_entry(pos, struct ucm_value, list);
+ if (check_identifier(identifier, v->name)) {
+ err = merge_value(list, v->data);
+ if (err < 0)
+ return err;
+ }
+ }
+ return 0;
+}
+
+/**
+ * \brief compare two identifiers
+ */
+static int identifier_cmp(const void *_a, const void *_b)
+{
+ const char * const *a = _a;
+ const char * const *b = _b;
+ return strcmp(*a, *b);
+}
+
+/**
+ * \brief Get list of available identifiers
+ * \param list Returned list
+ * \param name Name of verb or modifier to query
+ * \return Number of list entries if success, otherwise a negative error code
+ */
+static int get_identifiers_list(snd_use_case_mgr_t *uc_mgr,
+ const char **list[], char *name)
+{
+ struct use_case_verb *verb;
+ struct use_case_modifier *modifier;
+ struct use_case_device *device;
+ struct list_head mylist;
+ struct list_head *value_list;
+ char *str, **res;
+ int err;
+
+ if (!name)
+ return -ENOENT;
+
+ str = strchr(name, '/');
+ if (str) {
+ *str = '\0';
+ verb = find_verb(uc_mgr, str + 1);
+ }
+ else {
+ verb = uc_mgr->active_verb;
+ }
+ if (!verb)
+ return -ENOENT;
+
+ value_list = NULL;
+ modifier = find_modifier(uc_mgr, verb, name, 0);
+ if (modifier) {
+ value_list = &modifier->value_list;
+ } else {
+ device = find_device(uc_mgr, verb, name, 0);
+ if (device)
+ value_list = &device->value_list;
+ }
+ if (value_list == NULL)
+ return -ENOENT;
+
+ INIT_LIST_HEAD(&mylist);
+ err = add_identifiers(&mylist, &uc_mgr->value_list);
+ if (err < 0)
+ goto __fail;
+ err = add_identifiers(&mylist, &verb->value_list);
+ if (err < 0)
+ goto __fail;
+ err = add_identifiers(&mylist, value_list);
+ if (err < 0)
+ goto __fail;
+ err = myvalue_to_str_list(&mylist, &res);
+ if (err > 0)
+ *list = (const char **)res;
+ else if (err == 0)
+ *list = NULL;
+__fail:
+ myvalue_list_free(&mylist);
+ if (err <= 0)
+ return err;
+ qsort(*list, err, sizeof(char *), identifier_cmp);
+ return err;
}
/**
@@ -1258,8 +1416,7 @@ static int get_value_list(snd_use_case_mgr_t *uc_mgr,
const char **list[],
char *verbname)
{
- struct list_head mylist, *pos, *npos;
- struct myvalue *val;
+ struct list_head mylist, *pos;
struct use_case_verb *verb;
struct use_case_device *dev;
struct use_case_modifier *mod;
@@ -1292,26 +1449,13 @@ static int get_value_list(snd_use_case_mgr_t *uc_mgr,
if (err < 0)
goto __fail;
}
- err = alloc_str_list(&mylist, 1, &res);
- if (err >= 0) {
+ err = myvalue_to_str_list(&mylist, &res);
+ if (err > 0)
*list = (const char **)res;
- list_for_each(pos, &mylist) {
- val = list_entry(pos, struct myvalue, list);
- *res = strdup(val->value);
- if (*res == NULL) {
- snd_use_case_free_list((const char **)res, err);
- err = -ENOMEM;
- goto __fail;
- }
- res++;
- }
- }
+ else if (err == 0)
+ *list = NULL;
__fail:
- list_for_each_safe(pos, npos, &mylist) {
- val = list_entry(pos, struct myvalue, list);
- list_del(&val->list);
- free(val);
- }
+ myvalue_list_free(&mylist);
return err;
}
@@ -1381,21 +1525,23 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
} else {
str = NULL;
}
- if (check_identifier(identifier, "_devices"))
- err = get_device_list(uc_mgr, list, str);
+ if (check_identifier(identifier, "_devices"))
+ err = get_device_list(uc_mgr, list, str);
else if (check_identifier(identifier, "_modifiers"))
- err = get_modifier_list(uc_mgr, list, str);
- else if (check_identifier(identifier, "_supporteddevs"))
- err = get_supported_device_list(uc_mgr, list, str);
- else if (check_identifier(identifier, "_conflictingdevs"))
- err = get_conflicting_device_list(uc_mgr, list, str);
+ err = get_modifier_list(uc_mgr, list, str);
+ else if (check_identifier(identifier, "_identifiers"))
+ err = get_identifiers_list(uc_mgr, list, str);
+ else if (check_identifier(identifier, "_supporteddevs"))
+ err = get_supported_device_list(uc_mgr, list, str);
+ else if (check_identifier(identifier, "_conflictingdevs"))
+ err = get_conflicting_device_list(uc_mgr, list, str);
else if (identifier[0] == '_')
err = -ENOENT;
- else
- err = get_value_list(uc_mgr, identifier, list, str);
- if (str)
- free(str);
- }
+ else
+ err = get_value_list(uc_mgr, identifier, list, str);
+ if (str)
+ free(str);
+ }
__end:
pthread_mutex_unlock(&uc_mgr->mutex);
return err;
--
2.16.4

View File

@ -0,0 +1,31 @@
From 1654f38a29e635ce69a30c6c95ec1ca773ecee37 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 4 Mar 2020 11:27:12 +0100
Subject: [PATCH 4/5] configure: add --embed for python3-config (python 3.8)
Fixes: https://github.com/alsa-project/alsa-lib/issues/33
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
configure.ac | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 0f9fb01631f1..4b5ab6628bff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -423,7 +423,10 @@ if test "$build_python" = "yes" -a "$build_mixer_pymodules" = "yes"; then
pythonlibs0=
pythoninc0=
if test "$build_python2" != "yes"; then
- pythonlibs0=$(python3-config --libs)
+ pythonlibs0=$(python3-config --libs --embed 2> /dev/null)
+ if test -z "$pythonlibs0"; then
+ pythonlibs0=$(python3-config --libs)
+ fi
pythoninc0=$(python3-config --includes)
fi
if test -z "$pythonlibs0"; then
--
2.16.4

View File

@ -1,31 +0,0 @@
From 5ee5ef31b5ff3fb7c904054cb9cac7478a727f7c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 1 Dec 2019 14:26:40 +0100
Subject: [PATCH 04/30] namehint: correct the @args check
BugLink: https://github.com/alsa-project/alsa-plugins/issues/3
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/control/namehint.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/control/namehint.c b/src/control/namehint.c
index 808df6b50733..4927ef973c32 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -348,6 +348,12 @@ static int try_config(snd_config_t *config,
goto __cleanup;
if (snd_config_search(res, "@args", &cfg) >= 0) {
snd_config_for_each(i, next, cfg) {
+ /* skip the argument list */
+ snd_config_get_id(snd_config_iterator_entry(i), &str);
+ while (*str && *str >= '0' && *str <= '9') str++;
+ if (*str == '\0')
+ continue;
+ /* the argument definition must have the default */
if (snd_config_search(snd_config_iterator_entry(i),
"default", NULL) < 0) {
err = -EINVAL;
--
2.16.4

View File

@ -0,0 +1,29 @@
From 9ed3c65e1569a0ebbec9af1d04d739db9921e775 Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <tanuk@iki.fi>
Date: Fri, 13 Mar 2020 09:39:17 +0200
Subject: [PATCH 5/5] conf: USB-Audio: Add C-Media USB Headphone Set to the
IEC958 blacklist
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/317
Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf/cards/USB-Audio.conf | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index dd99c44d859b..89811086db1d 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -44,6 +44,7 @@ USB-Audio.pcm.iec958_device {
# The below don't have digital in/out, so prevent them from being opened.
"Andrea PureAudio USB-SA Headset" 999
"Blue Snowball" 999
+ "C-Media USB Headphone Set" 999
"HP Digital Stereo Headset" 999
"GN 9330" 999
"Logitech Speaker Lapdesk N700" 999
--
2.16.4

View File

@ -1,28 +0,0 @@
From 6055f8a584296abfc0cec0439ceb708f0eddcc9d Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 1 Dec 2019 14:30:54 +0100
Subject: [PATCH 05/30] namehint: improve the previous patch (check the
returned value)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/control/namehint.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/control/namehint.c b/src/control/namehint.c
index 4927ef973c32..60c48ae32877 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -349,7 +349,8 @@ static int try_config(snd_config_t *config,
if (snd_config_search(res, "@args", &cfg) >= 0) {
snd_config_for_each(i, next, cfg) {
/* skip the argument list */
- snd_config_get_id(snd_config_iterator_entry(i), &str);
+ if (snd_config_get_id(snd_config_iterator_entry(i), &str) < 0)
+ continue;
while (*str && *str >= '0' && *str <= '9') str++;
if (*str == '\0')
continue;
--
2.16.4

View File

@ -1,56 +0,0 @@
From 4dddcf733d56a13f4d042fefa1fb6230c09f1f65 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 2 Dec 2019 11:56:30 +0100
Subject: [PATCH 06/30] ucm: docs - allow spaces in device names for JackHWMute
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/include/use-case.h b/include/use-case.h
index 85c58ac0614a..e1f5802789ff 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -326,7 +326,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - Valid values: "soft" (software attenuation)
* - EDIDFile
* - Path to EDID file for HDMI devices
- * - JackControl, JackDev, JackHWMute
+ * - JackControl, JackDev
* - Jack information for a device. The jack status can be reported via
* a kcontrol and/or via an input device. **JackControl** is the
* kcontrol name of the jack, and **JackDev** is the input device id of
@@ -334,17 +334,18 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* JackDev value should be "foo"). UCM configuration files should
* contain both JackControl and JackDev when possible, because
* applications are likely to support only one or the other.
- *
- * If **JackHWMute** is set, it indicates that when the jack is plugged
- * in, the hardware automatically mutes some other device(s). The
- * JackHWMute value is a space-separated list of device names (this
- * isn't compatible with device names with spaces in them, so don't use
- * such device names!). Note that JackHWMute should be used only when
- * the hardware enforces the automatic muting. If the hardware doesn't
- * enforce any muting, it may still be tempting to set JackHWMute to
- * trick upper software layers to e.g. automatically mute speakers when
- * headphones are plugged in, but that's application policy
- * configuration that doesn't belong to UCM configuration files.
+ * - JackHWMute
+ * If this value is set, it indicates that when the jack is plugged
+ * in, the hardware automatically mutes some other device(s). The
+ * value is a space-separated list of device names. If the device
+ * name contains space, it must be enclosed to ' or ", e.g.:
+ * JackHWMute "'Dock Headphone' Headphone"
+ * Note that JackHWMute should be used only when the hardware enforces
+ * the automatic muting. If the hardware doesn't enforce any muting, it
+ * may still be tempting to set JackHWMute to trick upper software layers
+ * to e.g. automatically mute speakers when headphones are plugged in,
+ * but that's application policy configuration that doesn't belong
+ * to UCM configuration files.
* - MinBufferLevel
* - This is used on platform where reported buffer level is not accurate.
* E.g. "512", which holds 512 samples in device buffer. Note: this will
--
2.16.4

View File

@ -1,48 +0,0 @@
From 2a286ca9a8415571181ce58027686ec332a834e9 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 2 Dec 2019 11:57:18 +0100
Subject: [PATCH 07/30] use-case: docs - add PlaybackMixerCopy and
CaptureMixerCopy
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/include/use-case.h b/include/use-case.h
index e1f5802789ff..71fcc949a117 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -309,8 +309,14 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - PlaybackMixerElem
* - mixer element playback identifier
* - can be parsed using snd_use_case_parse_selem_id()
+ * - PlaybackMixerCopy
+ * - additional mixer element playback identifier
+ * - can be parsed using snd_use_case_parse_selem_id()
+ * - those elements should copy the volume and switch settings
+ * - element identifiers are separated using the | character
* - PlaybackMasterElem
* - mixer element playback identifier for the master control
+ * - can be parsed using snd_use_case_parse_selem_id()
* - PlaybackMasterType
* - type of the master volume control
* - Valid values: "soft" (software attenuation)
@@ -319,8 +325,14 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - CaptureMixerElem
* - mixer element capture identifier
* - can be parsed using snd_use_case_parse_selem_id()
+ * - CaptureMixerCopy
+ * - additional mixer element capture identifier
+ * - can be parsed using snd_use_case_parse_selem_id()
+ * - those elements should copy the volume and switch settings
+ * - element identifiers are separated using the | character
* - CaptureMasterElem
* - mixer element playback identifier for the master control
+ * - can be parsed using snd_use_case_parse_selem_id()
* - CaptureMasterType
* - type of the master volume control
* - Valid values: "soft" (software attenuation)
--
2.16.4

View File

@ -1,47 +0,0 @@
From a0fc4447bb7c7f9a850a0a85f3a5a32c1509caf4 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 3 Dec 2019 15:01:04 +0100
Subject: [PATCH 08/30] ucm: docs - add JackCTL, rearrange JackControl and
JackDev
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/include/use-case.h b/include/use-case.h
index 71fcc949a117..25998cb9bad5 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -338,14 +338,20 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - Valid values: "soft" (software attenuation)
* - EDIDFile
* - Path to EDID file for HDMI devices
- * - JackControl, JackDev
- * - Jack information for a device. The jack status can be reported via
- * a kcontrol and/or via an input device. **JackControl** is the
- * kcontrol name of the jack, and **JackDev** is the input device id of
- * the jack (if the full input device path is /dev/input/by-id/foo, the
- * JackDev value should be "foo"). UCM configuration files should
- * contain both JackControl and JackDev when possible, because
- * applications are likely to support only one or the other.
+ * - JackCTL
+ * - jack control device name
+ * - JackControl
+ * - jack control identificator
+ * - can be parsed using snd_use_case_parse_ctl_elem_id()
+ * - UCM configuration files should contain both JackControl and JackDev
+ * when possible, because applications are likely to support only one
+ * or the other
+ * - JackDev
+ * - the input device id of the jack (if the full input device path is
+ * /dev/input/by-id/foo, the JackDev value should be "foo")
+ * - UCM configuration files should contain both JackControl and JackDev
+ * when possible, because applications are likely to support only one
+ * or the other
* - JackHWMute
* If this value is set, it indicates that when the jack is plugged
* in, the hardware automatically mutes some other device(s). The
--
2.16.4

View File

@ -1,83 +0,0 @@
From e59034a0bec257cc7422a1e9436d936be8696a6f Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 3 Dec 2019 18:27:39 +0100
Subject: [PATCH 09/30] ucm: Do not fail to parse configs on cards with an
empty CardComponents lists
Since the UCM profiles for all Bay- and Cherry-Trail SST cards have been
moved over to UCM2, parsing them fails with:
ALSA lib ucm_subs.c:220:(uc_mgr_get_substituted_value) variable '${CardComponents}' is not defined in this context!
This completely breaks audio support on all Bay- and Cherry-Trail devices.
This is caused by these non-SOF ASoC using cards having an empty
CardComponents list. Which in itself is fine, but is rejected by
the ucm_subs.c code. This commit changes the ucm_subs code to accept
an empty string as a valid value for CardComponents restoring audio
functionality on these boards.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/ucm_subs.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
index 00afa9e3de0e..90e395f0ab6f 100644
--- a/src/ucm/ucm_subs.c
+++ b/src/ucm/ucm_subs.c
@@ -25,6 +25,7 @@
*/
#include "ucm_local.h"
+#include <stdbool.h>
#include <sys/stat.h>
#include <limits.h>
@@ -145,10 +146,11 @@ static char *rval_sysfs(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char
return strdup(path);
}
-#define MATCH_VARIABLE(name, id, fcn) \
+#define MATCH_VARIABLE(name, id, fcn, empty_ok) \
if (strncmp((name), (id), sizeof(id) - 1) == 0) { \
rval = fcn(uc_mgr); \
idsize = sizeof(id) - 1; \
+ allow_empty = (empty_ok); \
goto __rval; \
}
@@ -189,12 +191,14 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
while (*value) {
if (*value == '$' && *(value+1) == '{') {
- MATCH_VARIABLE(value, "${ConfName}", rval_conf_name);
- MATCH_VARIABLE(value, "${CardId}", rval_card_id);
- MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver);
- MATCH_VARIABLE(value, "${CardName}", rval_card_name);
- MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname);
- MATCH_VARIABLE(value, "${CardComponents}", rval_card_components);
+ bool allow_empty = false;
+
+ MATCH_VARIABLE(value, "${ConfName}", rval_conf_name, false);
+ MATCH_VARIABLE(value, "${CardId}", rval_card_id, false);
+ MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver, false);
+ MATCH_VARIABLE(value, "${CardName}", rval_card_name, false);
+ MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname, false);
+ MATCH_VARIABLE(value, "${CardComponents}", rval_card_components, true);
MATCH_VARIABLE2(value, "${env:", rval_env);
MATCH_VARIABLE2(value, "${sys:", rval_sysfs);
err = -EINVAL;
@@ -208,7 +212,7 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
}
goto __error;
__rval:
- if (rval == NULL || rval[0] == '\0') {
+ if (rval == NULL || (!allow_empty && rval[0] == '\0')) {
free(rval);
strncpy(r, value, idsize);
r[idsize] = '\0';
--
2.16.4

View File

@ -1,38 +0,0 @@
From 8e2c70add782f997f7c269ed3f722888e56ff024 Mon Sep 17 00:00:00 2001
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Tue, 3 Dec 2019 18:56:40 +0100
Subject: [PATCH 10/30] src/ucm/main.c: fix build without mixer
Commit 4ce38a5ff466d18039b2606938f866ea3a6c9f3c breaks the build without
mixer on:
CCLD libasound.la
/home/buildroot/autobuild/instance-1/output-1/host/lib/gcc/xtensa-buildroot-linux-uclibc/8.3.0/../../../../xtensa-buildroot-linux-uclibc/bin/ld: ucm/.libs/libucm.a(main.o): in function `snd_use_case_set':
main.c:(.text+0x185c): undefined reference to `snd_mixer_selem_id_parse'
Fixes: http://autobuild.buildroot.org/results/4d91c9f82a2a61c50c457a851073b85cc09ea345
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/main.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/ucm/main.c b/src/ucm/main.c
index d2078a2381d3..61922f10b7c7 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -2115,8 +2115,10 @@ int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
const char *ucm_id,
const char *value)
{
+#ifdef BUILD_MIXER
if (strcmp(ucm_id, "PlaybackMixerId") == 0 ||
strcmp(ucm_id, "CaptureMixerId") == 0)
return snd_mixer_selem_id_parse(dst, value);
+#endif
return -EINVAL;
}
--
2.16.4

View File

@ -1,53 +0,0 @@
From ad8527d81b09c4d0edd054b5b1468ce1c50b23cb Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 4 Dec 2019 09:49:40 +0100
Subject: [PATCH 11/30] alsa.m4: another try to fix the libatopology detection
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
utils/alsa.m4 | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/utils/alsa.m4 b/utils/alsa.m4
index 4c457f0d4e1d..320e4336a925 100644
--- a/utils/alsa.m4
+++ b/utils/alsa.m4
@@ -22,6 +22,7 @@ alsa_save_CFLAGS="$CFLAGS"
alsa_save_LDFLAGS="$LDFLAGS"
alsa_save_LIBS="$LIBS"
alsa_found=yes
+alsa_topology_found=no
dnl
dnl Get the cflags and libraries for alsa
@@ -158,11 +159,17 @@ AC_CHECK_LIB([asound], [snd_ctl_open],,
alsa_found=no]
)
if test "x$enable_atopology" = "xyes"; then
+alsa_topology_found=yes
AC_CHECK_LIB([atopology], [snd_tplg_new],,
[ifelse([$3], , [AC_MSG_ERROR(No linkable libatopology was found.)])
- alsa_found=no]
+ alsa_topology_found=no,
+]
)
fi
+else
+if test "x$enable_atopology" = "xyes"; then
+ alsa_topology_found=yes
+fi
fi
if test "x$alsa_found" = "xyes" ; then
@@ -183,7 +190,7 @@ fi
dnl add the alsa topology library; must be at the end
AC_MSG_CHECKING(for ALSA topology LDFLAGS)
-if test "x$enable_atopology" = "xyes"; then
+if test "x$alsa_topology_found" = "xyes"; then
ALSA_TOPOLOGY_LIBS="$ALSA_TOPOLOGY_LIBS -latopology"
fi
AC_MSG_RESULT($ALSA_TOPOLOGY_LIBS)
--
2.16.4

View File

@ -1,37 +0,0 @@
From 555a5dbdabc5ed3be1ca81865abdb997bc3a6082 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 5 Dec 2019 16:59:05 +0100
Subject: [PATCH 12/30] ucm: docs - add Mic/DigitalMic and multiple devices
comments
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/include/use-case.h b/include/use-case.h
index 25998cb9bad5..1736da25b649 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -114,10 +114,18 @@ extern "C" {
*
* Physical system devices the render and capture audio. Devices can be OR'ed
* together to support audio on simultaneous devices.
+ *
+ * If multiple devices with the same name exists, the number suffixes should
+ * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
+ * allowed. The names with numbers must be continuous.
+ *
+ * The preference of the devices is determined by the priority value.
*/
#define SND_USE_CASE_DEV_NONE "None" /**< None Device */
#define SND_USE_CASE_DEV_SPEAKER "Speaker" /**< Speaker Device */
#define SND_USE_CASE_DEV_LINE "Line" /**< Line Device */
+#define SND_USE_CASE_DEV_MIC "Mic" /**< Integrated Analog Microphone */
+#define SND_USE_CASE_DEV_DIGITAL_MIC "DigitalMic" /**< Integrated Digital Microphone */
#define SND_USE_CASE_DEV_HEADPHONES "Headphones" /**< Headphones Device */
#define SND_USE_CASE_DEV_HEADSET "Headset" /**< Headset Device */
#define SND_USE_CASE_DEV_HANDSET "Handset" /**< Handset Device */
--
2.16.4

View File

@ -1,27 +0,0 @@
From 1ad660ddeecb2a364f1ca62aa60f256f7029cfdc Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 5 Dec 2019 17:01:31 +0100
Subject: [PATCH 13/30] ucm: docs - remove DigitalMic, it does not have sense
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/include/use-case.h b/include/use-case.h
index 1736da25b649..214a2a4c4691 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -124,8 +124,7 @@ extern "C" {
#define SND_USE_CASE_DEV_NONE "None" /**< None Device */
#define SND_USE_CASE_DEV_SPEAKER "Speaker" /**< Speaker Device */
#define SND_USE_CASE_DEV_LINE "Line" /**< Line Device */
-#define SND_USE_CASE_DEV_MIC "Mic" /**< Integrated Analog Microphone */
-#define SND_USE_CASE_DEV_DIGITAL_MIC "DigitalMic" /**< Integrated Digital Microphone */
+#define SND_USE_CASE_DEV_MIC "Mic" /**< Integrated Microphone */
#define SND_USE_CASE_DEV_HEADPHONES "Headphones" /**< Headphones Device */
#define SND_USE_CASE_DEV_HEADSET "Headset" /**< Headset Device */
#define SND_USE_CASE_DEV_HANDSET "Handset" /**< Handset Device */
--
2.16.4

View File

@ -1,27 +0,0 @@
From 5473c5d677915b88d5c93d5bcc6cd16bb6a40342 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 5 Dec 2019 17:19:06 +0100
Subject: [PATCH 14/30] ucm: docs - change the Mic description to simple
Microphone Device
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/use-case.h b/include/use-case.h
index 214a2a4c4691..b04f7b9d38de 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -124,7 +124,7 @@ extern "C" {
#define SND_USE_CASE_DEV_NONE "None" /**< None Device */
#define SND_USE_CASE_DEV_SPEAKER "Speaker" /**< Speaker Device */
#define SND_USE_CASE_DEV_LINE "Line" /**< Line Device */
-#define SND_USE_CASE_DEV_MIC "Mic" /**< Integrated Microphone */
+#define SND_USE_CASE_DEV_MIC "Mic" /**< Microphone Device */
#define SND_USE_CASE_DEV_HEADPHONES "Headphones" /**< Headphones Device */
#define SND_USE_CASE_DEV_HEADSET "Headset" /**< Headset Device */
#define SND_USE_CASE_DEV_HANDSET "Handset" /**< Handset Device */
--
2.16.4

View File

@ -1,30 +0,0 @@
From ca67e823833213e140a09ce43b6399b7676616df Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 6 Dec 2019 11:11:54 +0100
Subject: [PATCH 15/30] ucm: docs - add note about the sequences and device
split
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/include/use-case.h b/include/use-case.h
index b04f7b9d38de..2efcb4d8fdc3 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -119,6 +119,11 @@ extern "C" {
* be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
* allowed. The names with numbers must be continuous.
*
+ * If EnableSequence/DisableSequence controls independent paths in the hardware
+ * it is also recommended to split playback and capture UCM devices and use
+ * the number suffixes. Example use case: Use the integrated microphone
+ * in the laptop instead the microphone in headphones.
+ *
* The preference of the devices is determined by the priority value.
*/
#define SND_USE_CASE_DEV_NONE "None" /**< None Device */
--
2.16.4

View File

@ -1,69 +0,0 @@
From f828dfe549fbab0a920768c63ebd3478272954eb Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 10 Dec 2019 11:48:06 +0100
Subject: [PATCH 16/30] ucm: docs - remove MixerCopy values, add Priority for
verb, improve priority docs
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/use-case.h | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/include/use-case.h b/include/use-case.h
index 2efcb4d8fdc3..134303afaa18 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -274,6 +274,10 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* Recommended names for values:
* - TQ
* - Tone Quality
+ * - Priority
+ * - priority value (1-10000), higher value means higher priority
+ * - valid only for verbs
+ * - for devices - PlaybackPriority and CapturePriority
* - PlaybackPCM
* - full PCM playback device name
* - PlaybackPCMIsDummy
@@ -301,7 +305,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - playback control switch identifier string
* - can be parsed using snd_use_case_parse_ctl_elem_id()
* - PlaybackPriority
- * - priority value (1-10000), default value is 100, higher value means lower priority
+ * - priority value (1-10000), higher value means higher priority
* - CaptureRate
* - capture device sample rate
* - CaptureChannels
@@ -315,17 +319,12 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - capture control switch identifier string
* - can be parsed using snd_use_case_parse_ctl_elem_id()
* - CapturePriority
- * - priority value (1-10000), default value is 100, higher value means lower priority
+ * - priority value (1-10000), higher value means higher priority
* - PlaybackMixer
* - name of playback mixer
* - PlaybackMixerElem
* - mixer element playback identifier
* - can be parsed using snd_use_case_parse_selem_id()
- * - PlaybackMixerCopy
- * - additional mixer element playback identifier
- * - can be parsed using snd_use_case_parse_selem_id()
- * - those elements should copy the volume and switch settings
- * - element identifiers are separated using the | character
* - PlaybackMasterElem
* - mixer element playback identifier for the master control
* - can be parsed using snd_use_case_parse_selem_id()
@@ -337,11 +336,6 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
* - CaptureMixerElem
* - mixer element capture identifier
* - can be parsed using snd_use_case_parse_selem_id()
- * - CaptureMixerCopy
- * - additional mixer element capture identifier
- * - can be parsed using snd_use_case_parse_selem_id()
- * - those elements should copy the volume and switch settings
- * - element identifiers are separated using the | character
* - CaptureMasterElem
* - mixer element playback identifier for the master control
* - can be parsed using snd_use_case_parse_selem_id()
--
2.16.4

View File

@ -1,31 +0,0 @@
From 1744159180ac94a72036d7232e674c58cedee70a Mon Sep 17 00:00:00 2001
From: Libin Yang <libin.yang@linux.intel.com>
Date: Wed, 11 Dec 2019 14:07:19 +0800
Subject: [PATCH 17/30] ucm: setup conf_format after getting
ALSA_CONFIG_UCM_VAR successfully
Set the conf_format to 1 after getting ALSA_CONFIG_UCM_VAR successfully.
Otherwise, the conf_format is not set in this scenario.
Signed-off-by: Libin Yang <libin.yang@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index ba5002779f56..d61124a343e1 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -89,6 +89,8 @@ static void configuration_filename(snd_use_case_mgr_t *uc_mgr,
env = getenv(ALSA_CONFIG_UCM2_VAR);
if (env == NULL) {
env = getenv(ALSA_CONFIG_UCM_VAR);
+ if (env)
+ uc_mgr->conf_format = 1;
} else {
uc_mgr->conf_format = 2;
}
--
2.16.4

View File

@ -1,87 +0,0 @@
From 9980e18c3c99da42a90a98b140a0ffe7d0f92cd3 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 12 Dec 2019 18:42:33 +0100
Subject: [PATCH 18/30] alsa-lib: fix the array parser (unique compound keys)
The code from the old import may merge arrays wrongly and
the result is a compound with same keys like:
Input:
lines [
"SSP0.OUT, , BUF1.3"
]
lines [
"BUF2.0, , SSP0.IN"
]
Parsed contents:
lines {
0 'SSP0.OUT, , BUF1.3'
0 'BUF2.0, , SSP0.IN'
}
Proper parsed contents (create+merge mode):
lines {
0 'SSP0.OUT, , BUF1.3'
1 'BUF2.0, , SSP0.IN'
}
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/conf.c b/src/conf.c
index e430650430d1..3e753b266b8d 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -1226,7 +1226,7 @@ static int parse_value(snd_config_t **_n, snd_config_t *parent, input_t *input,
static int parse_defs(snd_config_t *parent, input_t *input, int skip, int override);
static int parse_array_defs(snd_config_t *farther, input_t *input, int skip, int override);
-static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int skip, int override)
+static int parse_array_def(snd_config_t *parent, input_t *input, int *idx, int skip, int override)
{
char *id = NULL;
int c;
@@ -1234,8 +1234,21 @@ static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int sk
snd_config_t *n = NULL;
if (!skip) {
+ snd_config_t *g;
char static_id[12];
- snprintf(static_id, sizeof(static_id), "%i", idx);
+ while (1) {
+ snprintf(static_id, sizeof(static_id), "%i", *idx);
+ if (_snd_config_search(parent, static_id, -1, &g) == 0) {
+ if (override) {
+ snd_config_delete(n);
+ } else {
+ /* merge */
+ (*idx)++;
+ continue;
+ }
+ }
+ break;
+ }
id = strdup(static_id);
if (id == NULL)
return -ENOMEM;
@@ -1306,9 +1319,10 @@ static int parse_array_defs(snd_config_t *parent, input_t *input, int skip, int
unget_char(c, input);
if (c == ']')
return 0;
- err = parse_array_def(parent, input, idx++, skip, override);
+ err = parse_array_def(parent, input, &idx, skip, override);
if (err < 0)
return err;
+ idx++;
}
return 0;
}
--
2.16.4

View File

@ -1,30 +0,0 @@
From 075ee165e647a6b434f63ca578f2f8faff2a55f6 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 16:09:35 +0100
Subject: [PATCH 19/30] topology: remove vendor_fd/name from snd_tplg structure
- not used
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/tplg_local.h | 5 -----
1 file changed, 5 deletions(-)
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index c32267d29510..22648fa51f9b 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -60,11 +60,6 @@ typedef enum _snd_pcm_rates {
} snd_pcm_rates_t;
struct snd_tplg {
-
- /* opaque vendor data */
- int vendor_fd;
- char *vendor_name;
-
/* out file */
int out_fd;
--
2.16.4

View File

@ -1,319 +0,0 @@
From ce74829db630a49569c79aea4aeb288fdd458dd8 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 17:01:03 +0100
Subject: [PATCH 20/30] topology: file position and size cleanups
- try to use size_t/ssize_t
- track the position in own variable, do not use lseek
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 121 ++++++++++++++++++++++------------------------
src/topology/tplg_local.h | 3 +-
2 files changed, 60 insertions(+), 64 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 5ae3ae89dac7..4e6cbbb08a1a 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -23,28 +23,41 @@
/* verbose output detailing each object size and file position */
static void verbose(snd_tplg_t *tplg, const char *fmt, ...)
{
- int offset;
va_list va;
if (!tplg->verbose)
return;
- offset = lseek(tplg->out_fd, 0, SEEK_CUR);
-
va_start(va, fmt);
- fprintf(stdout, "0x%6.6x/%6.6d -", offset, offset);
+ fprintf(stdout, "0x%6.6zx/%6.6zd -", tplg->out_pos, tplg->out_pos);
vfprintf(stdout, fmt, va);
va_end(va);
}
+/* write a block, track the position */
+static ssize_t twrite(snd_tplg_t *tplg, void *data, size_t data_size)
+{
+ ssize_t r = write(tplg->out_fd, data, data_size);
+ if (r != (ssize_t)data_size) {
+ if (r < 0) {
+ SNDERR("error: unable to write: %s", strerror(errno));
+ return -errno;
+ }
+ tplg->out_pos += r;
+ SNDERR("error: unable to write (partial)");
+ return -EIO;
+ }
+ tplg->out_pos += r;
+ return r;
+}
+
/* write out block header to output file */
-static int write_block_header(snd_tplg_t *tplg, unsigned int type,
- unsigned int vendor_type, unsigned int version, unsigned int index,
- size_t payload_size, int count)
+static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
+ unsigned int vendor_type,
+ unsigned int version, unsigned int index,
+ size_t payload_size, int count)
{
struct snd_soc_tplg_hdr hdr;
- size_t bytes;
- int offset = lseek(tplg->out_fd, 0, SEEK_CUR);
memset(&hdr, 0, sizeof(hdr));
hdr.magic = SND_SOC_TPLG_MAGIC;
@@ -58,13 +71,13 @@ static int write_block_header(snd_tplg_t *tplg, unsigned int type,
hdr.count = count;
/* make sure file offset is aligned with the calculated HDR offset */
- if ((unsigned int)offset != tplg->next_hdr_pos) {
- SNDERR("error: New header is at offset 0x%x but file"
- " offset 0x%x is %s by %d bytes\n",
- tplg->next_hdr_pos, offset,
- (unsigned int)offset > tplg->next_hdr_pos ? "ahead" : "behind",
- abs(offset - tplg->next_hdr_pos));
- exit(-EINVAL);
+ if (tplg->out_pos != tplg->next_hdr_pos) {
+ SNDERR("error: New header is at offset 0x%zx but file"
+ " offset 0x%zx is %s by %ld bytes\n",
+ tplg->next_hdr_pos, tplg->out_pos,
+ tplg->out_pos > tplg->next_hdr_pos ? "ahead" : "behind",
+ labs(tplg->out_pos - tplg->next_hdr_pos));
+ return -EINVAL;
}
verbose(tplg, " header index %d type %d count %d size 0x%lx/%ld vendor %d "
@@ -74,22 +87,16 @@ static int write_block_header(snd_tplg_t *tplg, unsigned int type,
tplg->next_hdr_pos += hdr.payload_size + sizeof(hdr);
- bytes = write(tplg->out_fd, &hdr, sizeof(hdr));
- if (bytes != sizeof(hdr)) {
- SNDERR("error: can't write section header %lu\n",
- (long unsigned int)bytes);
- return bytes;
- }
-
- return bytes;
+ return twrite(tplg, &hdr, sizeof(hdr));
}
static int write_elem_block(snd_tplg_t *tplg,
- struct list_head *base, int size, int tplg_type, const char *obj_name)
+ struct list_head *base, size_t size, int tplg_type, const char *obj_name)
{
struct list_head *pos, *sub_pos, *sub_base;
struct tplg_elem *elem, *elem_next;
- int ret, wsize = 0, total_size = 0, count = 0, block_size = 0;
+ size_t total_size = 0, count = 0, block_size = 0;
+ ssize_t ret, wsize;
sub_base = base;
list_for_each(pos, base) {
@@ -129,12 +136,9 @@ static int write_elem_block(snd_tplg_t *tplg,
elem->route->control,
elem->route->sink, elem->size);
- wsize = write(tplg->out_fd, elem->obj, elem->size);
- if (wsize < 0) {
- SNDERR("error: failed to write %s %d\n",
- obj_name, ret);
- return ret;
- }
+ wsize = twrite(tplg, elem->obj, elem->size);
+ if (wsize < 0)
+ return size;
total_size += wsize;
/* get to the end of sub list */
@@ -151,7 +155,7 @@ static int write_elem_block(snd_tplg_t *tplg,
/* make sure we have written the correct size */
if (total_size != size) {
- SNDERR("error: size mismatch. Expected %d wrote %d\n",
+ SNDERR("error: size mismatch. Expected %zu wrote %zu\n",
size, total_size);
return -EIO;
}
@@ -179,8 +183,7 @@ static int calc_block_size(struct list_head *base)
return size;
}
-static int write_block(snd_tplg_t *tplg, struct list_head *base,
- int type)
+static int write_block(snd_tplg_t *tplg, struct list_head *base, int type)
{
int size;
@@ -231,44 +234,36 @@ static int write_block(snd_tplg_t *tplg, struct list_head *base,
}
/* write the manifest including its private data */
-static int write_manifest_data(snd_tplg_t *tplg)
+static ssize_t write_manifest_data(snd_tplg_t *tplg)
{
- int ret;
+ ssize_t ret;
/* write the header for this block */
ret = write_block_header(tplg, SND_SOC_TPLG_TYPE_MANIFEST, 0,
tplg->version, 0,
sizeof(tplg->manifest) + tplg->manifest.priv.size, 1);
if (ret < 0) {
- SNDERR("error: failed to write manifest block %d\n", ret);
+ SNDERR("error: failed to write manifest block\n");
return ret;
}
verbose(tplg, "manifest : write %d bytes\n", sizeof(tplg->manifest));
- ret = write(tplg->out_fd, &tplg->manifest, sizeof(tplg->manifest));
- if (ret < 0) {
- SNDERR("error: failed to write manifest %d\n", ret);
- return ret;
+ ret = twrite(tplg, &tplg->manifest, sizeof(tplg->manifest));
+ if (ret >= 0) {
+ verbose(tplg, "manifest : write %d priv bytes\n", tplg->manifest.priv.size);
+ ret = twrite(tplg, tplg->manifest_pdata, tplg->manifest.priv.size);
}
-
- verbose(tplg, "manifest : write %d priv bytes\n", tplg->manifest.priv.size);
- ret = write(tplg->out_fd, tplg->manifest_pdata, tplg->manifest.priv.size);
- if (ret < 0) {
- SNDERR("error: failed to write manifest priv data %d\n", ret);
- return ret;
- }
-
- return 0;
+ return ret;
}
int tplg_write_data(snd_tplg_t *tplg)
{
- int ret;
+ ssize_t ret;
/* write manifest */
ret = write_manifest_data(tplg);
if (ret < 0) {
- SNDERR("failed to write manifest %d\n", ret);
+ SNDERR("failed to write manifest %zd\n", ret);
return ret;
}
@@ -276,7 +271,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->mixer_list,
SND_TPLG_TYPE_MIXER);
if (ret < 0) {
- SNDERR("failed to write control elems %d\n", ret);
+ SNDERR("failed to write control elems %zd\n", ret);
return ret;
}
@@ -284,7 +279,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->enum_list,
SND_TPLG_TYPE_ENUM);
if (ret < 0) {
- SNDERR("failed to write control elems %d\n", ret);
+ SNDERR("failed to write control elems %zd\n", ret);
return ret;
}
@@ -292,7 +287,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->bytes_ext_list,
SND_TPLG_TYPE_BYTES);
if (ret < 0) {
- SNDERR("failed to write control elems %d\n", ret);
+ SNDERR("failed to write control elems %zd\n", ret);
return ret;
}
@@ -300,7 +295,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->widget_list,
SND_TPLG_TYPE_DAPM_WIDGET);
if (ret < 0) {
- SNDERR("failed to write widget elems %d\n", ret);
+ SNDERR("failed to write widget elems %zd\n", ret);
return ret;
}
@@ -308,7 +303,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->pcm_list,
SND_TPLG_TYPE_PCM);
if (ret < 0) {
- SNDERR("failed to write pcm elems %d\n", ret);
+ SNDERR("failed to write pcm elems %zd\n", ret);
return ret;
}
@@ -316,7 +311,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->dai_list,
SND_TPLG_TYPE_DAI);
if (ret < 0) {
- SNDERR("failed to write physical dai elems %d\n", ret);
+ SNDERR("failed to write physical dai elems %zd\n", ret);
return ret;
}
@@ -324,7 +319,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->be_list,
SND_TPLG_TYPE_BE);
if (ret < 0) {
- SNDERR("failed to write be elems %d\n", ret);
+ SNDERR("failed to write be elems %zd\n", ret);
return ret;
}
@@ -332,7 +327,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->cc_list,
SND_TPLG_TYPE_CC);
if (ret < 0) {
- SNDERR("failed to write cc elems %d\n", ret);
+ SNDERR("failed to write cc elems %zd\n", ret);
return ret;
}
@@ -340,7 +335,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->route_list,
SND_TPLG_TYPE_DAPM_GRAPH);
if (ret < 0) {
- SNDERR("failed to write graph elems %d\n", ret);
+ SNDERR("failed to write graph elems %zd\n", ret);
return ret;
}
@@ -348,7 +343,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_block(tplg, &tplg->pdata_list,
SND_TPLG_TYPE_DATA);
if (ret < 0) {
- SNDERR("failed to write private data %d\n", ret);
+ SNDERR("failed to write private data %zd\n", ret);
return ret;
}
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 22648fa51f9b..7b8abcdefbcf 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -62,12 +62,13 @@ typedef enum _snd_pcm_rates {
struct snd_tplg {
/* out file */
int out_fd;
+ size_t out_pos;
int verbose;
unsigned int version;
/* runtime state */
- unsigned int next_hdr_pos;
+ size_t next_hdr_pos;
int index;
int channel_idx;
--
2.16.4

View File

@ -1,179 +0,0 @@
From 012bd3b28c0d2744db482caca630d5b0a19e4dab Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 18:24:55 +0100
Subject: [PATCH 21/30] topology: use an array describing blocks for the main
build loop
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 146 +++++++++++++++++++++++--------------------------
1 file changed, 67 insertions(+), 79 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 4e6cbbb08a1a..ec1af42ddf9b 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -258,93 +258,81 @@ static ssize_t write_manifest_data(snd_tplg_t *tplg)
int tplg_write_data(snd_tplg_t *tplg)
{
+ struct wtable {
+ const char *name;
+ struct list_head *list;
+ int type;
+ } *wptr, wtable[] = {
+ {
+ .name = "control mixer elements",
+ .list = &tplg->mixer_list,
+ .type = SND_TPLG_TYPE_MIXER,
+ },
+ {
+ .name = "control enum elements",
+ .list = &tplg->enum_list,
+ .type = SND_TPLG_TYPE_ENUM,
+ },
+ {
+ .name = "control extended (bytes) elements",
+ .list = &tplg->bytes_ext_list,
+ .type = SND_TPLG_TYPE_BYTES,
+ },
+ {
+ .name = "dapm widget elements",
+ .list = &tplg->widget_list,
+ .type = SND_TPLG_TYPE_DAPM_WIDGET,
+ },
+ {
+ .name = "pcm elements",
+ .list = &tplg->pcm_list,
+ .type = SND_TPLG_TYPE_PCM,
+ },
+ {
+ .name = "physical dai elements",
+ .list = &tplg->dai_list,
+ .type = SND_TPLG_TYPE_DAI,
+ },
+ {
+ .name = "be elements",
+ .list = &tplg->be_list,
+ .type = SND_TPLG_TYPE_BE,
+ },
+ {
+ .name = "cc elements",
+ .list = &tplg->cc_list,
+ .type = SND_TPLG_TYPE_CC,
+ },
+ {
+ .name = "route (dapm graph) elements",
+ .list = &tplg->route_list,
+ .type = SND_TPLG_TYPE_DAPM_GRAPH,
+ },
+ {
+ .name = "private data elements",
+ .list = &tplg->pdata_list,
+ .type = SND_TPLG_TYPE_DATA,
+ },
+ };
+
ssize_t ret;
+ unsigned int index;
/* write manifest */
ret = write_manifest_data(tplg);
if (ret < 0) {
- SNDERR("failed to write manifest %zd\n", ret);
- return ret;
- }
-
- /* write mixer elems. */
- ret = write_block(tplg, &tplg->mixer_list,
- SND_TPLG_TYPE_MIXER);
- if (ret < 0) {
- SNDERR("failed to write control elems %zd\n", ret);
- return ret;
- }
-
- /* write enum control elems. */
- ret = write_block(tplg, &tplg->enum_list,
- SND_TPLG_TYPE_ENUM);
- if (ret < 0) {
- SNDERR("failed to write control elems %zd\n", ret);
- return ret;
- }
-
- /* write bytes extended control elems. */
- ret = write_block(tplg, &tplg->bytes_ext_list,
- SND_TPLG_TYPE_BYTES);
- if (ret < 0) {
- SNDERR("failed to write control elems %zd\n", ret);
- return ret;
- }
-
- /* write widget elems */
- ret = write_block(tplg, &tplg->widget_list,
- SND_TPLG_TYPE_DAPM_WIDGET);
- if (ret < 0) {
- SNDERR("failed to write widget elems %zd\n", ret);
- return ret;
- }
-
- /* write pcm elems */
- ret = write_block(tplg, &tplg->pcm_list,
- SND_TPLG_TYPE_PCM);
- if (ret < 0) {
- SNDERR("failed to write pcm elems %zd\n", ret);
- return ret;
- }
-
- /* write physical dai elems */
- ret = write_block(tplg, &tplg->dai_list,
- SND_TPLG_TYPE_DAI);
- if (ret < 0) {
- SNDERR("failed to write physical dai elems %zd\n", ret);
- return ret;
- }
-
- /* write be elems */
- ret = write_block(tplg, &tplg->be_list,
- SND_TPLG_TYPE_BE);
- if (ret < 0) {
- SNDERR("failed to write be elems %zd\n", ret);
- return ret;
- }
-
- /* write cc elems */
- ret = write_block(tplg, &tplg->cc_list,
- SND_TPLG_TYPE_CC);
- if (ret < 0) {
- SNDERR("failed to write cc elems %zd\n", ret);
- return ret;
- }
-
- /* write route elems */
- ret = write_block(tplg, &tplg->route_list,
- SND_TPLG_TYPE_DAPM_GRAPH);
- if (ret < 0) {
- SNDERR("failed to write graph elems %zd\n", ret);
+ SNDERR("failed to write manifest %d\n", ret);
return ret;
}
- /* write private data */
- ret = write_block(tplg, &tplg->pdata_list,
- SND_TPLG_TYPE_DATA);
- if (ret < 0) {
- SNDERR("failed to write private data %zd\n", ret);
- return ret;
+ /* write all blocks */
+ for (index = 0; index < ARRAY_SIZE(wtable); index++) {
+ wptr = &wtable[index];
+ ret = write_block(tplg, wptr->list, wptr->type);
+ if (ret < 0) {
+ SNDERR("failed to write %s: %s\n", wptr->name, snd_strerror(-ret));
+ return ret;
+ }
}
return 0;
--
2.16.4

View File

@ -1,49 +0,0 @@
From f1f5b48d0cfbce0cc6400daba0020d9385d6645e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 18:26:20 +0100
Subject: [PATCH 22/30] topology: use size_t for calc_block_size()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index ec1af42ddf9b..bbee71d67e94 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -163,11 +163,11 @@ static int write_elem_block(snd_tplg_t *tplg,
return 0;
}
-static int calc_block_size(struct list_head *base)
+static size_t calc_block_size(struct list_head *base)
{
struct list_head *pos;
struct tplg_elem *elem;
- int size = 0;
+ size_t size = 0;
list_for_each(pos, base) {
@@ -185,14 +185,14 @@ static int calc_block_size(struct list_head *base)
static int write_block(snd_tplg_t *tplg, struct list_head *base, int type)
{
- int size;
+ size_t size;
/* calculate the block size in bytes for all elems in this list */
size = calc_block_size(base);
- if (size <= 0)
+ if (size == 0)
return size;
- verbose(tplg, " block size for type %d is %d\n", type, size);
+ verbose(tplg, " block size for type %d is %zd\n", type, size);
/* write each elem for this block */
switch (type) {
--
2.16.4

View File

@ -1,178 +0,0 @@
From 4dcceb5f866deda09e971b1c31d46403c3bd8e9e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 18:49:29 +0100
Subject: [PATCH 23/30] topology: merge write_block to tplg_write_data
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 95 ++++++++++++++++++--------------------------------
1 file changed, 33 insertions(+), 62 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index bbee71d67e94..f530fcd853c4 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -183,56 +183,6 @@ static size_t calc_block_size(struct list_head *base)
return size;
}
-static int write_block(snd_tplg_t *tplg, struct list_head *base, int type)
-{
- size_t size;
-
- /* calculate the block size in bytes for all elems in this list */
- size = calc_block_size(base);
- if (size == 0)
- return size;
-
- verbose(tplg, " block size for type %d is %zd\n", type, size);
-
- /* write each elem for this block */
- switch (type) {
- case SND_TPLG_TYPE_MIXER:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_MIXER, "mixer");
- case SND_TPLG_TYPE_BYTES:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_BYTES, "bytes");
- case SND_TPLG_TYPE_ENUM:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_ENUM, "enum");
- case SND_TPLG_TYPE_DAPM_GRAPH:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_DAPM_GRAPH, "route");
- case SND_TPLG_TYPE_DAPM_WIDGET:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_DAPM_WIDGET, "widget");
- case SND_TPLG_TYPE_PCM:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_PCM, "pcm");
- case SND_TPLG_TYPE_BE:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_BACKEND_LINK, "be");
- case SND_TPLG_TYPE_CC:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_CODEC_LINK, "cc");
- case SND_TPLG_TYPE_DATA:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_PDATA, "data");
- case SND_TPLG_TYPE_DAI:
- return write_elem_block(tplg, base, size,
- SND_SOC_TPLG_TYPE_DAI, "dai");
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
/* write the manifest including its private data */
static ssize_t write_manifest_data(snd_tplg_t *tplg)
{
@@ -262,60 +212,72 @@ int tplg_write_data(snd_tplg_t *tplg)
const char *name;
struct list_head *list;
int type;
+ int tsoc;
} *wptr, wtable[] = {
{
- .name = "control mixer elements",
+ .name = "control mixer",
.list = &tplg->mixer_list,
.type = SND_TPLG_TYPE_MIXER,
+ .tsoc = SND_SOC_TPLG_TYPE_MIXER,
},
{
- .name = "control enum elements",
+ .name = "control enum",
.list = &tplg->enum_list,
.type = SND_TPLG_TYPE_ENUM,
+ .tsoc = SND_SOC_TPLG_TYPE_ENUM,
},
{
- .name = "control extended (bytes) elements",
+ .name = "control extended (bytes)",
.list = &tplg->bytes_ext_list,
.type = SND_TPLG_TYPE_BYTES,
+ .tsoc = SND_SOC_TPLG_TYPE_BYTES,
},
{
- .name = "dapm widget elements",
+ .name = "dapm widget",
.list = &tplg->widget_list,
.type = SND_TPLG_TYPE_DAPM_WIDGET,
+ .tsoc = SND_SOC_TPLG_TYPE_DAPM_WIDGET,
},
{
- .name = "pcm elements",
+ .name = "pcm",
.list = &tplg->pcm_list,
.type = SND_TPLG_TYPE_PCM,
+ .tsoc = SND_SOC_TPLG_TYPE_PCM,
},
{
- .name = "physical dai elements",
+ .name = "physical dai",
.list = &tplg->dai_list,
.type = SND_TPLG_TYPE_DAI,
+ .tsoc = SND_SOC_TPLG_TYPE_DAI,
},
{
- .name = "be elements",
+ .name = "be",
.list = &tplg->be_list,
.type = SND_TPLG_TYPE_BE,
+ .tsoc = SND_SOC_TPLG_TYPE_BACKEND_LINK,
},
{
- .name = "cc elements",
+ .name = "cc",
.list = &tplg->cc_list,
.type = SND_TPLG_TYPE_CC,
+ .tsoc = SND_SOC_TPLG_TYPE_CODEC_LINK,
},
{
- .name = "route (dapm graph) elements",
+ .name = "route (dapm graph)",
.list = &tplg->route_list,
.type = SND_TPLG_TYPE_DAPM_GRAPH,
+ .tsoc = SND_SOC_TPLG_TYPE_DAPM_GRAPH,
},
{
- .name = "private data elements",
+ .name = "private data",
.list = &tplg->pdata_list,
.type = SND_TPLG_TYPE_DATA,
+ .tsoc = SND_SOC_TPLG_TYPE_PDATA,
},
};
ssize_t ret;
+ size_t size;
unsigned int index;
/* write manifest */
@@ -328,9 +290,18 @@ int tplg_write_data(snd_tplg_t *tplg)
/* write all blocks */
for (index = 0; index < ARRAY_SIZE(wtable); index++) {
wptr = &wtable[index];
- ret = write_block(tplg, wptr->list, wptr->type);
+ /* calculate the block size in bytes for all elems in this list */
+ size = calc_block_size(wptr->list);
+ if (size == 0)
+ continue;
+ verbose(tplg, " block size for type %s (%d:%d) is %zd\n",
+ wptr->name, wptr->type,
+ wptr->tsoc, size);
+ ret = write_elem_block(tplg, wptr->list, size,
+ wptr->tsoc, wptr->name);
if (ret < 0) {
- SNDERR("failed to write %s: %s\n", wptr->name, snd_strerror(-ret));
+ SNDERR("failed to write %s elements: %s\n",
+ wptr->name, snd_strerror(-ret));
return ret;
}
}
--
2.16.4

View File

@ -1,81 +0,0 @@
From c9e9ee3c40e9f50889f2bb4065c4556184998e8f Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 18:53:41 +0100
Subject: [PATCH 24/30] topology: make vebose output more nice
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index f530fcd853c4..1a22a453695a 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -29,7 +29,7 @@ static void verbose(snd_tplg_t *tplg, const char *fmt, ...)
return;
va_start(va, fmt);
- fprintf(stdout, "0x%6.6zx/%6.6zd -", tplg->out_pos, tplg->out_pos);
+ fprintf(stdout, "0x%6.6zx/%6.6zd - ", tplg->out_pos, tplg->out_pos);
vfprintf(stdout, fmt, va);
va_end(va);
}
@@ -80,7 +80,7 @@ static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
return -EINVAL;
}
- verbose(tplg, " header index %d type %d count %d size 0x%lx/%ld vendor %d "
+ verbose(tplg, "header index %d type %d count %d size 0x%lx/%ld vendor %d "
"version %d\n", index, type, count,
(long unsigned int)payload_size, (long int)payload_size,
vendor_type, version);
@@ -128,10 +128,10 @@ static int write_elem_block(snd_tplg_t *tplg,
continue;
if (elem->type != SND_TPLG_TYPE_DAPM_GRAPH)
- verbose(tplg, " %s '%s': write %d bytes\n",
+ verbose(tplg, "%s '%s': write %d bytes\n",
obj_name, elem->id, elem->size);
else
- verbose(tplg, " %s '%s -> %s -> %s': write %d bytes\n",
+ verbose(tplg, "%s '%s -> %s -> %s': write %d bytes\n",
obj_name, elem->route->source,
elem->route->control,
elem->route->sink, elem->size);
@@ -197,10 +197,10 @@ static ssize_t write_manifest_data(snd_tplg_t *tplg)
return ret;
}
- verbose(tplg, "manifest : write %d bytes\n", sizeof(tplg->manifest));
+ verbose(tplg, "manifest: write %d bytes\n", sizeof(tplg->manifest));
ret = twrite(tplg, &tplg->manifest, sizeof(tplg->manifest));
if (ret >= 0) {
- verbose(tplg, "manifest : write %d priv bytes\n", tplg->manifest.priv.size);
+ verbose(tplg, "manifest: write %d priv bytes\n", tplg->manifest.priv.size);
ret = twrite(tplg, tplg->manifest_pdata, tplg->manifest.priv.size);
}
return ret;
@@ -294,9 +294,9 @@ int tplg_write_data(snd_tplg_t *tplg)
size = calc_block_size(wptr->list);
if (size == 0)
continue;
- verbose(tplg, " block size for type %s (%d:%d) is %zd\n",
+ verbose(tplg, "block size for type %s (%d:%d) is 0x%zx/%zd\n",
wptr->name, wptr->type,
- wptr->tsoc, size);
+ wptr->tsoc, size, size);
ret = write_elem_block(tplg, wptr->list, size,
wptr->tsoc, wptr->name);
if (ret < 0) {
@@ -306,5 +306,7 @@ int tplg_write_data(snd_tplg_t *tplg)
}
}
+ verbose(tplg, "total size is 0x%zx/%zd\n", tplg->out_pos, tplg->out_pos);
+
return 0;
}
--
2.16.4

View File

@ -1,39 +0,0 @@
From 3b9e39dab5ebfb525b4437a644fe54569e419874 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 21:23:52 +0100
Subject: [PATCH 25/30] topology: use list_insert() macro in tplg_elem_insert()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/elem.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/topology/elem.c b/src/topology/elem.c
index a9d1d8547bd2..2066fad83774 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -131,7 +131,7 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id,
return NULL;
}
-/* insert a new element into list in the ascending order of index value*/
+/* insert a new element into list in the ascending order of index value */
static void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list)
{
struct list_head *pos, *p = &(elem_p->list);
@@ -142,10 +142,8 @@ static void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list)
if (elem_p->index < elem->index)
break;
}
- p->prev = pos->prev;
- pos->prev->next = p;
- pos->prev = p;
- p->next = pos;
+ /* insert item before pos */
+ list_insert(p, pos->prev, pos);
}
/* create a new common element and object */
--
2.16.4

View File

@ -1,81 +0,0 @@
From 0d6949b7f1f99bf3fcd5cce78483c10f9ca35264 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 21:52:13 +0100
Subject: [PATCH 26/30] topology: dapm - coding fixes
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/dapm.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 97c9695b9ebe..cd80a4c03d92 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -152,8 +152,7 @@ static int copy_dapm_control(struct tplg_elem *elem, struct tplg_elem *ref)
}
/* check referenced controls for a widget */
-static int tplg_build_widget(snd_tplg_t *tplg,
- struct tplg_elem *elem)
+static int tplg_build_widget(snd_tplg_t *tplg, struct tplg_elem *elem)
{
struct tplg_ref *ref;
struct list_head *base, *pos;
@@ -164,7 +163,7 @@ static int tplg_build_widget(snd_tplg_t *tplg,
/* A widget's private data sits before the embedded controls.
* So merge the private data blocks at first
*/
- list_for_each(pos, base) {
+ list_for_each(pos, base) {
ref = list_entry(pos, struct tplg_ref, list);
if (ref->type != SND_TPLG_TYPE_DATA)
@@ -314,7 +313,7 @@ int tplg_build_routes(snd_tplg_t *tplg)
return 0;
}
-struct tplg_elem* tplg_elem_new_route(snd_tplg_t *tplg)
+struct tplg_elem *tplg_elem_new_route(snd_tplg_t *tplg)
{
struct tplg_elem *elem;
struct snd_soc_tplg_dapm_graph_elem *line;
@@ -342,7 +341,7 @@ struct tplg_elem* tplg_elem_new_route(snd_tplg_t *tplg)
/* line is defined as '"source, control, sink"' */
static int tplg_parse_line(const char *text,
- struct snd_soc_tplg_dapm_graph_elem *line)
+ struct snd_soc_tplg_dapm_graph_elem *line)
{
char buf[LINE_SIZE];
unsigned int len, i;
@@ -422,7 +421,7 @@ static int tplg_parse_routes(snd_tplg_t *tplg, snd_config_t *cfg, int index)
}
int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -472,7 +471,7 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
/* DAPM Widget */
int tplg_parse_dapm_widget(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+ snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_dapm_widget *widget;
struct tplg_elem *elem;
@@ -645,7 +644,7 @@ int tplg_add_route(snd_tplg_t *tplg, struct snd_tplg_graph_elem *t)
snd_strlcpy(line->source, t->src, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
if (t->ctl)
snd_strlcpy(line->control, t->ctl,
- SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
snd_strlcpy(line->sink, t->sink, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
return 0;
--
2.16.4

View File

@ -1,103 +0,0 @@
From 2b50b594dcbf69f8dcc6e8cf673748f7063c3c17 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 21:56:58 +0100
Subject: [PATCH 27/30] topology: dapm - merge identical index blocks like for
other elems
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/dapm.c | 14 +++++++-------
src/topology/elem.c | 2 +-
src/topology/tplg_local.h | 1 +
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index cd80a4c03d92..ce46913192df 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -313,7 +313,7 @@ int tplg_build_routes(snd_tplg_t *tplg)
return 0;
}
-struct tplg_elem *tplg_elem_new_route(snd_tplg_t *tplg)
+struct tplg_elem *tplg_elem_new_route(snd_tplg_t *tplg, int index)
{
struct tplg_elem *elem;
struct snd_soc_tplg_dapm_graph_elem *line;
@@ -322,7 +322,8 @@ struct tplg_elem *tplg_elem_new_route(snd_tplg_t *tplg)
if (!elem)
return NULL;
- list_add_tail(&elem->list, &tplg->route_list);
+ elem->index = index;
+ tplg_elem_insert(elem, &tplg->route_list);
strcpy(elem->id, "line");
elem->type = SND_TPLG_TYPE_DAPM_GRAPH;
elem->size = sizeof(*line);
@@ -403,10 +404,9 @@ static int tplg_parse_routes(snd_tplg_t *tplg, snd_config_t *cfg, int index)
if (snd_config_get_string(n, &val) < 0)
continue;
- elem = tplg_elem_new_route(tplg);
+ elem = tplg_elem_new_route(tplg, index);
if (!elem)
return -ENOMEM;
- elem->index = index;
line = elem->route;
err = tplg_parse_line(val, line);
@@ -628,7 +628,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return 0;
}
-int tplg_add_route(snd_tplg_t *tplg, struct snd_tplg_graph_elem *t)
+int tplg_add_route(snd_tplg_t *tplg, struct snd_tplg_graph_elem *t, int index)
{
struct tplg_elem *elem;
struct snd_soc_tplg_dapm_graph_elem *line;
@@ -636,7 +636,7 @@ int tplg_add_route(snd_tplg_t *tplg, struct snd_tplg_graph_elem *t)
if (!t->src || !t->sink)
return -EINVAL;
- elem = tplg_elem_new_route(tplg);
+ elem = tplg_elem_new_route(tplg, index);
if (!elem)
return -ENOMEM;
@@ -656,7 +656,7 @@ int tplg_add_graph_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
int i, ret;
for (i = 0; i < gt->count; i++) {
- ret = tplg_add_route(tplg, gt->elem + i);
+ ret = tplg_add_route(tplg, gt->elem + i, t->index);
if (ret < 0)
return ret;
}
diff --git a/src/topology/elem.c b/src/topology/elem.c
index 2066fad83774..140cdd327994 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -132,7 +132,7 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id,
}
/* insert a new element into list in the ascending order of index value */
-static void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list)
+void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list)
{
struct list_head *pos, *p = &(elem_p->list);
struct tplg_elem *elem;
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 7b8abcdefbcf..11efce6d580c 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -273,6 +273,7 @@ int tplg_ref_add_elem(struct tplg_elem *elem, struct tplg_elem *elem_ref);
struct tplg_elem *tplg_elem_new(void);
void tplg_elem_free(struct tplg_elem *elem);
void tplg_elem_free_list(struct list_head *base);
+void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list);
struct tplg_elem *tplg_elem_lookup(struct list_head *base,
const char* id,
unsigned int type,
--
2.16.4

View File

@ -1,228 +0,0 @@
From 780f17126aa8d54fc09694cbf652d4135eb731c0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Dec 2019 22:07:46 +0100
Subject: [PATCH 28/30] topology: more coding fixes
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/channel.c | 4 ++--
src/topology/ctl.c | 15 ++++++++-------
src/topology/elem.c | 6 ++++--
src/topology/ops.c | 6 +++---
src/topology/pcm.c | 20 ++++++++++++--------
src/topology/text.c | 2 +-
6 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/src/topology/channel.c b/src/topology/channel.c
index 8516b23f302d..60f7e219a674 100644
--- a/src/topology/channel.c
+++ b/src/topology/channel.c
@@ -74,8 +74,8 @@ static int lookup_channel(const char *c)
}
/* Parse a channel mapping. */
-int tplg_parse_channel(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private)
+int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
+ void *private)
{
snd_config_iterator_t i, next;
snd_config_t *n;
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index a096252263a5..1db0b16eac95 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -46,7 +46,7 @@ static const struct ctl_access_elem ctl_access[] = {
/* find CTL access strings and conver to values */
static int parse_access_values(snd_config_t *cfg,
- struct snd_soc_tplg_ctl_hdr *hdr)
+ struct snd_soc_tplg_ctl_hdr *hdr)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -77,7 +77,7 @@ static int parse_access_values(snd_config_t *cfg,
/* Parse Access */
int parse_access(snd_config_t *cfg,
- struct snd_soc_tplg_ctl_hdr *hdr)
+ struct snd_soc_tplg_ctl_hdr *hdr)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -118,7 +118,7 @@ static int copy_tlv(struct tplg_elem *elem, struct tplg_elem *ref)
/* check referenced TLV for a mixer control */
static int tplg_build_mixer_control(snd_tplg_t *tplg,
- struct tplg_elem *elem)
+ struct tplg_elem *elem)
{
struct tplg_ref *ref;
struct list_head *base, *pos;
@@ -157,7 +157,7 @@ static int tplg_build_mixer_control(snd_tplg_t *tplg,
}
static void copy_enum_texts(struct tplg_elem *enum_elem,
- struct tplg_elem *ref_elem)
+ struct tplg_elem *ref_elem)
{
struct snd_soc_tplg_enum_control *ec = enum_elem->enum_ctrl;
struct tplg_texts *texts = ref_elem->texts;
@@ -169,7 +169,7 @@ static void copy_enum_texts(struct tplg_elem *enum_elem,
/* check referenced text for a enum control */
static int tplg_build_enum_control(snd_tplg_t *tplg,
- struct tplg_elem *elem)
+ struct tplg_elem *elem)
{
struct tplg_ref *ref;
struct list_head *base, *pos;
@@ -331,7 +331,7 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
/* Parse TLV */
int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -364,7 +364,8 @@ int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg,
/* Parse Control Bytes */
int tplg_parse_control_bytes(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+ snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_bytes_control *be;
struct tplg_elem *elem;
diff --git a/src/topology/elem.c b/src/topology/elem.c
index 140cdd327994..d8618cc9d983 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -107,7 +107,7 @@ void tplg_elem_free_list(struct list_head *base)
}
struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id,
- unsigned int type, int index)
+ unsigned int type, int index)
{
struct list_head *pos;
struct tplg_elem *elem;
@@ -148,7 +148,9 @@ void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list)
/* create a new common element and object */
struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
- snd_config_t *cfg, const char *name, enum snd_tplg_type type)
+ snd_config_t *cfg,
+ const char *name,
+ enum snd_tplg_type type)
{
struct tplg_elem *elem;
const char *id, *val = NULL;
diff --git a/src/topology/ops.c b/src/topology/ops.c
index 6f8dc1ff310f..0f4295a2e50c 100644
--- a/src/topology/ops.c
+++ b/src/topology/ops.c
@@ -48,8 +48,8 @@ static int lookup_ops(const char *c)
/* Parse Control operations. Ops can come from standard names above or
* bespoke driver controls with numbers >= 256
*/
-int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
- snd_config_t *cfg, void *private)
+int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED, snd_config_t *cfg,
+ void *private)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -88,7 +88,7 @@ int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
* bespoke driver controls with numbers >= 256
*/
int tplg_parse_ext_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
- snd_config_t *cfg, void *private)
+ snd_config_t *cfg, void *private)
{
snd_config_iterator_t i, next;
snd_config_t *n;
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 553fd822031b..98a8df979e24 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -63,7 +63,8 @@ struct tplg_elem *lookup_pcm_dai_stream(struct list_head *base, const char* id)
/* copy referenced caps to the parent (pcm or be dai) */
static void copy_stream_caps(const char *id ATTRIBUTE_UNUSED,
- struct snd_soc_tplg_stream_caps *caps, struct tplg_elem *ref_elem)
+ struct snd_soc_tplg_stream_caps *caps,
+ struct tplg_elem *ref_elem)
{
struct snd_soc_tplg_stream_caps *ref_caps = ref_elem->stream_caps;
@@ -75,7 +76,8 @@ static void copy_stream_caps(const char *id ATTRIBUTE_UNUSED,
/* find and copy the referenced stream caps */
static int tplg_build_stream_caps(snd_tplg_t *tplg,
- const char *id, int index, struct snd_soc_tplg_stream_caps *caps)
+ const char *id, int index,
+ struct snd_soc_tplg_stream_caps *caps)
{
struct tplg_elem *ref_elem = NULL;
unsigned int i;
@@ -207,7 +209,8 @@ int tplg_build_dais(snd_tplg_t *tplg, unsigned int type)
}
static int tplg_build_stream_cfg(snd_tplg_t *tplg,
- struct snd_soc_tplg_stream *stream, int num_streams, int index)
+ struct snd_soc_tplg_stream *stream,
+ int num_streams, int index)
{
struct snd_soc_tplg_stream *strm;
struct tplg_elem *ref_elem;
@@ -367,7 +370,8 @@ static int split_rate(struct snd_soc_tplg_stream_caps *caps, char *str)
/* Parse pcm stream capabilities */
int tplg_parse_stream_caps(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+ snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_stream_caps *sc;
struct tplg_elem *elem;
@@ -637,8 +641,8 @@ static int parse_flag(snd_config_t *n, unsigned int mask_in,
}
/* Parse PCM (for front end DAI & DAI link) in text conf file */
-int tplg_parse_pcm(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_pcm *pcm;
struct tplg_elem *elem;
@@ -746,8 +750,8 @@ int tplg_parse_pcm(snd_tplg_t *tplg,
}
/* Parse physical DAI */
-int tplg_parse_dai(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+int tplg_parse_dai(snd_tplg_t *tplg, snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_dai *dai;
struct tplg_elem *elem;
diff --git a/src/topology/text.c b/src/topology/text.c
index 72647fe04955..f301a4ded727 100644
--- a/src/topology/text.c
+++ b/src/topology/text.c
@@ -59,7 +59,7 @@ static int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem)
/* Parse Text data */
int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
--
2.16.4

File diff suppressed because it is too large Load Diff

View File

@ -1,32 +0,0 @@
From 75584fe660880b332fbf60dd7968e2ed8b49a38b Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 20 Dec 2019 16:12:50 +0100
Subject: [PATCH 30/30] type_compat: Add missing __s64 and __u64 definitions
for non-Linux
Just for the case without Linux-compatible definitions.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/type_compat.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/sound/type_compat.h b/include/sound/type_compat.h
index d4790c1f0e64..5b765f447e2e 100644
--- a/include/sound/type_compat.h
+++ b/include/sound/type_compat.h
@@ -9,9 +9,11 @@
typedef uint8_t __u8;
typedef uint16_t __u16;
typedef uint32_t __u32;
+typedef uint64_t __u64;
typedef int8_t __s8;
typedef int16_t __s16;
typedef int32_t __s32;
+typedef int64_t __s64;
#include <endian.h>
#include <byteswap.h>
--
2.16.4

View File

@ -1,133 +0,0 @@
From 59792f467b38d6a4c4dffdb30528f7fb03d23d96 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 20 Dec 2019 17:12:37 +0100
Subject: [PATCH alsa-lib] uapi: Move typedefs from uapi to sound/*
For keeping uapi/*.h cleaner.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/emu10k1.h | 9 +++++++++
include/sound/hdsp.h | 10 ++++++++++
include/sound/hdspm.h | 8 ++++++++
include/sound/sb16_csp.h | 4 ++++
include/sound/uapi/emu10k1.h | 10 ----------
include/sound/uapi/hdsp.h | 9 ---------
include/sound/uapi/hdspm.h | 8 --------
7 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
index f06ecee51c2b..0832f95bd995 100644
--- a/include/sound/emu10k1.h
+++ b/include/sound/emu10k1.h
@@ -1,2 +1,11 @@
#include <alsa/sound/type_compat.h>
#include <alsa/sound/uapi/emu10k1.h>
+#ifndef __emu10k1_type_defined
+#define __emu10k1_type_defined
+typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
+typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
+typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
+typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
+typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
+typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
+#endif
diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
index 78fb745b607a..e8f931569548 100644
--- a/include/sound/hdsp.h
+++ b/include/sound/hdsp.h
@@ -1,2 +1,12 @@
#include <alsa/sound/type_compat.h>
#include <alsa/sound/uapi/hdsp.h>
+#ifndef __hdsp_type_defined
+#define __hdsp_type_defined
+typedef enum HDSP_IO_Type HDSP_IO_Type;
+typedef struct hdsp_peak_rms hdsp_peak_rms_t;
+typedef struct hdsp_config_info hdsp_config_info_t;
+typedef struct hdsp_firmware hdsp_firmware_t;
+typedef struct hdsp_version hdsp_version_t;
+typedef struct hdsp_mixer hdsp_mixer_t;
+typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
+#endif
diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h
index af6d19eda87f..d9095d9f10bb 100644
--- a/include/sound/hdspm.h
+++ b/include/sound/hdspm.h
@@ -1,2 +1,10 @@
#include <alsa/sound/type_compat.h>
#include <alsa/sound/uapi/hdspm.h>
+#ifndef __hdspm_type_defined
+#define __hdspm_type_defined
+typedef struct hdspm_peak_rms hdspm_peak_rms_t;
+typedef struct hdspm_config_info hdspm_config_info_t;
+typedef struct hdspm_version hdspm_version_t;
+typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
+typedef struct hdspm_mixer hdspm_mixer_t;
+#endif
diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h
index 24121fcbd888..fd02bc565e21 100644
--- a/include/sound/sb16_csp.h
+++ b/include/sound/sb16_csp.h
@@ -1 +1,5 @@
#include <alsa/sound/uapi/sb16_csp.h>
+#ifndef __sb16_csp_type_defined
+#define __sb16_csp_type_defined
+typedef struct snd_sb_csp_microcode snd_sb_csp_microcode_t;
+#endif
diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
index c1150e4d0231..6bcd76f64c1c 100644
--- a/include/sound/uapi/emu10k1.h
+++ b/include/sound/uapi/emu10k1.h
@@ -382,14 +382,4 @@ struct snd_emu10k1_fx8010_pcm_rec {
#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
-#ifndef __KERNEL__
-/* typedefs for compatibility to user-space */
-typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
-typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
-typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
-typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
-typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
-typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
-#endif
-
#endif /* _UAPI__SOUND_EMU10K1_H */
diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
index 88c92a3fb477..7ac2d3f2a9b3 100644
--- a/include/sound/uapi/hdsp.h
+++ b/include/sound/uapi/hdsp.h
@@ -97,13 +97,4 @@ struct hdsp_9632_aeb {
#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
-/* typedefs for compatibility to user-space */
-typedef enum HDSP_IO_Type HDSP_IO_Type;
-typedef struct hdsp_peak_rms hdsp_peak_rms_t;
-typedef struct hdsp_config_info hdsp_config_info_t;
-typedef struct hdsp_firmware hdsp_firmware_t;
-typedef struct hdsp_version hdsp_version_t;
-typedef struct hdsp_mixer hdsp_mixer_t;
-typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
-
#endif /* __SOUND_HDSP_H */
diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
index 2d91f90eb5e1..3fbfd9dc5f51 100644
--- a/include/sound/uapi/hdspm.h
+++ b/include/sound/uapi/hdspm.h
@@ -219,12 +219,4 @@ struct hdspm_mixer_ioctl {
/* use indirect access due to the limit of ioctl bit size */
#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
-/* typedefs for compatibility to user-space */
-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
-typedef struct hdspm_config_info hdspm_config_info_t;
-typedef struct hdspm_version hdspm_version_t;
-typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
-typedef struct hdspm_mixer hdspm_mixer_t;
-
-
#endif
--
2.16.4

View File

@ -1,128 +0,0 @@
From 9e2bbccfcc8069a676519149a280f20c1e05f0ac Mon Sep 17 00:00:00 2001
From: David Ward <david.ward@ll.mit.edu>
Date: Fri, 3 Jan 2020 13:05:51 -0500
Subject: [PATCH 32/63] Update the attributes.m4 macro file from xine
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This file was imported from the xine project. Update it to the current
revision, which resolves the "no AC_LANG_SOURCE call detected in body"
warnings with Autoconf 2.68 or later.
Cc: Diego Pettenò <flameeyes@gmail.com>
Signed-off-by: David Ward <david.ward@ll.mit.edu>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
m4/attributes.m4 | 33 ++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/m4/attributes.m4 b/m4/attributes.m4
index e86456a468e5..3d9c256a09a2 100644
--- a/m4/attributes.m4
+++ b/m4/attributes.m4
@@ -1,6 +1,6 @@
dnl Macros to check the presence of generic (non-typed) symbols.
-dnl Copyright (c) 2006-2007 Diego Pettenò <flameeyes@gmail.com>
-dnl Copyright (c) 2006-2007 xine project
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ dnl License when using or distributing such scripts, even though portions
dnl of the text of the Macro appear in them. The GNU General Public
dnl License (GPL) does govern all other use of the material that
dnl constitutes the Autoconf Macro.
-dnl
+dnl
dnl This special exception to the GPL applies to versions of the
dnl Autoconf Macro released by this project. When you make and
dnl distribute a modified version of the Autoconf Macro, you may extend
@@ -39,7 +39,7 @@ AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [
AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]),
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $1"
- AC_COMPILE_IFELSE([int a;],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a;])],
[eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_cflags_$1])='no'"])
CFLAGS="$ac_save_CFLAGS"
@@ -71,7 +71,7 @@ AC_DEFUN([CC_CHECK_CFLAG_APPEND], [
)
AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
- [CFLAGS="$CFLAGS $1"; $2], [$3])
+ [CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3])
])
dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not])
@@ -89,7 +89,7 @@ AC_DEFUN([CC_CHECK_LDFLAGS], [
AS_TR_SH([cc_cv_ldflags_$1]),
[ac_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $1"
- AC_LINK_IFELSE([int main() { return 1; }],
+ AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])],
[eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_ldflags_$1])="])
LDFLAGS="$ac_save_LDFLAGS"
@@ -109,14 +109,21 @@ AC_DEFUN([CC_NOUNDEFINED], [
dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
dnl are requested, as different implementations are present; to avoid problems
dnl use -Wl,-z,defs only for those platform not behaving this way.
- *-freebsd*) ;;
+ dnl
+ dnl MinGW platforms: for libraries required -no-undefined,
+ dnl use it only for libraries in mingw32-w64
+
+ *-freebsd* | *-openbsd*) ;;
+ *-mingw*)
+ LDFLAGS_NOUNDEFINED="-no-undefined"
+ ;;
*)
dnl First of all check for the --no-undefined variant of GNU ld. This allows
dnl for a much more readable commandline, so that people can understand what
dnl it does without going to look for what the heck -z defs does.
- for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+ for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
- break
+ if test "x$LDFLAGS_NOUNDEFINED" = "x"; then break; fi
done
;;
esac
@@ -147,7 +154,7 @@ AC_DEFUN([CC_CHECK_ATTRIBUTE], [
AS_TR_SH([cc_cv_attribute_$1]),
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
- AC_COMPILE_IFELSE([$3],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
[eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
CFLAGS="$ac_save_CFLAGS"
@@ -257,7 +264,7 @@ AC_DEFUN([CC_FLAG_VISIBILITY], [
cc_cv_flag_visibility='yes',
cc_cv_flag_visibility='no')
CFLAGS="$cc_flag_visibility_save_CFLAGS"])
-
+
AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
[AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
[Define this if the compiler supports the -fvisibility flag])
@@ -295,11 +302,11 @@ AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
for cc_attribute_align_try in 64 32 16 8 4 2; do
- AC_COMPILE_IFELSE([
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
int main() {
static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
return c;
- }], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+ }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
done
CFLAGS="$ac_save_CFLAGS"
])
--
2.16.4

View File

@ -1,763 +0,0 @@
From f373bf1f6eea0f2037a7714e9b55aa65fa00b889 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 13:36:09 +0100
Subject: [PATCH 33/63] topology: avoid to use the atoi() directly when
expected
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/channel.c | 10 ++--
src/topology/ctl.c | 37 ++++++------
src/topology/dapm.c | 32 +++++-----
src/topology/data.c | 14 ++---
src/topology/elem.c | 9 ++-
src/topology/ops.c | 2 +-
src/topology/parser.c | 29 +++++++++
src/topology/pcm.c | 148 ++++++++++++++++++++--------------------------
src/topology/tplg_local.h | 2 +
9 files changed, 150 insertions(+), 133 deletions(-)
diff --git a/src/topology/channel.c b/src/topology/channel.c
index 60f7e219a674..4569eb31e0c5 100644
--- a/src/topology/channel.c
+++ b/src/topology/channel.c
@@ -80,8 +80,8 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
snd_config_iterator_t i, next;
snd_config_t *n;
struct snd_soc_tplg_channel *channel = private;
- const char *id, *value;
- int channel_id;
+ const char *id;
+ int channel_id, value;
if (tplg->channel_idx >= SND_SOC_TPLG_MAX_CHAN)
return -EINVAL;
@@ -109,13 +109,13 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
/* get value */
- if (snd_config_get_string(n, &value) < 0)
+ if (tplg_get_integer(n, &value, 0) < 0)
continue;
if (strcmp(id, "reg") == 0)
- channel->reg = atoi(value);
+ channel->reg = value;
else if (strcmp(id, "shift") == 0)
- channel->shift = atoi(value);
+ channel->shift = value;
tplg_dbg("\t\t%s = %s\n", id, value);
}
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 1db0b16eac95..e1896f46c576 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -286,7 +286,8 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
snd_config_t *n;
struct snd_soc_tplg_ctl_tlv *tplg_tlv;
struct snd_soc_tplg_tlv_dbscale *scale;
- const char *id = NULL, *value = NULL;
+ const char *id = NULL;
+ int val;
tplg_dbg(" scale: %s\n", elem->id);
@@ -310,18 +311,18 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
}
/* get value */
- if (snd_config_get_string(n, &value) < 0)
+ if (tplg_get_integer(n, &val, 0))
continue;
- tplg_dbg("\t%s = %s\n", id, value);
+ tplg_dbg("\t%s = %i\n", id, val);
/* get TLV data */
if (strcmp(id, "min") == 0)
- scale->min = atoi(value);
+ scale->min = val;
else if (strcmp(id, "step") == 0)
- scale->step = atoi(value);
+ scale->step = val;
else if (strcmp(id, "mute") == 0)
- scale->mute = atoi(value);
+ scale->mute = val;
else
SNDERR("error: unknown key %s\n", id);
}
@@ -372,7 +373,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id, *val = NULL;
- int err;
+ int err, ival;
bool access_set = false, tlv_set = false;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_BYTES);
@@ -398,37 +399,37 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
continue;
if (strcmp(id, "base") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- be->base = atoi(val);
+ be->base = ival;
tplg_dbg("\t%s: %d\n", id, be->base);
continue;
}
if (strcmp(id, "num_regs") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- be->num_regs = atoi(val);
+ be->num_regs = ival;
tplg_dbg("\t%s: %d\n", id, be->num_regs);
continue;
}
if (strcmp(id, "max") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- be->max = atoi(val);
+ be->max = ival;
tplg_dbg("\t%s: %d\n", id, be->max);
continue;
}
if (strcmp(id, "mask") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 16))
return -EINVAL;
- be->mask = strtol(val, NULL, 16);
+ be->mask = ival;
tplg_dbg("\t%s: %d\n", id, be->mask);
continue;
}
@@ -598,7 +599,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id, *val = NULL;
- int err, j;
+ int err, j, ival;
bool access_set = false, tlv_set = false;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_MIXER);
@@ -647,10 +648,10 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
}
if (strcmp(id, "max") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- mc->max = atoi(val);
+ mc->max = ival;
tplg_dbg("\t%s: %d\n", id, mc->max);
continue;
}
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index ce46913192df..c6fd793d0d72 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -426,7 +426,7 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
snd_config_iterator_t i, next;
snd_config_t *n;
int err;
- const char *graph_id, *val = NULL;
+ const char *graph_id;
int index = -1;
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
@@ -445,9 +445,10 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
}
if (strcmp(id, "index") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &index, 0))
+ return -EINVAL;
+ if (index < 0)
return -EINVAL;
- index = atoi(val);
}
if (strcmp(id, "lines") == 0) {
@@ -479,6 +480,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
snd_config_t *n;
const char *id, *val = NULL;
int widget_type, err;
+ int ival;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_DAPM_WIDGET);
if (!elem)
@@ -540,55 +542,55 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
}
if (strcmp(id, "shift") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->shift = atoi(val);
+ widget->shift = ival;
tplg_dbg("\t%s: %d\n", id, widget->shift);
continue;
}
if (strcmp(id, "reg") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->reg = atoi(val);
+ widget->reg = ival;
tplg_dbg("\t%s: %d\n", id, widget->reg);
continue;
}
if (strcmp(id, "invert") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->invert = atoi(val);
+ widget->invert = ival;
tplg_dbg("\t%s: %d\n", id, widget->invert);
continue;
}
if (strcmp(id, "subseq") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->subseq= atoi(val);
+ widget->subseq = ival;
tplg_dbg("\t%s: %d\n", id, widget->subseq);
continue;
}
if (strcmp(id, "event_type") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->event_type = atoi(val);
+ widget->event_type = ival;
tplg_dbg("\t%s: %d\n", id, widget->event_type);
continue;
}
if (strcmp(id, "event_flags") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- widget->event_flags = atoi(val);
+ widget->event_flags = ival;
tplg_dbg("\t%s: %d\n", id, widget->event_flags);
continue;
}
diff --git a/src/topology/data.c b/src/topology/data.c
index 729ce1f4c0b6..0edfe54f3383 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -800,10 +800,10 @@ int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
{
snd_config_iterator_t i, next;
snd_config_t *n;
- const char *id, *value;
+ const char *id;
struct tplg_elem *elem;
struct tplg_vendor_tokens *tokens;
- int num_tokens = 0;
+ int num_tokens = 0, value;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_TOKEN);
if (!elem)
@@ -830,12 +830,12 @@ int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
if (snd_config_get_id(n, &id) < 0)
continue;
- if (snd_config_get_string(n, &value) < 0)
+ if (tplg_get_integer(n, &value, 0))
continue;
snd_strlcpy(tokens->token[tokens->num_tokens].id, id,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tokens->token[tokens->num_tokens].value = atoi(value);
+ tokens->token[tokens->num_tokens].value = value;
tplg_dbg("\t\t %s : %d\n", tokens->token[tokens->num_tokens].id,
tokens->token[tokens->num_tokens].value);
tokens->num_tokens++;
@@ -1013,7 +1013,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id, *val = NULL;
- int err = 0;
+ int err = 0, ival;
struct tplg_elem *elem;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_DATA);
@@ -1071,10 +1071,10 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
}
if (strcmp(id, "type") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (tplg_get_integer(n, &ival, 0))
return -EINVAL;
- elem->vendor_type = atoi(val);
+ elem->vendor_type = ival;
tplg_dbg("\t%s: %d\n", id, elem->index);
continue;
}
diff --git a/src/topology/elem.c b/src/topology/elem.c
index d8618cc9d983..f2076f7958aa 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -153,7 +153,7 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
enum snd_tplg_type type)
{
struct tplg_elem *elem;
- const char *id, *val = NULL;
+ const char *id;
int obj_size = 0;
void *obj;
snd_config_iterator_t i, next;
@@ -178,11 +178,14 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
if (snd_config_get_id(n, &id))
continue;
if (strcmp(id, "index") == 0) {
- if (snd_config_get_string(n, &val) < 0) {
+ if (tplg_get_integer(n, &elem->index, 0)) {
+ free(elem);
+ return NULL;
+ }
+ if (elem->index < 0) {
free(elem);
return NULL;
}
- elem->index = atoi(val);
}
}
} else if (name != NULL)
diff --git a/src/topology/ops.c b/src/topology/ops.c
index 0f4295a2e50c..073acdcb1453 100644
--- a/src/topology/ops.c
+++ b/src/topology/ops.c
@@ -42,7 +42,7 @@ static int lookup_ops(const char *c)
}
/* cant find string name in our table so we use its ID number */
- return atoi(c);
+ return strtol(c, NULL, 0);
}
/* Parse Control operations. Ops can come from standard names above or
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 5940692da2e2..7e657809307d 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -21,6 +21,35 @@
#include "list.h"
#include "tplg_local.h"
+/*
+ * Get integer value
+ */
+int tplg_get_integer(snd_config_t *n, int *val, int base)
+{
+ const char *str;
+ long lval;
+ int err;
+
+ switch (snd_config_get_type(n)) {
+ case SND_CONFIG_TYPE_INTEGER:
+ err = snd_config_get_integer(n, &lval);
+ if (err < 0)
+ return err;
+ if (lval < INT_MIN || lval > INT_MAX)
+ return -EINVAL;
+ *val = lval;
+ return err;
+ case SND_CONFIG_TYPE_STRING:
+ err = snd_config_get_string(n, &str);
+ if (err < 0)
+ return err;
+ *val = strtol(str, NULL, base);
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
/*
* Parse compound
*/
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 98a8df979e24..d6c52b4752ee 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -368,6 +368,24 @@ static int split_rate(struct snd_soc_tplg_stream_caps *caps, char *str)
return 0;
}
+static int parse_unsigned(snd_config_t *n, unsigned int *dst)
+{
+ int ival;
+
+ if (tplg_get_integer(n, &ival, 0) < 0)
+ return -EINVAL;
+
+ *dst = ival;
+#if TPLG_DEBUG
+ {
+ const char *id;
+ if (snd_config_get_id(n, &id) >= 0)
+ tplg_dbg("\t\t%s: %d\n", id, *dst);
+ }
+#endif
+ return 0;
+}
+
/* Parse pcm stream capabilities */
int tplg_parse_stream_caps(snd_tplg_t *tplg,
snd_config_t *cfg,
@@ -402,10 +420,10 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
if (id[0] == '#')
continue;
- if (snd_config_get_string(n, &val) < 0)
- return -EINVAL;
-
if (strcmp(id, "formats") == 0) {
+ if (snd_config_get_string(n, &val) < 0)
+ return -EINVAL;
+
s = strdup(val);
if (s == NULL)
return -ENOMEM;
@@ -421,6 +439,9 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
}
if (strcmp(id, "rates") == 0) {
+ if (snd_config_get_string(n, &val) < 0)
+ return -EINVAL;
+
s = strdup(val);
if (!s)
return -ENOMEM;
@@ -436,68 +457,68 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
}
if (strcmp(id, "rate_min") == 0) {
- sc->rate_min = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->rate_min);
+ if (parse_unsigned(n, &sc->rate_min))
+ return -EINVAL;
continue;
}
if (strcmp(id, "rate_max") == 0) {
- sc->rate_max = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->rate_max);
+ if (parse_unsigned(n, &sc->rate_max))
+ return -EINVAL;
continue;
}
if (strcmp(id, "channels_min") == 0) {
- sc->channels_min = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->channels_min);
+ if (parse_unsigned(n, &sc->channels_min))
+ return -EINVAL;
continue;
}
if (strcmp(id, "channels_max") == 0) {
- sc->channels_max = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->channels_max);
+ if (parse_unsigned(n, &sc->channels_max))
+ return -EINVAL;
continue;
}
if (strcmp(id, "periods_min") == 0) {
- sc->periods_min = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->periods_min);
+ if (parse_unsigned(n, &sc->periods_min))
+ return -EINVAL;
continue;
}
if (strcmp(id, "periods_max") == 0) {
- sc->periods_max = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->periods_max);
+ if (parse_unsigned(n, &sc->periods_max))
+ return -EINVAL;
continue;
}
if (strcmp(id, "period_size_min") == 0) {
- sc->period_size_min = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->period_size_min);
+ if (parse_unsigned(n, &sc->period_size_min))
+ return -EINVAL;
continue;
}
if (strcmp(id, "period_size_max") == 0) {
- sc->period_size_max = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->period_size_max);
+ if (parse_unsigned(n, &sc->period_size_max))
+ return -EINVAL;
continue;
}
if (strcmp(id, "buffer_size_min") == 0) {
- sc->buffer_size_min = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->buffer_size_min);
+ if (parse_unsigned(n, &sc->buffer_size_min))
+ return -EINVAL;
continue;
}
if (strcmp(id, "buffer_size_max") == 0) {
- sc->buffer_size_max = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->buffer_size_max);
+ if (parse_unsigned(n, &sc->buffer_size_max))
+ return -EINVAL;
continue;
}
if (strcmp(id, "sig_bits") == 0) {
- sc->sig_bits = atoi(val);
- tplg_dbg("\t\t%s: %d\n", id, sc->sig_bits);
+ if (parse_unsigned(n, &sc->sig_bits))
+ return -EINVAL;
continue;
}
@@ -674,11 +695,8 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &pcm->pcm_id))
return -EINVAL;
-
- pcm->pcm_id = atoi(val);
- tplg_dbg("\t%s: %d\n", id, pcm->pcm_id);
continue;
}
@@ -784,30 +802,21 @@ int tplg_parse_dai(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &dai->dai_id))
return -EINVAL;
-
- dai->dai_id = atoi(val);
- tplg_dbg("\t%s: %d\n", id, dai->dai_id);
continue;
}
if (strcmp(id, "playback") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &dai->playback))
return -EINVAL;
-
- dai->playback = atoi(val);
- tplg_dbg("\t%s: %d\n", id, dai->playback);
continue;
}
if (strcmp(id, "capture") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &dai->capture))
return -EINVAL;
-
- dai->capture = atoi(val);
- tplg_dbg("\t%s: %d\n", id, dai->capture);
continue;
}
@@ -949,11 +958,8 @@ int tplg_parse_link(snd_tplg_t *tplg,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &link->id))
return -EINVAL;
-
- link->id = atoi(val);
- tplg_dbg("\t%s: %d\n", id, link->id);
continue;
}
@@ -975,10 +981,8 @@ int tplg_parse_link(snd_tplg_t *tplg,
}
if (strcmp(id, "default_hw_conf_id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &link->default_hw_config_id))
return -EINVAL;
-
- link->default_hw_config_id = atoi(val);
continue;
}
@@ -1030,7 +1034,7 @@ int tplg_parse_cc(snd_tplg_t *tplg,
struct tplg_elem *elem;
snd_config_iterator_t i, next;
snd_config_t *n;
- const char *id, *val = NULL;
+ const char *id;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_CC);
if (!elem)
@@ -1054,11 +1058,8 @@ int tplg_parse_cc(snd_tplg_t *tplg,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &link->id))
return -EINVAL;
-
- link->id = atoi(val);
- tplg_dbg("\t%s: %d\n", id, link->id);
continue;
}
@@ -1130,11 +1131,8 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->id))
return -EINVAL;
-
- hw_cfg->id = atoi(val);
- tplg_dbg("\t%s: %d\n", id, hw_cfg->id);
continue;
}
@@ -1173,10 +1171,8 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "bclk_freq") == 0 ||
strcmp(id, "bclk_rate") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->bclk_rate))
return -EINVAL;
-
- hw_cfg->bclk_rate = atoi(val);
continue;
}
@@ -1223,19 +1219,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "fsync_freq") == 0 ||
strcmp(id, "fsync_rate") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->fsync_rate))
return -EINVAL;
-
- hw_cfg->fsync_rate = atoi(val);
continue;
}
if (strcmp(id, "mclk_freq") == 0 ||
strcmp(id, "mclk_rate") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->mclk_rate))
return -EINVAL;
-
- hw_cfg->mclk_rate = atoi(val);
continue;
}
@@ -1275,50 +1267,38 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
}
if (strcmp(id, "tdm_slots") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->tdm_slots))
return -EINVAL;
-
- hw_cfg->tdm_slots = atoi(val);
continue;
}
if (strcmp(id, "tdm_slot_width") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->tdm_slot_width))
return -EINVAL;
-
- hw_cfg->tdm_slot_width = atoi(val);
continue;
}
if (strcmp(id, "tx_slots") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->tx_slots))
return -EINVAL;
-
- hw_cfg->tx_slots = atoi(val);
continue;
}
if (strcmp(id, "rx_slots") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->rx_slots))
return -EINVAL;
-
- hw_cfg->rx_slots = atoi(val);
continue;
}
if (strcmp(id, "tx_channels") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->tx_channels))
return -EINVAL;
-
- hw_cfg->tx_channels = atoi(val);
continue;
}
if (strcmp(id, "rx_channels") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ if (parse_unsigned(n, &hw_cfg->rx_channels))
return -EINVAL;
-
- hw_cfg->rx_channels = atoi(val);
continue;
}
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 101491a42e60..991e0b4121bd 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -280,6 +280,8 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base,
struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
snd_config_t *cfg, const char *name, enum snd_tplg_type type);
+int tplg_get_integer(snd_config_t *n, int *val, int base);
+
int tplg_parse_channel(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
snd_config_t *cfg, void *private);
--
2.16.4

View File

@ -1,207 +0,0 @@
From 5925a6d870331c631f85ed4e18a8c5e6459b3c36 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 13:50:04 +0100
Subject: [PATCH 34/63] topology: use snd_config_get_bool() instead own
implementation
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/ctl.c | 9 +++------
src/topology/dapm.c | 9 ++++-----
src/topology/data.c | 15 ++++++++++++---
src/topology/pcm.c | 29 +++++++++++++++--------------
4 files changed, 34 insertions(+), 28 deletions(-)
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index e1896f46c576..9190efefb575 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -657,13 +657,10 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
}
if (strcmp(id, "invert") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
-
- if (strcmp(val, "true") == 0)
- mc->invert = 1;
- else if (strcmp(val, "false") == 0)
- mc->invert = 0;
+ mc->invert = ival;
tplg_dbg("\t%s: %d\n", id, mc->invert);
continue;
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index c6fd793d0d72..ad7092107896 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -479,8 +479,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id, *val = NULL;
- int widget_type, err;
- int ival;
+ int widget_type, err, ival;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_DAPM_WIDGET);
if (!elem)
@@ -531,11 +530,11 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
}
if (strcmp(id, "no_pm") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
- if (strcmp(val, "true") == 0)
- widget->reg = -1;
+ widget->reg = ival ? -1 : 0;
tplg_dbg("\t%s: %s\n", id, val);
continue;
diff --git a/src/topology/data.c b/src/topology/data.c
index 0edfe54f3383..6b1337b39bad 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -557,6 +557,7 @@ static int parse_tuple_set(snd_config_t *cfg,
unsigned int type, num_tuples = 0;
struct tplg_tuple *tuple;
unsigned long int tuple_val;
+ int ival;
snd_config_get_id(cfg, &id);
@@ -607,25 +608,33 @@ static int parse_tuple_set(snd_config_t *cfg,
switch (type) {
case SND_SOC_TPLG_TUPLE_TYPE_UUID:
+ if (snd_config_get_string(n, &value) < 0)
+ continue;
if (get_uuid(value, tuple->uuid) < 0)
goto err;
break;
case SND_SOC_TPLG_TUPLE_TYPE_STRING:
+ if (snd_config_get_string(n, &value) < 0)
+ continue;
snd_strlcpy(tuple->string, value,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
tplg_dbg("\t\t%s = %s\n", tuple->token, tuple->string);
break;
case SND_SOC_TPLG_TUPLE_TYPE_BOOL:
- if (strcmp(value, "true") == 0)
- tuple->value = 1;
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
+ continue;
+ tuple->value = ival;
tplg_dbg("\t\t%s = %d\n", tuple->token, tuple->value);
break;
case SND_SOC_TPLG_TUPLE_TYPE_BYTE:
case SND_SOC_TPLG_TUPLE_TYPE_SHORT:
case SND_SOC_TPLG_TUPLE_TYPE_WORD:
+ if (snd_config_get_string(n, &value) < 0)
+ continue;
errno = 0;
/* no support for negative value */
tuple_val = strtoul(value, NULL, 0);
@@ -1012,7 +1021,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
{
snd_config_iterator_t i, next;
snd_config_t *n;
- const char *id, *val = NULL;
+ const char *id;
int err = 0, ival;
struct tplg_elem *elem;
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index d6c52b4752ee..6364e24f3c43 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -669,8 +669,8 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
struct tplg_elem *elem;
snd_config_iterator_t i, next;
snd_config_t *n;
- const char *id, *val = NULL;
- int err;
+ const char *id;
+ int err, ival;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_PCM);
if (!elem)
@@ -709,11 +709,11 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
}
if (strcmp(id, "compress") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
- if (strcmp(val, "true") == 0)
- pcm->compress = 1;
+ pcm->compress = ival;
tplg_dbg("\t%s: %s\n", id, val);
continue;
@@ -1107,7 +1107,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id, *val = NULL;
- int ret;
+ int ret, ival;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_HW_CONFIG);
if (!elem)
@@ -1178,11 +1178,11 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "bclk_invert") == 0 ||
strcmp(id, "invert_bclk") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
- if (!strcmp(val, "true"))
- hw_cfg->invert_bclk = true;
+ hw_cfg->invert_bclk = ival;
continue;
}
@@ -1209,11 +1209,11 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "fsync_invert") == 0 ||
strcmp(id, "invert_fsync") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
- if (!strcmp(val, "true"))
- hw_cfg->invert_fsync = true;
+ hw_cfg->invert_fsync = ival;
continue;
}
@@ -1254,10 +1254,11 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "pm_gate_clocks") == 0 ||
strcmp(id, "clock_gated") == 0) {
- if (snd_config_get_string(n, &val) < 0)
+ ival = snd_config_get_bool(n);
+ if (ival < 0)
return -EINVAL;
- if (!strcmp(val, "true"))
+ if (ival)
hw_cfg->clock_gated =
SND_SOC_TPLG_DAI_CLK_GATE_GATED;
else
--
2.16.4

View File

@ -1,39 +0,0 @@
From 1047a5f3c0d39a3b0579db027f52d7facdf44077 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 13:52:18 +0100
Subject: [PATCH 35/63] topology: fix tplg_get_integer() - handle errno ==
ERANGE
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/parser.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 7e657809307d..667c8d45517b 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -36,14 +36,19 @@ int tplg_get_integer(snd_config_t *n, int *val, int base)
if (err < 0)
return err;
if (lval < INT_MIN || lval > INT_MAX)
- return -EINVAL;
+ return -ERANGE;
*val = lval;
return err;
case SND_CONFIG_TYPE_STRING:
err = snd_config_get_string(n, &str);
if (err < 0)
return err;
+ errno = 0;
*val = strtol(str, NULL, base);
+ if (errno == ERANGE)
+ return -ERANGE;
+ if (errno && *val == 0)
+ return -EINVAL;
return 0;
default:
return -EINVAL;
--
2.16.4

View File

@ -1,172 +0,0 @@
From 14e43a11873d14ec6f16967c83629237ef44ac38 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 14:05:49 +0100
Subject: [PATCH 36/63] topology: add tplg_get_unsigned() function
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 19 +++++--------------
src/topology/parser.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/topology/pcm.c | 13 ++-----------
src/topology/tplg_local.h | 1 +
4 files changed, 55 insertions(+), 25 deletions(-)
diff --git a/src/topology/data.c b/src/topology/data.c
index 6b1337b39bad..9807445e8c37 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -556,7 +556,7 @@ static int parse_tuple_set(snd_config_t *cfg,
struct tplg_tuple_set *set;
unsigned int type, num_tuples = 0;
struct tplg_tuple *tuple;
- unsigned long int tuple_val;
+ unsigned int tuple_val;
int ival;
snd_config_get_id(cfg, &id);
@@ -598,10 +598,6 @@ static int parse_tuple_set(snd_config_t *cfg,
if (snd_config_get_id(n, &id) < 0)
continue;
- /* get value */
- if (snd_config_get_string(n, &value) < 0)
- continue;
-
tuple = &set->tuple[set->num_tuples];
snd_strlcpy(tuple->token, id,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
@@ -633,14 +629,9 @@ static int parse_tuple_set(snd_config_t *cfg,
case SND_SOC_TPLG_TUPLE_TYPE_BYTE:
case SND_SOC_TPLG_TUPLE_TYPE_SHORT:
case SND_SOC_TPLG_TUPLE_TYPE_WORD:
- if (snd_config_get_string(n, &value) < 0)
- continue;
- errno = 0;
- /* no support for negative value */
- tuple_val = strtoul(value, NULL, 0);
- if ((errno == ERANGE && tuple_val == ULONG_MAX)
- || (errno != 0 && tuple_val == 0)) {
- SNDERR("error: tuple %s:strtoul fail\n", id);
+ ival = tplg_get_unsigned(n, &tuple_val, 0);
+ if (ival < 0) {
+ SNDERR("error: tuple %s: %s\n", id, snd_strerror(ival));
goto err;
}
@@ -654,7 +645,7 @@ static int parse_tuple_set(snd_config_t *cfg,
goto err;
}
- tuple->value = (unsigned int) tuple_val;
+ tuple->value = tuple_val;
tplg_dbg("\t\t%s = 0x%x\n", tuple->token, tuple->value);
break;
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 667c8d45517b..f56ad97e42b9 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -55,6 +55,53 @@ int tplg_get_integer(snd_config_t *n, int *val, int base)
}
}
+/*
+ * Get unsigned integer value
+ */
+int tplg_get_unsigned(snd_config_t *n, unsigned *val, int base)
+{
+ const char *str;
+ long lval;
+ long long llval;
+ unsigned long uval;
+ int err;
+
+ switch (snd_config_get_type(n)) {
+ case SND_CONFIG_TYPE_INTEGER:
+ err = snd_config_get_integer(n, &lval);
+ if (err < 0)
+ return err;
+ if (lval < 0 || lval > UINT_MAX)
+ return -ERANGE;
+ *val = lval;
+ return err;
+ case SND_CONFIG_TYPE_INTEGER64:
+ err = snd_config_get_integer64(n, &llval);
+ if (err < 0)
+ return err;
+ if (llval < 0 || llval > UINT_MAX)
+ return -ERANGE;
+ *val = llval;
+ return err;
+ case SND_CONFIG_TYPE_STRING:
+ err = snd_config_get_string(n, &str);
+ if (err < 0)
+ return err;
+ errno = 0;
+ uval = strtoul(str, NULL, base);
+ if (errno == ERANGE && uval == ULONG_MAX)
+ return -ERANGE;
+ if (errno && uval == 0)
+ return -EINVAL;
+ if (uval > UINT_MAX)
+ return -ERANGE;
+ *val = uval;
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
/*
* Parse compound
*/
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 6364e24f3c43..9b87549cabbd 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -606,8 +606,7 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
struct snd_soc_tplg_pcm *pcm = elem->pcm;
snd_config_iterator_t i, next;
snd_config_t *n;
- const char *id, *value = NULL;
- unsigned long int id_val;
+ const char *id;
snd_config_get_id(cfg, &id);
tplg_dbg("\t\tFE DAI %s:\n", id);
@@ -622,19 +621,11 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
continue;
if (strcmp(id, "id") == 0) {
- if (snd_config_get_string(n, &value) < 0)
- continue;
- errno = 0;
- /* no support for negative value */
- id_val = strtoul(value, NULL, 0);
- if ((errno == ERANGE && id_val == ULONG_MAX)
- || (errno != 0 && id_val == 0)
- || id_val > UINT_MAX) {
+ if (tplg_get_unsigned(n, &pcm->dai_id, 0)) {
SNDERR("error: invalid fe dai ID\n");
return -EINVAL;
}
- pcm->dai_id = (int) id_val;
tplg_dbg("\t\t\tindex: %d\n", pcm->dai_id);
}
}
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 991e0b4121bd..e16c78d49709 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -281,6 +281,7 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
snd_config_t *cfg, const char *name, enum snd_tplg_type type);
int tplg_get_integer(snd_config_t *n, int *val, int base);
+int tplg_get_unsigned(snd_config_t *n, unsigned *val, int base);
int tplg_parse_channel(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
snd_config_t *cfg, void *private);
--
2.16.4

View File

@ -1,296 +0,0 @@
From 39fb37fef5bd3b3fa7a63e06a5f0a147197fddb9 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 19:13:53 +0100
Subject: [PATCH 37/63] topology: convert builder to use the mallocated memory
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 88 +++++++++++++++++++++++++++++++++++++----------
src/topology/parser.c | 74 ++++++++++++++++-----------------------
src/topology/tplg_local.h | 5 +--
3 files changed, 103 insertions(+), 64 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 1a22a453695a..40943b56e4aa 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -29,7 +29,7 @@ static void verbose(snd_tplg_t *tplg, const char *fmt, ...)
return;
va_start(va, fmt);
- fprintf(stdout, "0x%6.6zx/%6.6zd - ", tplg->out_pos, tplg->out_pos);
+ fprintf(stdout, "0x%6.6zx/%6.6zd - ", tplg->bin_pos, tplg->bin_pos);
vfprintf(stdout, fmt, va);
va_end(va);
}
@@ -37,18 +37,11 @@ static void verbose(snd_tplg_t *tplg, const char *fmt, ...)
/* write a block, track the position */
static ssize_t twrite(snd_tplg_t *tplg, void *data, size_t data_size)
{
- ssize_t r = write(tplg->out_fd, data, data_size);
- if (r != (ssize_t)data_size) {
- if (r < 0) {
- SNDERR("error: unable to write: %s", strerror(errno));
- return -errno;
- }
- tplg->out_pos += r;
- SNDERR("error: unable to write (partial)");
+ if (tplg->bin_pos + data_size > tplg->bin_size)
return -EIO;
- }
- tplg->out_pos += r;
- return r;
+ memcpy(tplg->bin + tplg->bin_pos, data, data_size);
+ tplg->bin_pos += data_size;
+ return data_size;
}
/* write out block header to output file */
@@ -71,12 +64,12 @@ static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
hdr.count = count;
/* make sure file offset is aligned with the calculated HDR offset */
- if (tplg->out_pos != tplg->next_hdr_pos) {
+ if (tplg->bin_pos != tplg->next_hdr_pos) {
SNDERR("error: New header is at offset 0x%zx but file"
" offset 0x%zx is %s by %ld bytes\n",
- tplg->next_hdr_pos, tplg->out_pos,
- tplg->out_pos > tplg->next_hdr_pos ? "ahead" : "behind",
- labs(tplg->out_pos - tplg->next_hdr_pos));
+ tplg->next_hdr_pos, tplg->bin_pos,
+ tplg->bin_pos > tplg->next_hdr_pos ? "ahead" : "behind",
+ labs(tplg->bin_pos - tplg->next_hdr_pos));
return -EINVAL;
}
@@ -163,6 +156,41 @@ static int write_elem_block(snd_tplg_t *tplg,
return 0;
}
+static size_t calc_manifest_size(snd_tplg_t *tplg)
+{
+ return sizeof(struct snd_soc_tplg_hdr) +
+ sizeof(tplg->manifest) +
+ tplg->manifest.priv.size;
+}
+
+static size_t calc_real_size(struct list_head *base)
+{
+ struct list_head *pos;
+ struct tplg_elem *elem, *elem_next;
+ size_t size = 0;
+
+ list_for_each(pos, base) {
+
+ elem = list_entry(pos, struct tplg_elem, list);
+
+ /* compound elems have already been copied to other elems */
+ if (elem->compound_elem)
+ continue;
+
+ if (elem->size <= 0)
+ continue;
+
+ size += elem->size;
+
+ elem_next = list_entry(pos->next, struct tplg_elem, list);
+
+ if ((pos->next == base) || (elem_next->index != elem->index))
+ size += sizeof(struct snd_soc_tplg_hdr);
+ }
+
+ return size;
+}
+
static size_t calc_block_size(struct list_head *base)
{
struct list_head *pos;
@@ -277,9 +305,27 @@ int tplg_write_data(snd_tplg_t *tplg)
};
ssize_t ret;
- size_t size;
+ size_t total_size, size;
unsigned int index;
+ /* calculate total size */
+ total_size = calc_manifest_size(tplg);
+ for (index = 0; index < ARRAY_SIZE(wtable); index++) {
+ wptr = &wtable[index];
+ size = calc_real_size(wptr->list);
+ total_size += size;
+ }
+
+ /* allocate new binary output */
+ free(tplg->bin);
+ tplg->bin = malloc(total_size);
+ tplg->bin_pos = 0;
+ tplg->bin_size = total_size;
+ if (tplg->bin == NULL) {
+ tplg->bin_size = 0;
+ return -ENOMEM;
+ }
+
/* write manifest */
ret = write_manifest_data(tplg);
if (ret < 0) {
@@ -306,7 +352,13 @@ int tplg_write_data(snd_tplg_t *tplg)
}
}
- verbose(tplg, "total size is 0x%zx/%zd\n", tplg->out_pos, tplg->out_pos);
+ verbose(tplg, "total size is 0x%zx/%zd\n", tplg->bin_pos, tplg->bin_pos);
+
+ if (total_size != tplg->bin_pos) {
+ SNDERR("total size mismatch (%zd != %zd)\n",
+ total_size, tplg->bin_pos);
+ return -EINVAL;
+ }
return 0;
}
diff --git a/src/topology/parser.c b/src/topology/parser.c
index f56ad97e42b9..98a9f9e9deac 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -393,50 +393,29 @@ static int tplg_build_integ(snd_tplg_t *tplg)
return err;
}
-int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
- const char *outfile)
+int snd_tplg_build_file(snd_tplg_t *tplg,
+ const char *infile,
+ const char *outfile)
{
snd_config_t *cfg = NULL;
int err = 0;
- tplg->out_fd =
- open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
- if (tplg->out_fd < 0) {
- SNDERR("error: failed to open %s err %d\n",
- outfile, -errno);
- return -errno;
- }
-
err = tplg_load_config(infile, &cfg);
if (err < 0) {
SNDERR("error: failed to load topology file %s\n",
infile);
- goto out_close;
+ return err;
}
err = tplg_parse_config(tplg, cfg);
if (err < 0) {
SNDERR("error: failed to parse topology\n");
- goto out;
- }
-
- err = tplg_build_integ(tplg);
- if (err < 0) {
- SNDERR("error: failed to check topology integrity\n");
- goto out;
- }
-
- err = tplg_write_data(tplg);
- if (err < 0) {
- SNDERR("error: failed to write data %d\n", err);
- goto out;
+ return err;
}
-out:
snd_config_delete(cfg);
-out_close:
- close(tplg->out_fd);
- return err;
+
+ return snd_tplg_build(tplg, outfile);
}
int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
@@ -468,31 +447,38 @@ int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
{
- int err;
-
- tplg->out_fd =
- open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
- if (tplg->out_fd < 0) {
- SNDERR("error: failed to open %s err %d\n",
- outfile, -errno);
- return -errno;
- }
+ int fd, err;
+ ssize_t r;
err = tplg_build_integ(tplg);
if (err < 0) {
SNDERR("error: failed to check topology integrity\n");
- goto out;
+ return err;
}
err = tplg_write_data(tplg);
if (err < 0) {
SNDERR("error: failed to write data %d\n", err);
- goto out;
+ return err;
}
-out:
- close(tplg->out_fd);
- return err;
+ fd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ SNDERR("error: failed to open %s err %d\n", outfile, -errno);
+ return -errno;
+ }
+ r = write(fd, tplg->bin, tplg->bin_size);
+ close(fd);
+ if (r < 0) {
+ err = -errno;
+ SNDERR("error: write error: %s\n", strerror(errno));
+ return err;
+ }
+ if ((size_t)r != tplg->bin_size) {
+ SNDERR("error: partial write (%zd != %zd)\n", r, tplg->bin_size);
+ return -EIO;
+ }
+ return 0;
}
int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len)
@@ -571,8 +557,8 @@ snd_tplg_t *snd_tplg_new(void)
void snd_tplg_free(snd_tplg_t *tplg)
{
- if (tplg->manifest_pdata)
- free(tplg->manifest_pdata);
+ free(tplg->bin);
+ free(tplg->manifest_pdata);
tplg_elem_free_list(&tplg->tlv_list);
tplg_elem_free_list(&tplg->widget_list);
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index e16c78d49709..87e6c9a517de 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -60,8 +60,9 @@ typedef enum _snd_pcm_rates {
struct snd_tplg {
/* out file */
- int out_fd;
- size_t out_pos;
+ unsigned char *bin;
+ size_t bin_pos;
+ size_t bin_size;
int verbose;
unsigned int version;
--
2.16.4

View File

@ -1,173 +0,0 @@
From bee8d4fcaa52d00950d035ec561513c2b9e7cac7 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 19:20:02 +0100
Subject: [PATCH 38/63] topology: add binary output from the builder
- snd_tplg_build_bin()
- snd_tplg_build_bin_file()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/topology.h | 22 +++++++++++++-
src/topology/parser.c | 79 ++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 87 insertions(+), 14 deletions(-)
diff --git a/include/topology.h b/include/topology.h
index 27da7308dd62..c9ef554a610f 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -791,7 +791,18 @@ void snd_tplg_free(snd_tplg_t *tplg);
* \return Zero on success, otherwise a negative error code
*/
int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
- const char *outfile);
+ const char *outfile);
+
+/**
+ * \brief Parse and build topology text file into binary file.
+ * \param tplg Topology instance.
+ * \param infile Topology text input file to be parsed
+ * \param bin Binary topology output buffer (malloc).
+ * \param size Binary topology output buffer size in bytes.
+ * \return Zero on success, otherwise a negative error code
+ */
+int snd_tplg_build_bin_file(snd_tplg_t *tplg, const char *infile,
+ void **bin, size_t *size);
/**
* \brief Enable verbose reporting of binary file output
@@ -1089,6 +1100,15 @@ int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);
*/
int snd_tplg_build(snd_tplg_t *tplg, const char *outfile);
+/**
+ * \brief Build all registered topology data into memory.
+ * \param tplg Topology instance.
+ * \param bin Binary topology output buffer (malloc).
+ * \param size Binary topology output buffer size in bytes.
+ * \return Zero on success, otherwise a negative error code
+ */
+int snd_tplg_build_bin(snd_tplg_t *tplg, void **bin, size_t *size);
+
/**
* \brief Attach private data to topology manifest.
* \param tplg Topology instance.
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 98a9f9e9deac..861565b734ad 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -393,9 +393,7 @@ static int tplg_build_integ(snd_tplg_t *tplg)
return err;
}
-int snd_tplg_build_file(snd_tplg_t *tplg,
- const char *infile,
- const char *outfile)
+static int tplg_load(snd_tplg_t *tplg, const char *infile)
{
snd_config_t *cfg = NULL;
int err = 0;
@@ -414,10 +412,53 @@ int snd_tplg_build_file(snd_tplg_t *tplg,
}
snd_config_delete(cfg);
+ return 0;
+}
+
+static int tplg_build(snd_tplg_t *tplg)
+{
+ int err;
+
+ err = tplg_build_integ(tplg);
+ if (err < 0) {
+ SNDERR("error: failed to check topology integrity\n");
+ return err;
+ }
+
+ err = tplg_write_data(tplg);
+ if (err < 0) {
+ SNDERR("error: failed to write data %d\n", err);
+ return err;
+ }
+ return 0;
+}
+
+int snd_tplg_build_file(snd_tplg_t *tplg,
+ const char *infile,
+ const char *outfile)
+{
+ int err;
+
+ err = tplg_load(tplg, infile);
+ if (err < 0)
+ return err;
return snd_tplg_build(tplg, outfile);
}
+int snd_tplg_build_bin_file(snd_tplg_t *tplg,
+ const char *infile,
+ void **bin, size_t *size)
+{
+ int err;
+
+ err = tplg_load(tplg, infile);
+ if (err < 0)
+ return err;
+
+ return snd_tplg_build_bin(tplg, bin, size);
+}
+
int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
{
switch (t->type) {
@@ -450,17 +491,9 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
int fd, err;
ssize_t r;
- err = tplg_build_integ(tplg);
- if (err < 0) {
- SNDERR("error: failed to check topology integrity\n");
- return err;
- }
-
- err = tplg_write_data(tplg);
- if (err < 0) {
- SNDERR("error: failed to write data %d\n", err);
+ err = tplg_build(tplg);
+ if (err < 0)
return err;
- }
fd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0) {
@@ -481,6 +514,26 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
return 0;
}
+int snd_tplg_build_bin(snd_tplg_t *tplg,
+ void **bin, size_t *size)
+{
+ int err;
+
+ err = tplg_build(tplg);
+ if (err < 0)
+ return err;
+
+ err = tplg_build(tplg);
+ if (err < 0)
+ return err;
+
+ *bin = tplg->bin;
+ *size = tplg->bin_size;
+ tplg->bin = NULL;
+ tplg->bin_size = tplg->bin_pos = 0;
+ return 0;
+}
+
int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len)
{
if (len <= 0)
--
2.16.4

View File

@ -1,346 +0,0 @@
From 22b66731f3dc0eb5149a99ff547eeb84eaf8d54b Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 14 Dec 2019 20:32:24 +0100
Subject: [PATCH 39/63] topology: parser - recode tplg_parse_config()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/parser.c | 225 +++++++++++++++++++---------------------------
src/topology/tplg_local.h | 67 ++++----------
2 files changed, 108 insertions(+), 184 deletions(-)
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 861565b734ad..82af7cc518d8 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -142,9 +142,88 @@ int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
{
+ static struct _parser {
+ const char *id;
+ int (*parser)(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+ } *p, parsers[] = {
+ {
+ .id = "SectionTLV",
+ .parser = tplg_parse_tlv
+ },
+ {
+ .id = "SectionControlMixer",
+ .parser = tplg_parse_control_mixer
+ },
+ {
+ .id = "SectionControlEnum",
+ .parser = tplg_parse_control_enum
+ },
+ {
+ .id = "SectionControlBytes",
+ .parser = tplg_parse_control_bytes
+ },
+ {
+ .id = "SectionWidget",
+ .parser = tplg_parse_dapm_widget
+ },
+ {
+ .id = "SectionPCMCapabilities",
+ .parser = tplg_parse_stream_caps
+ },
+ {
+ .id = "SectionPCM",
+ .parser = tplg_parse_pcm
+ },
+ {
+ .id = "SectionDAI",
+ .parser = tplg_parse_dai
+ },
+ {
+ .id = "SectionHWConfig",
+ .parser = tplg_parse_hw_config
+ },
+ {
+ .id = "SectionLink",
+ .parser = tplg_parse_link
+ },
+ {
+ .id = "SectionBE",
+ .parser = tplg_parse_link
+ },
+ {
+ .id = "SectionCC",
+ .parser = tplg_parse_cc
+ },
+ {
+ .id = "SectionGraph",
+ .parser = tplg_parse_dapm_graph
+ },
+ {
+ .id = "SectionText",
+ .parser = tplg_parse_text
+ },
+ {
+ .id = "SectionData",
+ .parser = tplg_parse_data
+ },
+ {
+ .id = "SectionVendorTokens",
+ .parser = tplg_parse_tokens
+ },
+ {
+ .id = "SectionVendorTuples",
+ .parser = tplg_parse_tuples
+ },
+ {
+ .id = "SectionManifest",
+ .parser = tplg_parse_manifest_data
+ },
+ };
+ int (*parser)(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id;
+ unsigned int idx;
int err;
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
@@ -159,145 +238,23 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
if (snd_config_get_id(n, &id) < 0)
continue;
- if (strcmp(id, "SectionTLV") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_tlv,
- NULL);
- if (err < 0)
- return err;
- continue;
+ parser = NULL;
+ for (idx = 0; idx < ARRAY_SIZE(parsers); idx++) {
+ p = &parsers[idx];
+ if (strcmp(id, p->id) == 0) {
+ parser = p->parser;
+ break;
+ }
}
- if (strcmp(id, "SectionControlMixer") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_control_mixer, NULL);
- if (err < 0)
- return err;
+ if (parser == NULL) {
+ SNDERR("error: unknown section %s\n", id);
continue;
}
- if (strcmp(id, "SectionControlEnum") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_control_enum, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionControlBytes") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_control_bytes, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionWidget") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_dapm_widget, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionPCMCapabilities") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_stream_caps, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionPCM") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_pcm, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionDAI") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_dai, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionHWConfig") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_hw_config,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionLink") == 0
- || strcmp(id, "SectionBE") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_link,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionCC") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_cc,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionGraph") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_dapm_graph, NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionText") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_text,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionData") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_data,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionVendorTokens") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_tokens,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionVendorTuples") == 0) {
- err = tplg_parse_compound(tplg, n, tplg_parse_tuples,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- if (strcmp(id, "SectionManifest") == 0) {
- err = tplg_parse_compound(tplg, n,
- tplg_parse_manifest_data,
- NULL);
- if (err < 0)
- return err;
- continue;
- }
-
- SNDERR("error: unknown section %s\n", id);
+ err = tplg_parse_compound(tplg, n, parser, NULL);
+ if (err < 0)
+ return err;
}
return 0;
}
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 87e6c9a517de..77a681897a85 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -202,59 +202,26 @@ int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
int tplg_write_data(snd_tplg_t *tplg);
-int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_tuples(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
+int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_tuples(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_manifest_data(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_control_bytes(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_control_mixer(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_dapm_widget(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_stream_caps(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_dai(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_link(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_cc(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
+int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
void tplg_free_tuples(void *obj);
-int tplg_parse_manifest_data(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_control_bytes(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_control_mixer(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_dapm_widget(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_stream_caps(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_pcm(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_dai(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_link(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_cc(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
-
-int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED);
-
int tplg_build_data(snd_tplg_t *tplg);
int tplg_build_manifest_data(snd_tplg_t *tplg);
int tplg_build_controls(snd_tplg_t *tplg);
--
2.16.4

View File

@ -1,208 +0,0 @@
From d52eaba63dfe1d845663a4cd1bf676fafc43874a Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 15 Dec 2019 16:03:29 +0100
Subject: [PATCH 40/63] topology: add snd_tplg_load() remove
snd_tplg_build_bin_file()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/topology.h | 16 ++++-----
src/topology/parser.c | 96 ++++++++++++++++++---------------------------------
2 files changed, 41 insertions(+), 71 deletions(-)
diff --git a/include/topology.h b/include/topology.h
index c9ef554a610f..c9f4ffea27de 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -784,25 +784,23 @@ snd_tplg_t *snd_tplg_new(void);
void snd_tplg_free(snd_tplg_t *tplg);
/**
- * \brief Parse and build topology text file into binary file.
+ * \brief Load topology from the text buffer.
* \param tplg Topology instance.
- * \param infile Topology text input file to be parsed
- * \param outfile Binary topology output file.
+ * \param buf Text buffer.
+ * \param size Text buffer size in bytes.
* \return Zero on success, otherwise a negative error code
*/
-int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
- const char *outfile);
+int snd_tplg_load(snd_tplg_t *tplg, const char *buf, size_t size);
/**
* \brief Parse and build topology text file into binary file.
* \param tplg Topology instance.
* \param infile Topology text input file to be parsed
- * \param bin Binary topology output buffer (malloc).
- * \param size Binary topology output buffer size in bytes.
+ * \param outfile Binary topology output file.
* \return Zero on success, otherwise a negative error code
*/
-int snd_tplg_build_bin_file(snd_tplg_t *tplg, const char *infile,
- void **bin, size_t *size);
+int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
+ const char *outfile);
/**
* \brief Enable verbose reporting of binary file output
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 82af7cc518d8..ed864d3223c4 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -259,52 +259,30 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
return 0;
}
-static int tplg_load_config(const char *file, snd_config_t **cfg)
+static int tplg_load_config(snd_tplg_t *tplg, snd_input_t *in)
{
- FILE *fp;
- snd_input_t *in;
snd_config_t *top;
int ret;
- fp = fopen(file, "r");
- if (fp == NULL) {
- SNDERR("error: could not open configuration file %s",
- file);
- return -errno;
- }
-
- ret = snd_input_stdio_attach(&in, fp, 1);
- if (ret < 0) {
- fclose(fp);
- SNDERR("error: could not attach stdio %s", file);
- return ret;
- }
ret = snd_config_top(&top);
if (ret < 0)
- goto err;
+ return ret;
ret = snd_config_load(top, in);
if (ret < 0) {
- SNDERR("error: could not load configuration file %s",
- file);
- goto err_load;
+ SNDERR("error: could not load configuration");
+ snd_config_delete(top);
+ return ret;
}
- ret = snd_input_close(in);
+ ret = tplg_parse_config(tplg, top);
+ snd_config_delete(top);
if (ret < 0) {
- in = NULL;
- goto err_load;
+ SNDERR("error: failed to parse topology");
+ return ret;
}
- *cfg = top;
return 0;
-
-err_load:
- snd_config_delete(top);
-err:
- if (in)
- snd_input_close(in);
- return ret;
}
static int tplg_build_integ(snd_tplg_t *tplg)
@@ -350,26 +328,20 @@ static int tplg_build_integ(snd_tplg_t *tplg)
return err;
}
-static int tplg_load(snd_tplg_t *tplg, const char *infile)
+int snd_tplg_load(snd_tplg_t *tplg, const char *buf, size_t size)
{
- snd_config_t *cfg = NULL;
- int err = 0;
-
- err = tplg_load_config(infile, &cfg);
- if (err < 0) {
- SNDERR("error: failed to load topology file %s\n",
- infile);
- return err;
- }
+ snd_input_t *in;
+ int err;
- err = tplg_parse_config(tplg, cfg);
+ err = snd_input_buffer_open(&in, buf, size);
if (err < 0) {
- SNDERR("error: failed to parse topology\n");
+ SNDERR("error: could not create input buffer");
return err;
}
- snd_config_delete(cfg);
- return 0;
+ err = tplg_load_config(tplg, in);
+ snd_input_close(in);
+ return err;
}
static int tplg_build(snd_tplg_t *tplg)
@@ -394,26 +366,30 @@ int snd_tplg_build_file(snd_tplg_t *tplg,
const char *infile,
const char *outfile)
{
+ FILE *fp;
+ snd_input_t *in;
int err;
- err = tplg_load(tplg, infile);
- if (err < 0)
- return err;
-
- return snd_tplg_build(tplg, outfile);
-}
+ fp = fopen(infile, "r");
+ if (fp == NULL) {
+ SNDERR("error: could not open configuration file %s",
+ infile);
+ return -errno;
+ }
-int snd_tplg_build_bin_file(snd_tplg_t *tplg,
- const char *infile,
- void **bin, size_t *size)
-{
- int err;
+ err = snd_input_stdio_attach(&in, fp, 1);
+ if (err < 0) {
+ fclose(fp);
+ SNDERR("error: could not attach stdio %s", infile);
+ return err;
+ }
- err = tplg_load(tplg, infile);
+ err = tplg_load_config(tplg, in);
+ snd_input_close(in);
if (err < 0)
return err;
- return snd_tplg_build_bin(tplg, bin, size);
+ return snd_tplg_build(tplg, outfile);
}
int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
@@ -476,10 +452,6 @@ int snd_tplg_build_bin(snd_tplg_t *tplg,
{
int err;
- err = tplg_build(tplg);
- if (err < 0)
- return err;
-
err = tplg_build(tplg);
if (err < 0)
return err;
--
2.16.4

View File

@ -1,464 +0,0 @@
From 4f076f5b69a873418ecb826a4198e4d95a3a2a6f Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 15 Dec 2019 16:15:29 +0100
Subject: [PATCH 41/63] topology: move the topology element table from builder
to elem
- use offsetof() for the lists
- add other info to describe the elements
- use the table in the element constructor
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 98 ++++----------------
src/topology/ctl.c | 7 +-
src/topology/elem.c | 232 ++++++++++++++++++++++++++++++++--------------
src/topology/tplg_local.h | 15 +++
4 files changed, 199 insertions(+), 153 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 40943b56e4aa..cadb55830809 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -236,83 +236,20 @@ static ssize_t write_manifest_data(snd_tplg_t *tplg)
int tplg_write_data(snd_tplg_t *tplg)
{
- struct wtable {
- const char *name;
- struct list_head *list;
- int type;
- int tsoc;
- } *wptr, wtable[] = {
- {
- .name = "control mixer",
- .list = &tplg->mixer_list,
- .type = SND_TPLG_TYPE_MIXER,
- .tsoc = SND_SOC_TPLG_TYPE_MIXER,
- },
- {
- .name = "control enum",
- .list = &tplg->enum_list,
- .type = SND_TPLG_TYPE_ENUM,
- .tsoc = SND_SOC_TPLG_TYPE_ENUM,
- },
- {
- .name = "control extended (bytes)",
- .list = &tplg->bytes_ext_list,
- .type = SND_TPLG_TYPE_BYTES,
- .tsoc = SND_SOC_TPLG_TYPE_BYTES,
- },
- {
- .name = "dapm widget",
- .list = &tplg->widget_list,
- .type = SND_TPLG_TYPE_DAPM_WIDGET,
- .tsoc = SND_SOC_TPLG_TYPE_DAPM_WIDGET,
- },
- {
- .name = "pcm",
- .list = &tplg->pcm_list,
- .type = SND_TPLG_TYPE_PCM,
- .tsoc = SND_SOC_TPLG_TYPE_PCM,
- },
- {
- .name = "physical dai",
- .list = &tplg->dai_list,
- .type = SND_TPLG_TYPE_DAI,
- .tsoc = SND_SOC_TPLG_TYPE_DAI,
- },
- {
- .name = "be",
- .list = &tplg->be_list,
- .type = SND_TPLG_TYPE_BE,
- .tsoc = SND_SOC_TPLG_TYPE_BACKEND_LINK,
- },
- {
- .name = "cc",
- .list = &tplg->cc_list,
- .type = SND_TPLG_TYPE_CC,
- .tsoc = SND_SOC_TPLG_TYPE_CODEC_LINK,
- },
- {
- .name = "route (dapm graph)",
- .list = &tplg->route_list,
- .type = SND_TPLG_TYPE_DAPM_GRAPH,
- .tsoc = SND_SOC_TPLG_TYPE_DAPM_GRAPH,
- },
- {
- .name = "private data",
- .list = &tplg->pdata_list,
- .type = SND_TPLG_TYPE_DATA,
- .tsoc = SND_SOC_TPLG_TYPE_PDATA,
- },
- };
-
+ struct tplg_table *tptr;
+ struct list_head *list;
ssize_t ret;
size_t total_size, size;
unsigned int index;
/* calculate total size */
total_size = calc_manifest_size(tplg);
- for (index = 0; index < ARRAY_SIZE(wtable); index++) {
- wptr = &wtable[index];
- size = calc_real_size(wptr->list);
+ for (index = 0; index < tplg_table_items; index++) {
+ tptr = &tplg_table[index];
+ if (!tptr->build)
+ continue;
+ list = (struct list_head *)((void *)tplg + tptr->loff);
+ size = calc_real_size(list);
total_size += size;
}
@@ -334,20 +271,23 @@ int tplg_write_data(snd_tplg_t *tplg)
}
/* write all blocks */
- for (index = 0; index < ARRAY_SIZE(wtable); index++) {
- wptr = &wtable[index];
+ for (index = 0; index < tplg_table_items; index++) {
+ tptr = &tplg_table[index];
+ if (!tptr->build)
+ continue;
+ list = (struct list_head *)((void *)tplg + tptr->loff);
/* calculate the block size in bytes for all elems in this list */
- size = calc_block_size(wptr->list);
+ size = calc_block_size(list);
if (size == 0)
continue;
verbose(tplg, "block size for type %s (%d:%d) is 0x%zx/%zd\n",
- wptr->name, wptr->type,
- wptr->tsoc, size, size);
- ret = write_elem_block(tplg, wptr->list, size,
- wptr->tsoc, wptr->name);
+ tptr->name, tptr->type,
+ tptr->tsoc, size, size);
+ ret = write_elem_block(tplg, list, size,
+ tptr->tsoc, tptr->name);
if (ret < 0) {
SNDERR("failed to write %s elements: %s\n",
- wptr->name, snd_strerror(-ret));
+ tptr->name, snd_strerror(-ret));
return ret;
}
}
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 9190efefb575..539329cd661f 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -284,18 +284,13 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
{
snd_config_iterator_t i, next;
snd_config_t *n;
- struct snd_soc_tplg_ctl_tlv *tplg_tlv;
+ struct snd_soc_tplg_ctl_tlv *tplg_tlv = elem->tlv;
struct snd_soc_tplg_tlv_dbscale *scale;
const char *id = NULL;
int val;
tplg_dbg(" scale: %s\n", elem->id);
- tplg_tlv = calloc(1, sizeof(*tplg_tlv));
- if (!tplg_tlv)
- return -ENOMEM;
-
- elem->tlv = tplg_tlv;
tplg_tlv->size = sizeof(struct snd_soc_tplg_ctl_tlv);
tplg_tlv->type = SNDRV_CTL_TLVT_DB_SCALE;
scale = &tplg_tlv->scale;
diff --git a/src/topology/elem.c b/src/topology/elem.c
index f2076f7958aa..92ca7da4c4aa 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -20,6 +20,154 @@
#include "list.h"
#include "tplg_local.h"
+struct tplg_table tplg_table[] = {
+ {
+ .name = "manifest",
+ .loff = offsetof(snd_tplg_t, manifest_list),
+ .type = SND_TPLG_TYPE_MANIFEST,
+ .tsoc = SND_SOC_TPLG_TYPE_MANIFEST,
+ .size = sizeof(struct snd_soc_tplg_manifest),
+ .enew = 1,
+ },
+ {
+ .name = "control mixer",
+ .loff = offsetof(snd_tplg_t, mixer_list),
+ .type = SND_TPLG_TYPE_MIXER,
+ .tsoc = SND_SOC_TPLG_TYPE_MIXER,
+ .size = sizeof(struct snd_soc_tplg_mixer_control),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "control enum",
+ .loff = offsetof(snd_tplg_t, enum_list),
+ .type = SND_TPLG_TYPE_ENUM,
+ .tsoc = SND_SOC_TPLG_TYPE_ENUM,
+ .size = sizeof(struct snd_soc_tplg_enum_control),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "control extended (bytes)",
+ .loff = offsetof(snd_tplg_t, bytes_ext_list),
+ .type = SND_TPLG_TYPE_BYTES,
+ .tsoc = SND_SOC_TPLG_TYPE_BYTES,
+ .size = sizeof(struct snd_soc_tplg_bytes_control),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "dapm widget",
+ .loff = offsetof(snd_tplg_t, widget_list),
+ .type = SND_TPLG_TYPE_DAPM_WIDGET,
+ .tsoc = SND_SOC_TPLG_TYPE_DAPM_WIDGET,
+ .size = sizeof(struct snd_soc_tplg_dapm_widget),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "pcm",
+ .loff = offsetof(snd_tplg_t, pcm_list),
+ .type = SND_TPLG_TYPE_PCM,
+ .tsoc = SND_SOC_TPLG_TYPE_PCM,
+ .size = sizeof(struct snd_soc_tplg_pcm),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "physical dai",
+ .loff = offsetof(snd_tplg_t, dai_list),
+ .type = SND_TPLG_TYPE_DAI,
+ .tsoc = SND_SOC_TPLG_TYPE_DAI,
+ .size = sizeof(struct snd_soc_tplg_dai),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "be",
+ .loff = offsetof(snd_tplg_t, be_list),
+ .type = SND_TPLG_TYPE_BE,
+ .tsoc = SND_SOC_TPLG_TYPE_BACKEND_LINK,
+ .size = sizeof(struct snd_soc_tplg_link_config),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "cc",
+ .loff = offsetof(snd_tplg_t, cc_list),
+ .type = SND_TPLG_TYPE_CC,
+ .tsoc = SND_SOC_TPLG_TYPE_CODEC_LINK,
+ .size = sizeof(struct snd_soc_tplg_link_config),
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "route (dapm graph)",
+ .loff = offsetof(snd_tplg_t, route_list),
+ .type = SND_TPLG_TYPE_DAPM_GRAPH,
+ .tsoc = SND_SOC_TPLG_TYPE_DAPM_GRAPH,
+ .build = 1,
+ },
+ {
+ .name = "private data",
+ .loff = offsetof(snd_tplg_t, pdata_list),
+ .type = SND_TPLG_TYPE_DATA,
+ .tsoc = SND_SOC_TPLG_TYPE_PDATA,
+ .build = 1,
+ .enew = 1,
+ },
+ {
+ .name = "text",
+ .loff = offsetof(snd_tplg_t, text_list),
+ .type = SND_TPLG_TYPE_TEXT,
+ .size = sizeof(struct tplg_texts),
+ .enew = 1,
+ },
+ {
+ .name = "tlv",
+ .loff = offsetof(snd_tplg_t, tlv_list),
+ .type = SND_TPLG_TYPE_TLV,
+ .size = sizeof(struct snd_soc_tplg_ctl_tlv),
+ .enew = 1,
+ },
+ {
+ .name = "stream config",
+ .loff = offsetof(snd_tplg_t, pcm_config_list),
+ .type = SND_TPLG_TYPE_STREAM_CONFIG,
+ .size = sizeof(struct snd_soc_tplg_stream),
+ .enew = 1,
+ },
+ {
+ .name = "stream capabilities",
+ .loff = offsetof(snd_tplg_t, pcm_caps_list),
+ .type = SND_TPLG_TYPE_STREAM_CAPS,
+ .size = sizeof(struct snd_soc_tplg_stream_caps),
+ .enew = 1,
+ },
+ {
+ .name = "token",
+ .loff = offsetof(snd_tplg_t, token_list),
+ .type = SND_TPLG_TYPE_TOKEN,
+ .enew = 1,
+ },
+ {
+ .name = "tuple",
+ .loff = offsetof(snd_tplg_t, tuple_list),
+ .type = SND_TPLG_TYPE_TUPLE,
+ .free = tplg_free_tuples,
+ .enew = 1,
+ },
+ {
+ .name = "hw config",
+ .loff = offsetof(snd_tplg_t, hw_cfg_list),
+ .type = SND_TPLG_TYPE_HW_CONFIG,
+ .size = sizeof(struct snd_soc_tplg_hw_config),
+ .enew = 1,
+ }
+};
+
+unsigned int tplg_table_items = ARRAY_SIZE(tplg_table);
+
int tplg_ref_add(struct tplg_elem *elem, int type, const char* id)
{
struct tplg_ref *ref;
@@ -152,9 +300,12 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
const char *name,
enum snd_tplg_type type)
{
+ struct tplg_table *tptr;
struct tplg_elem *elem;
+ struct list_head *list;
const char *id;
int obj_size = 0;
+ unsigned index;
void *obj;
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -191,79 +342,24 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
} else if (name != NULL)
snd_strlcpy(elem->id, name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- switch (type) {
- case SND_TPLG_TYPE_DATA:
- tplg_elem_insert(elem, &tplg->pdata_list);
- break;
- case SND_TPLG_TYPE_MANIFEST:
- tplg_elem_insert(elem, &tplg->manifest_list);
- obj_size = sizeof(struct snd_soc_tplg_manifest);
- break;
- case SND_TPLG_TYPE_TEXT:
- tplg_elem_insert(elem, &tplg->text_list);
- obj_size = sizeof(struct tplg_texts);
- break;
- case SND_TPLG_TYPE_TLV:
- tplg_elem_insert(elem, &tplg->tlv_list);
- elem->size = sizeof(struct snd_soc_tplg_ctl_tlv);
- break;
- case SND_TPLG_TYPE_BYTES:
- tplg_elem_insert(elem, &tplg->bytes_ext_list);
- obj_size = sizeof(struct snd_soc_tplg_bytes_control);
- break;
- case SND_TPLG_TYPE_ENUM:
- tplg_elem_insert(elem, &tplg->enum_list);
- obj_size = sizeof(struct snd_soc_tplg_enum_control);
- break;
- case SND_TPLG_TYPE_MIXER:
- tplg_elem_insert(elem, &tplg->mixer_list);
- obj_size = sizeof(struct snd_soc_tplg_mixer_control);
- break;
- case SND_TPLG_TYPE_DAPM_WIDGET:
- tplg_elem_insert(elem, &tplg->widget_list);
- obj_size = sizeof(struct snd_soc_tplg_dapm_widget);
- break;
- case SND_TPLG_TYPE_STREAM_CONFIG:
- tplg_elem_insert(elem, &tplg->pcm_config_list);
- obj_size = sizeof(struct snd_soc_tplg_stream);
+ for (index = 0; index < tplg_table_items; index++) {
+ tptr = &tplg_table[index];
+ if (!tptr->enew)
+ continue;
+ if ((int)type != tptr->type)
+ continue;
break;
- case SND_TPLG_TYPE_STREAM_CAPS:
- tplg_elem_insert(elem, &tplg->pcm_caps_list);
- obj_size = sizeof(struct snd_soc_tplg_stream_caps);
- break;
- case SND_TPLG_TYPE_PCM:
- tplg_elem_insert(elem, &tplg->pcm_list);
- obj_size = sizeof(struct snd_soc_tplg_pcm);
- break;
- case SND_TPLG_TYPE_DAI:
- tplg_elem_insert(elem, &tplg->dai_list);
- obj_size = sizeof(struct snd_soc_tplg_dai);
- break;
- case SND_TPLG_TYPE_BE:
- case SND_TPLG_TYPE_LINK:
- tplg_elem_insert(elem, &tplg->be_list);
- obj_size = sizeof(struct snd_soc_tplg_link_config);
- break;
- case SND_TPLG_TYPE_CC:
- tplg_elem_insert(elem, &tplg->cc_list);
- obj_size = sizeof(struct snd_soc_tplg_link_config);
- break;
- case SND_TPLG_TYPE_TOKEN:
- tplg_elem_insert(elem, &tplg->token_list);
- break;
- case SND_TPLG_TYPE_TUPLE:
- tplg_elem_insert(elem, &tplg->tuple_list);
- elem->free = tplg_free_tuples;
- break;
- case SND_TPLG_TYPE_HW_CONFIG:
- tplg_elem_insert(elem, &tplg->hw_cfg_list);
- obj_size = sizeof(struct snd_soc_tplg_hw_config);
- break;
- default:
+ }
+ if (index >= tplg_table_items) {
free(elem);
return NULL;
}
+ list = (struct list_head *)((void *)tplg + tptr->loff);
+ tplg_elem_insert(elem, list);
+ obj_size = tptr->size;
+ elem->free = tptr->free;
+
/* create new object too if required */
if (obj_size > 0) {
obj = calloc(1, obj_size);
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 77a681897a85..0987898f8336 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -196,6 +196,21 @@ struct map_elem {
int id;
};
+/* mapping table */
+struct tplg_table {
+ const char *name;
+ off_t loff;
+ size_t size;
+ int type;
+ int tsoc;
+ unsigned build: 1;
+ unsigned enew: 1;
+ void (*free)(void *);
+};
+
+extern struct tplg_table tplg_table[];
+extern unsigned int tplg_table_items;
+
int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
int (*fcn)(snd_tplg_t *, snd_config_t *, void *),
void *private);
--
2.16.4

View File

@ -1,331 +0,0 @@
From 4a0efdc87355d5789876e20b9530dc85224ad281 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 15 Dec 2019 17:24:50 +0100
Subject: [PATCH 42/63] topology: add parser to the tplg_table
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/elem.c | 35 ++++++++++++++++++
src/topology/parser.c | 90 +++++------------------------------------------
src/topology/tplg_local.h | 3 ++
3 files changed, 47 insertions(+), 81 deletions(-)
diff --git a/src/topology/elem.c b/src/topology/elem.c
index 92ca7da4c4aa..e79a68b71a91 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -23,112 +23,139 @@
struct tplg_table tplg_table[] = {
{
.name = "manifest",
+ .id = "SectionManifest",
.loff = offsetof(snd_tplg_t, manifest_list),
.type = SND_TPLG_TYPE_MANIFEST,
.tsoc = SND_SOC_TPLG_TYPE_MANIFEST,
.size = sizeof(struct snd_soc_tplg_manifest),
.enew = 1,
+ .parse = tplg_parse_manifest_data,
},
{
.name = "control mixer",
+ .id = "SectionControlMixer",
.loff = offsetof(snd_tplg_t, mixer_list),
.type = SND_TPLG_TYPE_MIXER,
.tsoc = SND_SOC_TPLG_TYPE_MIXER,
.size = sizeof(struct snd_soc_tplg_mixer_control),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_control_mixer,
},
{
.name = "control enum",
+ .id = "SectionControlEnum",
.loff = offsetof(snd_tplg_t, enum_list),
.type = SND_TPLG_TYPE_ENUM,
.tsoc = SND_SOC_TPLG_TYPE_ENUM,
.size = sizeof(struct snd_soc_tplg_enum_control),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_control_enum,
},
{
.name = "control extended (bytes)",
+ .id = "SectionControlBytes",
.loff = offsetof(snd_tplg_t, bytes_ext_list),
.type = SND_TPLG_TYPE_BYTES,
.tsoc = SND_SOC_TPLG_TYPE_BYTES,
.size = sizeof(struct snd_soc_tplg_bytes_control),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_control_bytes,
},
{
.name = "dapm widget",
+ .id = "SectionWidget",
.loff = offsetof(snd_tplg_t, widget_list),
.type = SND_TPLG_TYPE_DAPM_WIDGET,
.tsoc = SND_SOC_TPLG_TYPE_DAPM_WIDGET,
.size = sizeof(struct snd_soc_tplg_dapm_widget),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_dapm_widget,
},
{
.name = "pcm",
+ .id = "SectionPCM",
.loff = offsetof(snd_tplg_t, pcm_list),
.type = SND_TPLG_TYPE_PCM,
.tsoc = SND_SOC_TPLG_TYPE_PCM,
.size = sizeof(struct snd_soc_tplg_pcm),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_pcm,
},
{
.name = "physical dai",
+ .id = "SectionDAI",
.loff = offsetof(snd_tplg_t, dai_list),
.type = SND_TPLG_TYPE_DAI,
.tsoc = SND_SOC_TPLG_TYPE_DAI,
.size = sizeof(struct snd_soc_tplg_dai),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_dai,
},
{
.name = "be",
+ .id = "SectionBE",
+ .id2 = "SectionLink",
.loff = offsetof(snd_tplg_t, be_list),
.type = SND_TPLG_TYPE_BE,
.tsoc = SND_SOC_TPLG_TYPE_BACKEND_LINK,
.size = sizeof(struct snd_soc_tplg_link_config),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_link,
},
{
.name = "cc",
+ .id = "SectionCC",
.loff = offsetof(snd_tplg_t, cc_list),
.type = SND_TPLG_TYPE_CC,
.tsoc = SND_SOC_TPLG_TYPE_CODEC_LINK,
.size = sizeof(struct snd_soc_tplg_link_config),
.build = 1,
.enew = 1,
+ .parse = tplg_parse_cc,
},
{
.name = "route (dapm graph)",
+ .id = "SectionGraph",
.loff = offsetof(snd_tplg_t, route_list),
.type = SND_TPLG_TYPE_DAPM_GRAPH,
.tsoc = SND_SOC_TPLG_TYPE_DAPM_GRAPH,
.build = 1,
+ .parse = tplg_parse_dapm_graph,
},
{
.name = "private data",
+ .id = "SectionData",
.loff = offsetof(snd_tplg_t, pdata_list),
.type = SND_TPLG_TYPE_DATA,
.tsoc = SND_SOC_TPLG_TYPE_PDATA,
.build = 1,
.enew = 1,
+ .parse = tplg_parse_data,
},
{
.name = "text",
+ .id = "SectionText",
.loff = offsetof(snd_tplg_t, text_list),
.type = SND_TPLG_TYPE_TEXT,
.size = sizeof(struct tplg_texts),
.enew = 1,
+ .parse = tplg_parse_text,
},
{
.name = "tlv",
+ .id = "SectionTLV",
.loff = offsetof(snd_tplg_t, tlv_list),
.type = SND_TPLG_TYPE_TLV,
.size = sizeof(struct snd_soc_tplg_ctl_tlv),
.enew = 1,
+ .parse = tplg_parse_tlv,
},
{
.name = "stream config",
@@ -139,30 +166,38 @@ struct tplg_table tplg_table[] = {
},
{
.name = "stream capabilities",
+ .id = "SectionPCMCapabilities",
.loff = offsetof(snd_tplg_t, pcm_caps_list),
.type = SND_TPLG_TYPE_STREAM_CAPS,
.size = sizeof(struct snd_soc_tplg_stream_caps),
.enew = 1,
+ .parse = tplg_parse_stream_caps,
},
{
.name = "token",
+ .id = "SectionVendorTokens",
.loff = offsetof(snd_tplg_t, token_list),
.type = SND_TPLG_TYPE_TOKEN,
.enew = 1,
+ .parse = tplg_parse_tokens,
},
{
.name = "tuple",
+ .id = "SectionVendorTuples",
.loff = offsetof(snd_tplg_t, tuple_list),
.type = SND_TPLG_TYPE_TUPLE,
.free = tplg_free_tuples,
.enew = 1,
+ .parse = tplg_parse_tuples,
},
{
.name = "hw config",
+ .id = "SectionHWConfig",
.loff = offsetof(snd_tplg_t, hw_cfg_list),
.type = SND_TPLG_TYPE_HW_CONFIG,
.size = sizeof(struct snd_soc_tplg_hw_config),
.enew = 1,
+ .parse = tplg_parse_hw_config,
}
};
diff --git a/src/topology/parser.c b/src/topology/parser.c
index ed864d3223c4..11202769391c 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -142,87 +142,11 @@ int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
{
- static struct _parser {
- const char *id;
- int (*parser)(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
- } *p, parsers[] = {
- {
- .id = "SectionTLV",
- .parser = tplg_parse_tlv
- },
- {
- .id = "SectionControlMixer",
- .parser = tplg_parse_control_mixer
- },
- {
- .id = "SectionControlEnum",
- .parser = tplg_parse_control_enum
- },
- {
- .id = "SectionControlBytes",
- .parser = tplg_parse_control_bytes
- },
- {
- .id = "SectionWidget",
- .parser = tplg_parse_dapm_widget
- },
- {
- .id = "SectionPCMCapabilities",
- .parser = tplg_parse_stream_caps
- },
- {
- .id = "SectionPCM",
- .parser = tplg_parse_pcm
- },
- {
- .id = "SectionDAI",
- .parser = tplg_parse_dai
- },
- {
- .id = "SectionHWConfig",
- .parser = tplg_parse_hw_config
- },
- {
- .id = "SectionLink",
- .parser = tplg_parse_link
- },
- {
- .id = "SectionBE",
- .parser = tplg_parse_link
- },
- {
- .id = "SectionCC",
- .parser = tplg_parse_cc
- },
- {
- .id = "SectionGraph",
- .parser = tplg_parse_dapm_graph
- },
- {
- .id = "SectionText",
- .parser = tplg_parse_text
- },
- {
- .id = "SectionData",
- .parser = tplg_parse_data
- },
- {
- .id = "SectionVendorTokens",
- .parser = tplg_parse_tokens
- },
- {
- .id = "SectionVendorTuples",
- .parser = tplg_parse_tuples
- },
- {
- .id = "SectionManifest",
- .parser = tplg_parse_manifest_data
- },
- };
int (*parser)(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
snd_config_iterator_t i, next;
snd_config_t *n;
const char *id;
+ struct tplg_table *p;
unsigned int idx;
int err;
@@ -239,10 +163,14 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
continue;
parser = NULL;
- for (idx = 0; idx < ARRAY_SIZE(parsers); idx++) {
- p = &parsers[idx];
- if (strcmp(id, p->id) == 0) {
- parser = p->parser;
+ for (idx = 0; idx < tplg_table_items; idx++) {
+ p = &tplg_table[idx];
+ if (p->id && strcmp(id, p->id) == 0) {
+ parser = p->parse;
+ break;
+ }
+ if (p->id2 && strcmp(id, p->id2) == 0) {
+ parser = p->parse;
break;
}
}
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 0987898f8336..bea88ba35608 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -199,6 +199,8 @@ struct map_elem {
/* mapping table */
struct tplg_table {
const char *name;
+ const char *id;
+ const char *id2;
off_t loff;
size_t size;
int type;
@@ -206,6 +208,7 @@ struct tplg_table {
unsigned build: 1;
unsigned enew: 1;
void (*free)(void *);
+ int (*parse)(snd_tplg_t *tplg, snd_config_t *cfg, void *priv);
};
extern struct tplg_table tplg_table[];
--
2.16.4

File diff suppressed because it is too large Load Diff

View File

@ -1,109 +0,0 @@
From b336aea507b80493cdae439f09f710eec4bcd4ae Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 20 Dec 2019 14:59:00 +0100
Subject: [PATCH 44/63] topology: add snd_tplg_create() with flags
Add SND_TPLG_CREATE_VERBOSE and SND_TPLG_CREATE_DAPM_NOSORT
flags for the special operations.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/topology.h | 10 ++++++++++
src/topology/dapm.c | 5 ++++-
src/topology/parser.c | 10 +++++++++-
src/topology/tplg_local.h | 1 +
4 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/include/topology.h b/include/topology.h
index 69aa5ed733e3..63c13a9885e9 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -771,12 +771,22 @@ enum snd_tplg_type {
/** Fit for all user cases */
#define SND_TPLG_INDEX_ALL 0
+/** Flags for the snd_tplg_create */
+#define SND_TPLG_CREATE_VERBOSE (1<<0) /*!< Verbose output */
+#define SND_TPLG_CREATE_DAPM_NOSORT (1<<1) /*!< Do not sort DAPM objects by index */
+
/**
* \brief Create a new topology parser instance.
* \return New topology parser instance
*/
snd_tplg_t *snd_tplg_new(void);
+/**
+ * \brief Create a new topology parser instance.
+ * \return New topology parser instance
+ */
+snd_tplg_t *snd_tplg_create(int flags);
+
/**
* \brief Free a topology parser instance.
* \param tplg Topology parser instance
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 2bdacedca125..d6c15fc1dfaa 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -268,7 +268,10 @@ struct tplg_elem *tplg_elem_new_route(snd_tplg_t *tplg, int index)
return NULL;
elem->index = index;
- tplg_elem_insert(elem, &tplg->route_list);
+ if (tplg->dapm_sort)
+ tplg_elem_insert(elem, &tplg->route_list);
+ else
+ list_add_tail(&elem->list, &tplg->route_list);
strcpy(elem->id, "line");
elem->type = SND_TPLG_TYPE_DAPM_GRAPH;
elem->size = sizeof(*line);
diff --git a/src/topology/parser.c b/src/topology/parser.c
index de5edd1b6591..8f810f751533 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -432,7 +432,7 @@ static bool is_little_endian(void)
return false;
}
-snd_tplg_t *snd_tplg_new(void)
+snd_tplg_t *snd_tplg_create(int flags)
{
snd_tplg_t *tplg;
@@ -445,6 +445,9 @@ snd_tplg_t *snd_tplg_new(void)
if (!tplg)
return NULL;
+ tplg->verbose = !!(flags & SND_TPLG_CREATE_VERBOSE);
+ tplg->dapm_sort = (flags & SND_TPLG_CREATE_DAPM_NOSORT) == 0;
+
tplg->manifest.size = sizeof(struct snd_soc_tplg_manifest);
INIT_LIST_HEAD(&tplg->tlv_list);
@@ -469,6 +472,11 @@ snd_tplg_t *snd_tplg_new(void)
return tplg;
}
+snd_tplg_t *snd_tplg_new(void)
+{
+ return snd_tplg_create(0);
+}
+
void snd_tplg_free(snd_tplg_t *tplg)
{
free(tplg->bin);
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 42a3aa96ba0e..74b3a55cada4 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -66,6 +66,7 @@ struct snd_tplg {
size_t bin_size;
int verbose;
+ unsigned int dapm_sort: 1;
unsigned int version;
/* runtime state */
--
2.16.4

View File

@ -1,44 +0,0 @@
From 0793ef064a97afd0b1335af0d187ede227b90582 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 20 Dec 2019 21:28:30 +0100
Subject: [PATCH 45/63] topology: add snd_tplg_version() function
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/topology.h | 6 ++++++
src/topology/parser.c | 5 +++++
2 files changed, 11 insertions(+)
diff --git a/include/topology.h b/include/topology.h
index 63c13a9885e9..37bced1a4434 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -775,6 +775,12 @@ enum snd_tplg_type {
#define SND_TPLG_CREATE_VERBOSE (1<<0) /*!< Verbose output */
#define SND_TPLG_CREATE_DAPM_NOSORT (1<<1) /*!< Do not sort DAPM objects by index */
+/**
+ * \brief Return the version of the topology library.
+ * \return A static string with the version number.
+ */
+const char *snd_tplg_version(void);
+
/**
* \brief Create a new topology parser instance.
* \return New topology parser instance
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 8f810f751533..1eaa24bd42f5 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -503,3 +503,8 @@ void snd_tplg_free(snd_tplg_t *tplg)
free(tplg);
}
+
+const char *snd_tplg_version(void)
+{
+ return SND_LIB_VERSION_STR;
+}
--
2.16.4

View File

@ -1,876 +0,0 @@
From f42b2c088a23e1c6156c0d5710efd7689b8c15be Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 20 Dec 2019 23:48:40 +0100
Subject: [PATCH 46/63] topology: cleanup the SNDERR() calls
- remove the wrong new lines
- remove error/warning prefixes (error is error)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 16 +++++++--------
src/topology/channel.c | 2 +-
src/topology/ctl.c | 36 +++++++++++++++-------------------
src/topology/dapm.c | 40 +++++++++++++++++--------------------
src/topology/data.c | 53 +++++++++++++++++++++++++-------------------------
src/topology/parser.c | 33 +++++++++++++++----------------
src/topology/pcm.c | 29 +++++++++++++--------------
src/topology/text.c | 2 +-
8 files changed, 99 insertions(+), 112 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index cadb55830809..74c44405e653 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -65,8 +65,8 @@ static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
/* make sure file offset is aligned with the calculated HDR offset */
if (tplg->bin_pos != tplg->next_hdr_pos) {
- SNDERR("error: New header is at offset 0x%zx but file"
- " offset 0x%zx is %s by %ld bytes\n",
+ SNDERR("New header is at offset 0x%zx but file"
+ " offset 0x%zx is %s by %ld bytes",
tplg->next_hdr_pos, tplg->bin_pos,
tplg->bin_pos > tplg->next_hdr_pos ? "ahead" : "behind",
labs(tplg->bin_pos - tplg->next_hdr_pos));
@@ -108,7 +108,7 @@ static int write_elem_block(snd_tplg_t *tplg,
ret = write_block_header(tplg, tplg_type, elem->vendor_type,
tplg->version, elem->index, block_size, count);
if (ret < 0) {
- SNDERR("error: failed to write %s block %d\n",
+ SNDERR("failed to write %s block %d",
obj_name, ret);
return ret;
}
@@ -148,7 +148,7 @@ static int write_elem_block(snd_tplg_t *tplg,
/* make sure we have written the correct size */
if (total_size != size) {
- SNDERR("error: size mismatch. Expected %zu wrote %zu\n",
+ SNDERR("size mismatch. Expected %zu wrote %zu",
size, total_size);
return -EIO;
}
@@ -221,7 +221,7 @@ static ssize_t write_manifest_data(snd_tplg_t *tplg)
tplg->version, 0,
sizeof(tplg->manifest) + tplg->manifest.priv.size, 1);
if (ret < 0) {
- SNDERR("error: failed to write manifest block\n");
+ SNDERR("failed to write manifest block");
return ret;
}
@@ -266,7 +266,7 @@ int tplg_write_data(snd_tplg_t *tplg)
/* write manifest */
ret = write_manifest_data(tplg);
if (ret < 0) {
- SNDERR("failed to write manifest %d\n", ret);
+ SNDERR("failed to write manifest %d", ret);
return ret;
}
@@ -286,7 +286,7 @@ int tplg_write_data(snd_tplg_t *tplg)
ret = write_elem_block(tplg, list, size,
tptr->tsoc, tptr->name);
if (ret < 0) {
- SNDERR("failed to write %s elements: %s\n",
+ SNDERR("failed to write %s elements: %s",
tptr->name, snd_strerror(-ret));
return ret;
}
@@ -295,7 +295,7 @@ int tplg_write_data(snd_tplg_t *tplg)
verbose(tplg, "total size is 0x%zx/%zd\n", tplg->bin_pos, tplg->bin_pos);
if (total_size != tplg->bin_pos) {
- SNDERR("total size mismatch (%zd != %zd)\n",
+ SNDERR("total size mismatch (%zd != %zd)",
total_size, tplg->bin_pos);
return -EINVAL;
}
diff --git a/src/topology/channel.c b/src/topology/channel.c
index b54a10c89379..110775a8053d 100644
--- a/src/topology/channel.c
+++ b/src/topology/channel.c
@@ -104,7 +104,7 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
channel_id = lookup_channel(id);
if (channel_id < 0) {
- SNDERR("error: invalid channel %s\n", id);
+ SNDERR("invalid channel %s", id);
return -EINVAL;
}
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 979cc1b035f1..03874b27c76f 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -94,7 +94,7 @@ int parse_access(snd_config_t *cfg,
if (strcmp(id, "access") == 0) {
err = parse_access_values(n, hdr);
if (err < 0) {
- SNDERR("error: failed to parse access");
+ SNDERR("failed to parse access");
return err;
}
continue;
@@ -187,8 +187,8 @@ static int tplg_build_mixer_control(snd_tplg_t *tplg,
}
if (!ref->elem) {
- SNDERR("error: cannot find '%s' referenced by"
- " control '%s'\n", ref->id, elem->id);
+ SNDERR("cannot find '%s' referenced by"
+ " control '%s'", ref->id, elem->id);
return -EINVAL;
} else if (err < 0)
return err;
@@ -236,8 +236,8 @@ static int tplg_build_enum_control(snd_tplg_t *tplg,
return err;
}
if (!ref->elem) {
- SNDERR("error: cannot find '%s' referenced by"
- " control '%s'\n", ref->id, elem->id);
+ SNDERR("cannot find '%s' referenced by"
+ " control '%s'", ref->id, elem->id);
return -EINVAL;
}
}
@@ -341,10 +341,8 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
n = snd_config_iterator_entry(i);
/* get ID */
- if (snd_config_get_id(n, &id) < 0) {
- SNDERR("error: cant get ID\n");
+ if (snd_config_get_id(n, &id) < 0)
return -EINVAL;
- }
/* get value */
if (tplg_get_integer(n, &val, 0))
@@ -360,7 +358,7 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
else if (strcmp(id, "mute") == 0)
scale->mute = val;
else
- SNDERR("error: unknown key %s\n", id);
+ SNDERR("unknown id '%s'", id);
}
return 0;
@@ -389,7 +387,7 @@ int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "scale") == 0) {
err = tplg_parse_tlv_dbscale(n, elem);
if (err < 0) {
- SNDERR("error: failed to DBScale");
+ SNDERR("failed to DBScale");
return err;
}
continue;
@@ -651,8 +649,7 @@ int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "channel") == 0) {
if (ec->num_channels >= SND_SOC_TPLG_MAX_CHAN) {
- SNDERR("error: too many channels %s\n",
- elem->id);
+ SNDERR("too many channels %s", elem->id);
return -EINVAL;
}
@@ -779,8 +776,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
if (strcmp(id, "channel") == 0) {
if (mc->num_channels >= SND_SOC_TPLG_MAX_CHAN) {
- SNDERR("error: too many channels %s\n",
- elem->id);
+ SNDERR("too many channels %s", elem->id);
return -EINVAL;
}
@@ -933,7 +929,7 @@ static int init_ctl_hdr(struct snd_soc_tplg_ctl_hdr *hdr,
struct snd_soc_tplg_tlv_dbscale *scale;
if (!tlvt) {
- SNDERR("error: missing TLV data\n");
+ SNDERR("missing TLV data");
return -EINVAL;
}
@@ -952,7 +948,7 @@ static int init_ctl_hdr(struct snd_soc_tplg_ctl_hdr *hdr,
/* TODO: add support for other TLV types */
default:
- SNDERR("error: unsupported TLV type %d\n", tlv->type);
+ SNDERR("unsupported TLV type %d", tlv->type);
break;
}
}
@@ -971,7 +967,7 @@ int tplg_add_mixer(snd_tplg_t *tplg, struct snd_tplg_mixer_template *mixer,
tplg_dbg(" Control Mixer: %s\n", mixer->hdr.name);
if (mixer->hdr.type != SND_SOC_TPLG_TYPE_MIXER) {
- SNDERR("error: invalid mixer type %d\n", mixer->hdr.type);
+ SNDERR("invalid mixer type %d", mixer->hdr.type);
return -EINVAL;
}
@@ -1039,7 +1035,7 @@ int tplg_add_enum(snd_tplg_t *tplg, struct snd_tplg_enum_template *enum_ctl,
tplg_dbg(" Control Enum: %s\n", enum_ctl->hdr.name);
if (enum_ctl->hdr.type != SND_SOC_TPLG_TYPE_ENUM) {
- SNDERR("error: invalid enum type %d\n", enum_ctl->hdr.type);
+ SNDERR("invalid enum type %d", enum_ctl->hdr.type);
return -EINVAL;
}
@@ -1113,7 +1109,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl,
tplg_dbg(" Control Bytes: %s\n", bytes_ctl->hdr.name);
if (bytes_ctl->hdr.type != SND_SOC_TPLG_TYPE_BYTES) {
- SNDERR("error: invalid bytes type %d\n", bytes_ctl->hdr.type);
+ SNDERR("invalid bytes type %d", bytes_ctl->hdr.type);
return -EINVAL;
}
@@ -1157,7 +1153,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl,
if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
if ((be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)
!= SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE) {
- SNDERR("error: Invalid TLV bytes control access 0x%x\n",
+ SNDERR("Invalid TLV bytes control access 0x%x",
be->hdr.access);
tplg_elem_free(elem);
return -EINVAL;
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index d6c15fc1dfaa..f61fe07157ac 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -154,8 +154,7 @@ static int tplg_build_widget(snd_tplg_t *tplg, struct tplg_elem *elem)
}
if (!ref->elem) {
- SNDERR("error: cannot find '%s'"
- " referenced by widget '%s'\n",
+ SNDERR("cannot find '%s' referenced by widget '%s'",
ref->id, elem->id);
return -EINVAL;
}
@@ -179,8 +178,7 @@ int tplg_build_widgets(snd_tplg_t *tplg)
elem = list_entry(pos, struct tplg_elem, list);
if (!elem->widget || elem->type != SND_TPLG_TYPE_DAPM_WIDGET) {
- SNDERR("error: invalid widget '%s'\n",
- elem->id);
+ SNDERR("invalid widget '%s'", elem->id);
return -EINVAL;
}
@@ -207,8 +205,7 @@ int tplg_build_routes(snd_tplg_t *tplg)
elem = list_entry(pos, struct tplg_elem, list);
if (!elem->route || elem->type != SND_TPLG_TYPE_DAPM_GRAPH) {
- SNDERR("error: invalid route '%s'\n",
- elem->id);
+ SNDERR("invalid route '%s'", elem->id);
return -EINVAL;
}
@@ -218,14 +215,13 @@ int tplg_build_routes(snd_tplg_t *tplg)
/* validate sink */
if (strlen(route->sink) <= 0) {
- SNDERR("error: no sink\n");
+ SNDERR("no sink");
return -EINVAL;
}
if (!tplg_elem_lookup(&tplg->widget_list, route->sink,
SND_TPLG_TYPE_DAPM_WIDGET, SND_TPLG_INDEX_ALL)) {
- SNDERR("warning: undefined sink widget/stream '%s'\n",
- route->sink);
+ SNDERR("undefined sink widget/stream '%s'", route->sink);
}
/* validate control name */
@@ -234,21 +230,21 @@ int tplg_build_routes(snd_tplg_t *tplg)
SND_TPLG_TYPE_MIXER, elem->index) &&
!tplg_elem_lookup(&tplg->enum_list, route->control,
SND_TPLG_TYPE_ENUM, elem->index)) {
- SNDERR("warning: Undefined mixer/enum control '%s'\n",
- route->control);
+ SNDERR("Undefined mixer/enum control '%s'",
+ route->control);
}
}
/* validate source */
if (strlen(route->source) <= 0) {
- SNDERR("error: no source\n");
+ SNDERR("no source");
return -EINVAL;
}
if (!tplg_elem_lookup(&tplg->widget_list, route->source,
SND_TPLG_TYPE_DAPM_WIDGET, SND_TPLG_INDEX_ALL)) {
- SNDERR("warning: Undefined source widget/stream '%s'\n",
- route->source);
+ SNDERR("Undefined source widget/stream '%s'",
+ route->source);
}
/* add graph to manifest */
@@ -300,7 +296,7 @@ static int tplg_parse_line(const char *text,
len = strlen(buf);
if (len <= 2) {
- SNDERR("error: invalid route \"%s\"\n", buf);
+ SNDERR("invalid route \"%s\"", buf);
return -EINVAL;
}
@@ -309,7 +305,7 @@ static int tplg_parse_line(const char *text,
if (buf[i] == ',')
goto second;
}
- SNDERR("error: invalid route \"%s\"\n", buf);
+ SNDERR("invalid route \"%s\"", buf);
return -EINVAL;
second:
@@ -323,7 +319,7 @@ second:
goto done;
}
- SNDERR("error: invalid route \"%s\"\n", buf);
+ SNDERR("invalid route \"%s\"", buf);
return -EINVAL;
done:
@@ -378,7 +374,7 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
int index = -1;
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound is expected for dapm graph definition\n");
+ SNDERR("compound is expected for dapm graph definition");
return -EINVAL;
}
@@ -401,13 +397,13 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "lines") == 0) {
if (index < 0) {
- SNDERR("error: failed to parse dapm graph %s, missing index\n",
+ SNDERR("failed to parse dapm graph %s, missing index",
graph_id);
return -EINVAL;
}
err = tplg_parse_routes(tplg, n, index);
if (err < 0) {
- SNDERR("error: failed to parse dapm graph %s\n",
+ SNDERR("failed to parse dapm graph %s",
graph_id);
return err;
}
@@ -528,7 +524,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
widget_type = lookup_widget(val);
if (widget_type < 0){
- SNDERR("Widget '%s': Unsupported widget type %s\n",
+ SNDERR("widget '%s': Unsupported widget type %s",
elem->id, val);
return -EINVAL;
}
@@ -821,7 +817,7 @@ int tplg_add_widget_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
break;
default:
- SNDERR("error: widget %s: invalid type %d for ctl %d\n",
+ SNDERR("widget %s: invalid type %d for ctl %d",
wt->name, ct->type, i);
break;
}
diff --git a/src/topology/data.c b/src/topology/data.c
index 11cd73f5ed6e..f00ed3011869 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -61,7 +61,7 @@ struct snd_soc_tplg_private *get_priv_data(struct tplg_elem *elem)
priv = &elem->pcm->priv;
break;
default:
- SNDERR("error: '%s': no support for private data for type %d\n",
+ SNDERR("'%s': no support for private data for type %d",
elem->id, elem->type);
}
@@ -95,7 +95,7 @@ int tplg_parse_refs(snd_config_t *cfg, struct tplg_elem *elem,
}
if (cfg_type != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound type expected for %s", elem->id);
+ SNDERR("compound type expected for %s", elem->id);
return -EINVAL;
}
@@ -183,8 +183,7 @@ static int tplg_parse_data_file(snd_config_t *cfg, struct tplg_elem *elem)
fp = fopen(filename, "r");
if (fp == NULL) {
- SNDERR("error: invalid data file path '%s'\n",
- filename);
+ SNDERR("invalid data file path '%s'", filename);
return -errno;
}
@@ -192,12 +191,12 @@ static int tplg_parse_data_file(snd_config_t *cfg, struct tplg_elem *elem)
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
if (size <= 0) {
- SNDERR("error: invalid data file size %zu\n", size);
+ SNDERR("invalid data file size %zu", size);
ret = -EINVAL;
goto err;
}
if (size > TPLG_MAX_PRIV_SIZE) {
- SNDERR("error: data file too big %zu\n", size);
+ SNDERR("data file too big %zu", size);
ret = -EINVAL;
goto err;
}
@@ -350,7 +349,7 @@ static int get_uuid(const char *str, unsigned char *uuid_le)
if ((errno == ERANGE && val == ULONG_MAX)
|| (errno != 0 && val == 0)
|| (val > UCHAR_MAX)) {
- SNDERR("error: invalid value for uuid\n");
+ SNDERR("invalid value for uuid");
ret = -EINVAL;
goto out;
}
@@ -365,7 +364,7 @@ static int get_uuid(const char *str, unsigned char *uuid_le)
}
if (values < 16) {
- SNDERR("error: less than 16 integers for uuid\n");
+ SNDERR("less than 16 integers for uuid");
ret = -EINVAL;
}
@@ -446,7 +445,7 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
num = get_hex_num(value);
if (num <= 0) {
- SNDERR("error: malformed hex variable list %s\n", value);
+ SNDERR("malformed hex variable list %s", value);
return -EINVAL;
}
@@ -454,7 +453,7 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
priv = elem->data;
if (size > TPLG_MAX_PRIV_SIZE) {
- SNDERR("error: data too big %d\n", size);
+ SNDERR("data too big %d", size);
return -EINVAL;
}
@@ -492,7 +491,7 @@ static int get_token_value(const char *token_id,
return tokens->token[i].value;
}
- SNDERR("error: cannot find token id '%s'\n", token_id);
+ SNDERR("cannot find token id '%s'", token_id);
return -1;
}
@@ -579,7 +578,7 @@ static int copy_tuples(struct tplg_elem *elem,
* tuple_set->num_tuples;
size += set_size;
if (size > TPLG_MAX_PRIV_SIZE) {
- SNDERR("error: data too big %d\n", size);
+ SNDERR("data too big %d", size);
return -EINVAL;
}
@@ -662,13 +661,13 @@ static int build_tuples(snd_tplg_t *tplg, struct tplg_elem *elem)
ref->id, SND_TPLG_TYPE_TUPLE, elem->index);
tuples = ref->elem;
if (!tuples) {
- SNDERR("error: cannot find tuples %s\n", ref->id);
+ SNDERR("cannot find tuples %s", ref->id);
return -EINVAL;
}
tokens = get_tokens(tplg, tuples);
if (!tokens) {
- SNDERR("error: cannot find token for %s\n", ref->id);
+ SNDERR("cannot find token for %s", ref->id);
return -EINVAL;
}
@@ -762,7 +761,7 @@ static int parse_tuple_set(snd_config_t *cfg,
type = get_tuple_type(id);
if (type < 0) {
- SNDERR("error: invalid tuple type '%s'", id);
+ SNDERR("invalid tuple type '%s'", id);
return type;
}
@@ -819,7 +818,7 @@ static int parse_tuple_set(snd_config_t *cfg,
case SND_SOC_TPLG_TUPLE_TYPE_WORD:
ival = tplg_get_unsigned(n, &tuple_val, 0);
if (ival < 0) {
- SNDERR("error: tuple %s: %s\n", id, snd_strerror(ival));
+ SNDERR("tuple %s: %s", id, snd_strerror(ival));
goto err;
}
@@ -829,7 +828,7 @@ static int parse_tuple_set(snd_config_t *cfg,
&& tuple_val > USHRT_MAX)
|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
&& tuple_val > UCHAR_MAX)) {
- SNDERR("error: tuple %s: invalid value\n", id);
+ SNDERR("tuple %s: invalid value", id);
goto err;
}
@@ -941,7 +940,7 @@ static int parse_tuple_sets(snd_config_t *cfg,
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
if (snd_config_get_id(cfg, &id) >= 0)
- SNDERR("error: compound type expected for %s", id);
+ SNDERR("compound type expected for %s", id);
return -EINVAL;
}
@@ -959,8 +958,8 @@ static int parse_tuple_sets(snd_config_t *cfg,
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound type expected for %s, is %d",
- id, snd_config_get_type(n));
+ SNDERR("compound type expected for %s, is %d",
+ id, snd_config_get_type(n));
return -EINVAL;
}
@@ -1169,7 +1168,7 @@ int tplg_parse_manifest_data(snd_tplg_t *tplg, snd_config_t *cfg,
int err;
if (!list_empty(&tplg->manifest_list)) {
- SNDERR("error: already has manifest data\n");
+ SNDERR("already has manifest data");
return -EINVAL;
}
@@ -1326,7 +1325,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "file") == 0) {
err = tplg_parse_data_file(n, elem);
if (err < 0) {
- SNDERR("error: failed to parse data file\n");
+ SNDERR("failed to parse data file");
return err;
}
continue;
@@ -1335,7 +1334,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "bytes") == 0) {
err = tplg_parse_data_hex(n, elem, 1);
if (err < 0) {
- SNDERR("error: failed to parse data bytes\n");
+ SNDERR("failed to parse data bytes");
return err;
}
continue;
@@ -1344,7 +1343,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "shorts") == 0) {
err = tplg_parse_data_hex(n, elem, 2);
if (err < 0) {
- SNDERR("error: failed to parse data shorts\n");
+ SNDERR("failed to parse data shorts");
return err;
}
continue;
@@ -1353,7 +1352,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
if (strcmp(id, "words") == 0) {
err = tplg_parse_data_hex(n, elem, 4);
if (err < 0) {
- SNDERR("error: failed to parse data words\n");
+ SNDERR("failed to parse data words");
return err;
}
continue;
@@ -1470,8 +1469,8 @@ int tplg_copy_data(snd_tplg_t *tplg, struct tplg_elem *elem,
ref_elem = tplg_elem_lookup(&tplg->pdata_list,
ref->id, SND_TPLG_TYPE_DATA, elem->index);
if (!ref_elem) {
- SNDERR("error: cannot find data '%s' referenced by"
- " element '%s'\n", ref->id, elem->id);
+ SNDERR("cannot find data '%s' referenced by"
+ " element '%s'", ref->id, elem->id);
return -EINVAL;
}
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 1eaa24bd42f5..5a5dd14f2bdd 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -122,7 +122,7 @@ int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
return -EINVAL;
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound type expected for %s", id);
+ SNDERR("compound type expected for %s", id);
return -EINVAL;
}
@@ -131,7 +131,7 @@ int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
n = snd_config_iterator_entry(i);
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound type expected for %s, is %d",
+ SNDERR("compound type expected for %s, is %d",
id, snd_config_get_type(cfg));
return -EINVAL;
}
@@ -155,7 +155,7 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
int err;
if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
- SNDERR("error: compound type expected at top level");
+ SNDERR("compound type expected at top level");
return -EINVAL;
}
@@ -180,7 +180,7 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
}
if (parser == NULL) {
- SNDERR("error: unknown section %s\n", id);
+ SNDERR("unknown section %s", id);
continue;
}
@@ -202,7 +202,7 @@ static int tplg_load_config(snd_tplg_t *tplg, snd_input_t *in)
ret = snd_config_load(top, in);
if (ret < 0) {
- SNDERR("error: could not load configuration");
+ SNDERR("could not load configuration");
snd_config_delete(top);
return ret;
}
@@ -210,7 +210,7 @@ static int tplg_load_config(snd_tplg_t *tplg, snd_input_t *in)
ret = tplg_parse_config(tplg, top);
snd_config_delete(top);
if (ret < 0) {
- SNDERR("error: failed to parse topology");
+ SNDERR("failed to parse topology");
return ret;
}
@@ -267,7 +267,7 @@ int snd_tplg_load(snd_tplg_t *tplg, const char *buf, size_t size)
err = snd_input_buffer_open(&in, buf, size);
if (err < 0) {
- SNDERR("error: could not create input buffer");
+ SNDERR("could not create input buffer");
return err;
}
@@ -282,13 +282,13 @@ static int tplg_build(snd_tplg_t *tplg)
err = tplg_build_integ(tplg);
if (err < 0) {
- SNDERR("error: failed to check topology integrity\n");
+ SNDERR("failed to check topology integrity");
return err;
}
err = tplg_write_data(tplg);
if (err < 0) {
- SNDERR("error: failed to write data %d\n", err);
+ SNDERR("failed to write data %d", err);
return err;
}
return 0;
@@ -304,15 +304,14 @@ int snd_tplg_build_file(snd_tplg_t *tplg,
fp = fopen(infile, "r");
if (fp == NULL) {
- SNDERR("error: could not open configuration file %s",
- infile);
+ SNDERR("could not open configuration file %s", infile);
return -errno;
}
err = snd_input_stdio_attach(&in, fp, 1);
if (err < 0) {
fclose(fp);
- SNDERR("error: could not attach stdio %s", infile);
+ SNDERR("could not attach stdio %s", infile);
return err;
}
@@ -346,7 +345,7 @@ int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
case SND_TPLG_TYPE_CC:
return tplg_add_link_object(tplg, t);
default:
- SNDERR("error: invalid object type %d\n", t->type);
+ SNDERR("invalid object type %d", t->type);
return -EINVAL;
};
}
@@ -362,18 +361,18 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
fd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0) {
- SNDERR("error: failed to open %s err %d\n", outfile, -errno);
+ SNDERR("failed to open %s err %d", outfile, -errno);
return -errno;
}
r = write(fd, tplg->bin, tplg->bin_size);
close(fd);
if (r < 0) {
err = -errno;
- SNDERR("error: write error: %s\n", strerror(errno));
+ SNDERR("write error: %s", strerror(errno));
return err;
}
if ((size_t)r != tplg->bin_size) {
- SNDERR("error: partial write (%zd != %zd)\n", r, tplg->bin_size);
+ SNDERR("partial write (%zd != %zd)", r, tplg->bin_size);
return -EIO;
}
return 0;
@@ -437,7 +436,7 @@ snd_tplg_t *snd_tplg_create(int flags)
snd_tplg_t *tplg;
if (!is_little_endian()) {
- SNDERR("error: cannot support big-endian machines\n");
+ SNDERR("cannot support big-endian machines");
return NULL;
}
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index d09fbe42f5da..bc3070816867 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -116,8 +116,8 @@ static int build_pcm(snd_tplg_t *tplg, struct tplg_elem *elem)
return err;
}
if (!ref->elem) {
- SNDERR("error: cannot find '%s' referenced by"
- " PCM '%s'\n", ref->id, elem->id);
+ SNDERR("cannot find '%s' referenced by"
+ " PCM '%s'", ref->id, elem->id);
return -EINVAL;
}
}
@@ -137,7 +137,7 @@ int tplg_build_pcms(snd_tplg_t *tplg, unsigned int type)
elem = list_entry(pos, struct tplg_elem, list);
if (elem->type != type) {
- SNDERR("error: invalid elem '%s'\n", elem->id);
+ SNDERR("invalid elem '%s'", elem->id);
return -EINVAL;
}
@@ -196,7 +196,7 @@ int tplg_build_dais(snd_tplg_t *tplg, unsigned int type)
elem = list_entry(pos, struct tplg_elem, list);
if (elem->type != type) {
- SNDERR("error: invalid elem '%s'\n", elem->id);
+ SNDERR("invalid elem '%s'", elem->id);
return -EINVAL;
}
@@ -251,8 +251,8 @@ static int build_link(snd_tplg_t *tplg, struct tplg_elem *elem)
ref->elem = tplg_elem_lookup(&tplg->hw_cfg_list,
ref->id, SND_TPLG_TYPE_HW_CONFIG, elem->index);
if (!ref->elem) {
- SNDERR("error: cannot find HW config '%s'"
- " referenced by link '%s'\n",
+ SNDERR("cannot find HW config '%s'"
+ " referenced by link '%s'",
ref->id, elem->id);
return -EINVAL;
}
@@ -320,7 +320,7 @@ static int split_format(struct snd_soc_tplg_stream_caps *caps, char *str)
while ((s != NULL) && (i < SND_SOC_TPLG_MAX_FORMATS)) {
format = snd_pcm_format_value(s);
if (format == SND_PCM_FORMAT_UNKNOWN) {
- SNDERR("error: unsupported stream format %s\n", s);
+ SNDERR("unsupported stream format %s", s);
return -EINVAL;
}
@@ -363,7 +363,7 @@ static int split_rate(struct snd_soc_tplg_stream_caps *caps, char *str)
rate = get_rate_value(s);
if (rate == SND_PCM_RATE_UNKNOWN) {
- SNDERR("error: unsupported stream rate %s\n", s);
+ SNDERR("unsupported stream rate %s", s);
return -EINVAL;
}
@@ -758,7 +758,7 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
if (strcmp(id, "id") == 0) {
if (tplg_get_unsigned(n, &pcm->dai_id, 0)) {
- SNDERR("error: invalid fe dai ID\n");
+ SNDERR("invalid fe dai ID");
return -EINVAL;
}
@@ -1379,7 +1379,7 @@ static int get_audio_hw_format(const char *val)
if (strcasecmp(audio_hw_formats[i].name, val) == 0)
return audio_hw_formats[i].type;
- SNDERR("error: invalid audio HW format %s\n", val);
+ SNDERR("invalid audio HW format %s", val);
return -EINVAL;
}
@@ -1452,8 +1452,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
/* For backwards capability,
* "master" == "codec is slave"
*/
- SNDERR("warning: deprecated bclk value '%s'\n",
- val);
+ SNDERR("deprecated bclk value '%s'", val);
hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
} else if (!strcmp(val, "codec_slave")) {
@@ -1490,8 +1489,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
/* For backwards capability,
* "master" == "codec is slave"
*/
- SNDERR("warning: deprecated fsync value '%s'\n",
- val);
+ SNDERR("deprecated fsync value '%s'", val);
hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
} else if (!strcmp(val, "codec_slave")) {
@@ -1535,8 +1533,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
/* For backwards capability,
* "master" == "for codec, mclk is input"
*/
- SNDERR("warning: deprecated mclk value '%s'\n",
- val);
+ SNDERR("deprecated mclk value '%s'", val);
hw_cfg->mclk_direction = SND_SOC_TPLG_MCLK_CI;
} else if (!strcmp(val, "codec_mclk_in")) {
diff --git a/src/topology/text.c b/src/topology/text.c
index e9386e7df492..6dbf22305fd3 100644
--- a/src/topology/text.c
+++ b/src/topology/text.c
@@ -38,7 +38,7 @@ static int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem)
n = snd_config_iterator_entry(i);
if (j == SND_SOC_TPLG_NUM_TEXTS) {
- tplg_dbg("error: text string number exceeds %d\n", j);
+ tplg_dbg("text string number exceeds %d\n", j);
return -ENOMEM;
}
--
2.16.4

View File

@ -1,35 +0,0 @@
From 712fbacf160f899582a9adc3f30f297211b063bb Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 27 Dec 2019 19:32:03 +0100
Subject: [PATCH 47/63] topology: dapm - fix the SNDERR() - Undefined
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/dapm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index f61fe07157ac..88bddca3c08e 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -230,7 +230,7 @@ int tplg_build_routes(snd_tplg_t *tplg)
SND_TPLG_TYPE_MIXER, elem->index) &&
!tplg_elem_lookup(&tplg->enum_list, route->control,
SND_TPLG_TYPE_ENUM, elem->index)) {
- SNDERR("Undefined mixer/enum control '%s'",
+ SNDERR("undefined mixer/enum control '%s'",
route->control);
}
}
@@ -243,7 +243,7 @@ int tplg_build_routes(snd_tplg_t *tplg)
}
if (!tplg_elem_lookup(&tplg->widget_list, route->source,
SND_TPLG_TYPE_DAPM_WIDGET, SND_TPLG_INDEX_ALL)) {
- SNDERR("Undefined source widget/stream '%s'",
+ SNDERR("undefined source widget/stream '%s'",
route->source);
}
--
2.16.4

View File

@ -1,25 +0,0 @@
From 07d779143bfd24448034cd55945b46c46407247c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 28 Dec 2019 10:18:34 +0100
Subject: [PATCH 48/63] topology: fix the unitialized tuples
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/topology/data.c b/src/topology/data.c
index f00ed3011869..4e43fcc9d5a7 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -601,6 +601,7 @@ static int copy_tuples(struct tplg_elem *elem,
elem->data = priv;
array = (struct snd_soc_tplg_vendor_array *)(priv->data + off);
+ memset(array, 0, set_size);
array->size = set_size;
array->type = tuple_set->type;
array->num_elems = tuple_set->num_tuples;
--
2.16.4

View File

@ -1,96 +0,0 @@
From 2947d83c1322bcdb31c1da180acb0f779a63dcdd Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 28 Dec 2019 21:44:03 +0100
Subject: [PATCH 49/63] topology: implement shorter hexa uuid 00:00 parser
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/src/topology/data.c b/src/topology/data.c
index 4e43fcc9d5a7..1ddd3c509e64 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -22,8 +22,8 @@
#include <ctype.h>
#define UUID_FORMAT "\
-0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, \
-0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x"
+%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:\
+%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x"
/* Get private data buffer of an element */
struct snd_soc_tplg_private *get_priv_data(struct tplg_elem *elem)
@@ -316,7 +316,6 @@ format2:
values++;
s += 2;
}
- s++;
}
s++;
@@ -341,6 +340,32 @@ static int get_uuid(const char *str, unsigned char *uuid_le)
if (tmp == NULL)
return -ENOMEM;
+ if (strchr(tmp, ':') == NULL)
+ goto data2;
+
+ s = strtok(tmp, ":");
+ while (s != NULL) {
+ errno = 0;
+ val = strtoul(s, NULL, 16);
+ if ((errno == ERANGE && val == ULONG_MAX)
+ || (errno != 0 && val == 0)
+ || (val > UCHAR_MAX)) {
+ SNDERR("invalid value for uuid");
+ ret = -EINVAL;
+ goto out;
+ }
+
+ *(uuid_le + values) = (unsigned char)val;
+
+ values++;
+ if (values >= 16)
+ break;
+
+ s = strtok(NULL, ":");
+ }
+ goto out;
+
+data2:
s = strtok(tmp, ",");
while (s != NULL) {
@@ -354,7 +379,7 @@ static int get_uuid(const char *str, unsigned char *uuid_le)
goto out;
}
- *(uuid_le + values) = (unsigned char)val;
+ *(uuid_le + values) = (unsigned char)val;
values++;
if (values >= 16)
@@ -413,7 +438,7 @@ static int copy_data_hex(char *data, int off, const char *str, int width)
return -ENOMEM;
p += off;
- s = strtok(tmp, ",");
+ s = strtok(tmp, ",:");
while (s != NULL) {
ret = write_hex(p, s, width);
@@ -422,7 +447,7 @@ static int copy_data_hex(char *data, int off, const char *str, int width)
return ret;
}
- s = strtok(NULL, ",");
+ s = strtok(NULL, ",:");
p += width;
}
--
2.16.4

View File

@ -1,66 +0,0 @@
From 1482d1f254fe42d83d904e52c911df8693b62653 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 29 Dec 2019 20:05:14 +0100
Subject: [PATCH 50/63] topology: fix the TPLG_DEBUG compilation
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/channel.c | 2 +-
src/topology/data.c | 5 ++++-
src/topology/pcm.c | 2 +-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/topology/channel.c b/src/topology/channel.c
index 110775a8053d..390c3f164e97 100644
--- a/src/topology/channel.c
+++ b/src/topology/channel.c
@@ -129,7 +129,7 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
else if (strcmp(id, "shift") == 0)
channel->shift = value;
- tplg_dbg("\t\t%s = %s\n", id, value);
+ tplg_dbg("\t\t%s = %d\n", id, value);
}
tplg->channel_idx++;
diff --git a/src/topology/data.c b/src/topology/data.c
index 1ddd3c509e64..7b4bdccde602 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -230,9 +230,11 @@ err:
return ret;
}
-static void dump_priv_data(struct tplg_elem *elem)
+static void dump_priv_data(struct tplg_elem *elem ATTRIBUTE_UNUSED)
{
+#ifdef TPLG_DEBUG
struct snd_soc_tplg_private *priv = elem->data;
+ unsigned char *p = (unsigned char *)priv->data;
unsigned int i;
tplg_dbg(" elem size = %d, priv data size = %d\n",
@@ -246,6 +248,7 @@ static void dump_priv_data(struct tplg_elem *elem)
}
tplg_dbg("\n\n");
+#endif
}
static inline int check_nibble(unsigned char c)
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index bc3070816867..8e5afbe6ea72 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -881,7 +881,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
pcm->compress = ival;
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %d\n", id, ival);
continue;
}
--
2.16.4

View File

@ -1,91 +0,0 @@
From c765615bce7903a0f3e3d5e7826483708398c184 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 31 Dec 2019 15:27:58 +0100
Subject: [PATCH 51/63] topology: fix the ops parser (accept integer/hexa
values)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/ops.c | 36 +++++++++++++++++++++++++-----------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/src/topology/ops.c b/src/topology/ops.c
index ad72ef1b2cb6..2885c7814604 100644
--- a/src/topology/ops.c
+++ b/src/topology/ops.c
@@ -67,6 +67,7 @@ int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED, snd_config_t *cfg,
snd_config_t *n;
struct snd_soc_tplg_ctl_hdr *hdr = private;
const char *id, *value;
+ int ival;
tplg_dbg("\tOps\n");
hdr->size = sizeof(*hdr);
@@ -80,17 +81,23 @@ int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED, snd_config_t *cfg,
continue;
/* get value - try strings then ints */
- if (snd_config_get_string(n, &value) < 0)
- continue;
+ if (snd_config_get_type(n) == SND_CONFIG_TYPE_STRING) {
+ if (snd_config_get_string(n, &value) < 0)
+ continue;
+ ival = lookup_ops(value);
+ } else {
+ if (tplg_get_integer(n, &ival, 0))
+ continue;
+ }
if (strcmp(id, "info") == 0)
- hdr->ops.info = lookup_ops(value);
+ hdr->ops.info = ival;
else if (strcmp(id, "put") == 0)
- hdr->ops.put = lookup_ops(value);
+ hdr->ops.put = ival;
else if (strcmp(id, "get") == 0)
- hdr->ops.get = lookup_ops(value);
+ hdr->ops.get = ival;
- tplg_dbg("\t\t%s = %s\n", id, value);
+ tplg_dbg("\t\t%s = %d\n", id, ival);
}
return 0;
@@ -146,6 +153,7 @@ int tplg_parse_ext_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
snd_config_t *n;
struct snd_soc_tplg_bytes_control *be = private;
const char *id, *value;
+ int ival;
tplg_dbg("\tExt Ops\n");
@@ -158,15 +166,21 @@ int tplg_parse_ext_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
continue;
/* get value - try strings then ints */
- if (snd_config_get_string(n, &value) < 0)
- continue;
+ if (snd_config_get_type(n) == SND_CONFIG_TYPE_STRING) {
+ if (snd_config_get_string(n, &value) < 0)
+ continue;
+ ival = lookup_ops(value);
+ } else {
+ if (tplg_get_integer(n, &ival, 0))
+ continue;
+ }
if (strcmp(id, "info") == 0)
- be->ext_ops.info = lookup_ops(value);
+ be->ext_ops.info = ival;
else if (strcmp(id, "put") == 0)
- be->ext_ops.put = lookup_ops(value);
+ be->ext_ops.put = ival;
else if (strcmp(id, "get") == 0)
- be->ext_ops.get = lookup_ops(value);
+ be->ext_ops.get = ival;
tplg_dbg("\t\t%s = %s\n", id, value);
}
--
2.16.4

View File

@ -1,36 +0,0 @@
From 0ba4d6d9c0ae4576f35724d2a5735990f09ceeb0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 1 Jan 2020 19:10:20 +0100
Subject: [PATCH 52/63] topology: fix the wrong memory access (object realloc)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/pcm.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 8e5afbe6ea72..bd72895971f5 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -252,8 +252,8 @@ static int build_link(snd_tplg_t *tplg, struct tplg_elem *elem)
ref->id, SND_TPLG_TYPE_HW_CONFIG, elem->index);
if (!ref->elem) {
SNDERR("cannot find HW config '%s'"
- " referenced by link '%s'",
- ref->id, elem->id);
+ " referenced by link '%s'",
+ ref->id, elem->id);
return -EINVAL;
}
@@ -267,6 +267,7 @@ static int build_link(snd_tplg_t *tplg, struct tplg_elem *elem)
err = tplg_copy_data(tplg, elem, ref);
if (err < 0)
return err;
+ link = elem->link; /* realloc */
break;
default:
--
2.16.4

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +0,0 @@
From cb88813ff71226af5d16f8853d186ff7c572dbe0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Jan 2020 22:07:11 +0100
Subject: [PATCH 54/63] topology: move the elem->list delete to
tplg_elem_free()
The tplg_elem_free() is called in the error path from many places
and it is expected that the element object will be unregistered
from the tplg structure, too.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/elem.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/topology/elem.c b/src/topology/elem.c
index ed5b5f13054f..cbd7f4b636c1 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -301,6 +301,8 @@ struct tplg_elem *tplg_elem_new(void)
void tplg_elem_free(struct tplg_elem *elem)
{
+ list_del(&elem->list);
+
tplg_ref_free_list(&elem->ref_list);
/* free struct snd_tplg_ object,
@@ -323,7 +325,6 @@ void tplg_elem_free_list(struct list_head *base)
list_for_each_safe(pos, npos, base) {
elem = list_entry(pos, struct tplg_elem, list);
- list_del(&elem->list);
tplg_elem_free(elem);
}
}
--
2.16.4

View File

@ -1,654 +0,0 @@
From ae6522e10621839a15f5a439091af7542d84d3e5 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Jan 2020 22:31:27 +0100
Subject: [PATCH 55/63] topology: unify the log mechanism
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/Makefile.am | 3 ++-
src/topology/builder.c | 54 +++++++++++++++++++++--------------------------
src/topology/ctl.c | 30 +++++++++++++-------------
src/topology/dapm.c | 19 +++++++++--------
src/topology/data.c | 26 +++++++++++------------
src/topology/decoder.c | 32 ++++++++--------------------
src/topology/log.c | 34 +++++++++++++++++++++++++++++
src/topology/pcm.c | 48 ++++++++++++++++++++---------------------
src/topology/tplg_local.h | 8 ++++++-
9 files changed, 138 insertions(+), 116 deletions(-)
create mode 100644 src/topology/log.c
diff --git a/src/topology/Makefile.am b/src/topology/Makefile.am
index 12d1d4455883..9f48891f5c28 100644
--- a/src/topology/Makefile.am
+++ b/src/topology/Makefile.am
@@ -29,7 +29,8 @@ libatopology_la_SOURCES =\
ops.c \
elem.c \
save.c \
- decoder.c
+ decoder.c \
+ log.c
noinst_HEADERS = tplg_local.h
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 74c44405e653..7af5de084d84 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -20,20 +20,6 @@
#include "list.h"
#include "tplg_local.h"
-/* verbose output detailing each object size and file position */
-static void verbose(snd_tplg_t *tplg, const char *fmt, ...)
-{
- va_list va;
-
- if (!tplg->verbose)
- return;
-
- va_start(va, fmt);
- fprintf(stdout, "0x%6.6zx/%6.6zd - ", tplg->bin_pos, tplg->bin_pos);
- vfprintf(stdout, fmt, va);
- va_end(va);
-}
-
/* write a block, track the position */
static ssize_t twrite(snd_tplg_t *tplg, void *data, size_t data_size)
{
@@ -73,10 +59,11 @@ static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
return -EINVAL;
}
- verbose(tplg, "header index %d type %d count %d size 0x%lx/%ld vendor %d "
- "version %d\n", index, type, count,
- (long unsigned int)payload_size, (long int)payload_size,
- vendor_type, version);
+ tplg_log(tplg, 'B', tplg->bin_pos,
+ "header index %d type %d count %d size 0x%lx/%ld vendor %d "
+ "version %d", index, type, count,
+ (long unsigned int)payload_size, (long int)payload_size,
+ vendor_type, version);
tplg->next_hdr_pos += hdr.payload_size + sizeof(hdr);
@@ -121,13 +108,15 @@ static int write_elem_block(snd_tplg_t *tplg,
continue;
if (elem->type != SND_TPLG_TYPE_DAPM_GRAPH)
- verbose(tplg, "%s '%s': write %d bytes\n",
- obj_name, elem->id, elem->size);
+ tplg_log(tplg, 'B', tplg->bin_pos,
+ "%s '%s': write %d bytes",
+ obj_name, elem->id, elem->size);
else
- verbose(tplg, "%s '%s -> %s -> %s': write %d bytes\n",
- obj_name, elem->route->source,
- elem->route->control,
- elem->route->sink, elem->size);
+ tplg_log(tplg, 'B', tplg->bin_pos,
+ "%s '%s -> %s -> %s': write %d bytes",
+ obj_name, elem->route->source,
+ elem->route->control,
+ elem->route->sink, elem->size);
wsize = twrite(tplg, elem->obj, elem->size);
if (wsize < 0)
@@ -225,10 +214,13 @@ static ssize_t write_manifest_data(snd_tplg_t *tplg)
return ret;
}
- verbose(tplg, "manifest: write %d bytes\n", sizeof(tplg->manifest));
+ tplg_log(tplg, 'B', tplg->bin_pos, "manifest: write %d bytes",
+ sizeof(tplg->manifest));
ret = twrite(tplg, &tplg->manifest, sizeof(tplg->manifest));
if (ret >= 0) {
- verbose(tplg, "manifest: write %d priv bytes\n", tplg->manifest.priv.size);
+ tplg_log(tplg, 'B', tplg->bin_pos,
+ "manifest: write %d priv bytes",
+ tplg->manifest.priv.size);
ret = twrite(tplg, tplg->manifest_pdata, tplg->manifest.priv.size);
}
return ret;
@@ -280,9 +272,10 @@ int tplg_write_data(snd_tplg_t *tplg)
size = calc_block_size(list);
if (size == 0)
continue;
- verbose(tplg, "block size for type %s (%d:%d) is 0x%zx/%zd\n",
- tptr->name, tptr->type,
- tptr->tsoc, size, size);
+ tplg_log(tplg, 'B', tplg->bin_pos,
+ "block size for type %s (%d:%d) is 0x%zx/%zd",
+ tptr->name, tptr->type,
+ tptr->tsoc, size, size);
ret = write_elem_block(tplg, list, size,
tptr->tsoc, tptr->name);
if (ret < 0) {
@@ -292,7 +285,8 @@ int tplg_write_data(snd_tplg_t *tplg)
}
}
- verbose(tplg, "total size is 0x%zx/%zd\n", tplg->bin_pos, tplg->bin_pos);
+ tplg_log(tplg, 'B', tplg->bin_pos, "total size is 0x%zx/%zd",
+ tplg->bin_pos, tplg->bin_pos);
if (total_size != tplg->bin_pos) {
SNDERR("total size mismatch (%zd != %zd)",
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 24d437aa4a2e..a5a81148d1eb 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -1216,8 +1216,8 @@ int tplg_decode_control_mixer1(snd_tplg_t *tplg,
return -EINVAL;
}
- tplg_dv(tplg, pos, "mixer: size %d TLV size %d private size %d",
- mc->size, mc->hdr.tlv.size, mc->priv.size);
+ tplg_log(tplg, 'D', pos, "mixer: size %d TLV size %d private size %d",
+ mc->size, mc->hdr.tlv.size, mc->priv.size);
if (size != mc->size + mc->priv.size) {
SNDERR("mixer: unexpected element size %d", size);
return -EINVAL;
@@ -1233,7 +1233,7 @@ int tplg_decode_control_mixer1(snd_tplg_t *tplg,
mt->min = mc->min;
mt->max = mc->max;
mt->platform_max = mc->platform_max;
- tplg_dv(tplg, pos, "mixer: name '%s' access 0x%x",
+ tplg_log(tplg, 'D', pos, "mixer: name '%s' access 0x%x",
mt->hdr.name, mt->hdr.access);
if (mc->num_channels > 0) {
map = tplg_calloc(heap, sizeof(*map));
@@ -1261,16 +1261,16 @@ int tplg_decode_control_mixer1(snd_tplg_t *tplg,
db->min = mc->hdr.tlv.scale.min;
db->step = mc->hdr.tlv.scale.step;
db->mute = mc->hdr.tlv.scale.mute;
- tplg_dv(tplg, pos, "mixer: dB scale TLV: min %d step %d mute %d",
- db->min, db->step, db->mute);
+ tplg_log(tplg, 'D', pos, "mixer: dB scale TLV: min %d step %d mute %d",
+ db->min, db->step, db->mute);
} else {
SNDERR("mixer: wrong TLV size %d", mc->hdr.tlv.size);
return -EINVAL;
}
mt->priv = &mc->priv;
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_mixer_control, priv),
- "mixer: private start");
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_mixer_control, priv),
+ "mixer: private start");
return 0;
}
@@ -1338,8 +1338,8 @@ int tplg_decode_control_enum1(snd_tplg_t *tplg,
return -EINVAL;
}
- tplg_dv(tplg, pos, "enum: size %d private size %d",
- ec->size, ec->priv.size);
+ tplg_log(tplg, 'D', pos, "enum: size %d private size %d",
+ ec->size, ec->priv.size);
if (size != ec->size + ec->priv.size) {
SNDERR("enum: unexpected element size %d", size);
return -EINVAL;
@@ -1380,8 +1380,8 @@ int tplg_decode_control_enum1(snd_tplg_t *tplg,
cmt.num_channels = ec->num_channels;
for (i = 0; i < cmt.num_channels; i++) {
struct snd_tplg_channel_elem *channel = &cmt.channel[i];
- tplg_dv(tplg, pos + ((void *)&ec->channel[i] - (void *)ec),
- "enum: channel size %d", ec->channel[i].size);
+ tplg_log(tplg, 'D', pos + ((void *)&ec->channel[i] - (void *)ec),
+ "enum: channel size %d", ec->channel[i].size);
channel->reg = ec->channel[i].reg;
channel->shift = ec->channel[i].shift;
channel->id = ec->channel[i].id;
@@ -1452,8 +1452,8 @@ int tplg_decode_control_bytes1(snd_tplg_t *tplg,
return -EINVAL;
}
- tplg_dv(tplg, pos, "control bytes: size %d private size %d",
- bc->size, bc->priv.size);
+ tplg_log(tplg, 'D', pos, "control bytes: size %d private size %d",
+ bc->size, bc->priv.size);
if (size != bc->size + bc->priv.size) {
SNDERR("bytes: unexpected element size %d", size);
return -EINVAL;
@@ -1473,8 +1473,8 @@ int tplg_decode_control_bytes1(snd_tplg_t *tplg,
bt->ext_ops.get = bc->ext_ops.get;
bt->ext_ops.put = bc->ext_ops.put;
bt->ext_ops.info = bc->ext_ops.info;
- tplg_dv(tplg, pos, "control bytes: name '%s' access 0x%x",
- bt->hdr.name, bt->hdr.access);
+ tplg_log(tplg, 'D', pos, "control bytes: name '%s' access 0x%x",
+ bt->hdr.name, bt->hdr.access);
bt->priv = &bc->priv;
return 0;
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 9fab2d92c150..0bf64833c11f 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -895,8 +895,8 @@ next:
return -EINVAL;
}
- tplg_dv(tplg, pos, "dapm widget: size %d private size %d kcontrols %d",
- w->size, w->priv.size, w->num_kcontrols);
+ tplg_log(tplg, 'D', pos, "dapm widget: size %d private size %d kcontrols %d",
+ w->size, w->priv.size, w->num_kcontrols);
wt = tplg_calloc(&heap, sizeof(*wt) + sizeof(void *) * w->num_kcontrols);
if (wt == NULL)
@@ -913,7 +913,8 @@ next:
wt->event_flags = w->event_flags;
wt->event_type = w->event_type;
- tplg_dv(tplg, pos, "dapm widget: name '%s' sname '%s'", wt->name, wt->sname);
+ tplg_log(tplg, 'D', pos, "dapm widget: name '%s' sname '%s'",
+ wt->name, wt->sname);
if (sizeof(*w) + w->priv.size > size) {
SNDERR("dapm widget: wrong private data size %d",
@@ -921,8 +922,8 @@ next:
return -EINVAL;
}
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_dapm_widget, priv),
- "dapm widget: private start");
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_dapm_widget, priv),
+ "dapm widget: private start");
wt->priv = &w->priv;
bin += sizeof(*w) + w->priv.size;
@@ -942,7 +943,7 @@ next:
wt->num_ctls++;
mc = bin;
size2 = mc->size + mc->priv.size;
- tplg_dv(tplg, pos, "kcontrol mixer size %zd", size2);
+ tplg_log(tplg, 'D', pos, "kcontrol mixer size %zd", size2);
if (size2 > size) {
SNDERR("dapm widget: small mixer size %d",
size2);
@@ -962,7 +963,7 @@ next:
wt->num_ctls++;
ec = bin;
size2 = ec->size + ec->priv.size;
- tplg_dv(tplg, pos, "kcontrol enum size %zd", size2);
+ tplg_log(tplg, 'D', pos, "kcontrol enum size %zd", size2);
if (size2 > size) {
SNDERR("dapm widget: small enum size %d",
size2);
@@ -982,7 +983,7 @@ next:
wt->num_ctls++;
bc = bin;
size2 = bc->size + bc->priv.size;
- tplg_dv(tplg, pos, "kcontrol bytes size %zd", size2);
+ tplg_log(tplg, 'D', pos, "kcontrol bytes size %zd", size2);
if (size2 > size) {
SNDERR("dapm widget: small bytes size %d",
size2);
@@ -1049,7 +1050,7 @@ int tplg_decode_dapm_graph(snd_tplg_t *tplg,
ge->ctl = g->control;
ge->sink = g->sink;
gt->count++;
- tplg_dv(tplg, pos, "dapm graph: src='%s' ctl='%s' sink='%s'",
+ tplg_log(tplg, 'D', pos, "dapm graph: src='%s' ctl='%s' sink='%s'",
ge->src, ge->ctl, ge->sink);
bin += sizeof(*g);
size -= sizeof(*g);
diff --git a/src/topology/data.c b/src/topology/data.c
index 64563920a4e2..0b513428da80 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -1604,7 +1604,7 @@ int tplg_decode_manifest_data(snd_tplg_t *tplg,
if (!elem)
return -ENOMEM;
- tplg_dv(tplg, pos, "manifest: private size %d", size);
+ tplg_log(tplg, 'D', pos, "manifest: private size %d", size);
return tplg_add_data(tplg, elem, bin, size);
}
@@ -1664,7 +1664,7 @@ static int tplg_verify_tuple_set(snd_tplg_t *tplg, size_t pos,
va = bin;
if (size < sizeof(*va) || size < va->size) {
- tplg_dv(tplg, pos, "tuple set verify: wrong size %d", size);
+ tplg_log(tplg, 'A', pos, "tuple set verify: wrong size %d", size);
return -EINVAL;
}
@@ -1677,20 +1677,20 @@ static int tplg_verify_tuple_set(snd_tplg_t *tplg, size_t pos,
case SND_SOC_TPLG_TUPLE_TYPE_SHORT:
break;
default:
- tplg_dv(tplg, pos, "tuple set verify: unknown array type %d", va->type);
+ tplg_log(tplg, 'A', pos, "tuple set verify: unknown array type %d", va->type);
return -EINVAL;
}
j = tplg_get_tuple_size(va->type) * va->num_elems;
if (j + sizeof(*va) != va->size) {
- tplg_dv(tplg, pos, "tuple set verify: wrong vendor array size %d "
- "(expected %d for %d count %d)",
- va->size, j + sizeof(*va), va->type, va->num_elems);
+ tplg_log(tplg, 'A', pos, "tuple set verify: wrong vendor array size %d "
+ "(expected %d for %d count %d)",
+ va->size, j + sizeof(*va), va->type, va->num_elems);
return -EINVAL;
}
if (va->num_elems > 4096) {
- tplg_dv(tplg, pos, "tuple set verify: tuples overflow %d", va->num_elems);
+ tplg_log(tplg, 'A', pos, "tuple set verify: tuples overflow %d", va->num_elems);
return -EINVAL;
}
@@ -1748,8 +1748,8 @@ static int tplg_decode_tuple_set(snd_tplg_t *tplg,
set->type = va->type;
set->num_tuples = va->num_elems;
- tplg_dv(tplg, pos, "tuple set: type %d (%s) tuples %d size %d", set->type,
- get_tuple_type_name(set->type), set->num_tuples, va->size);
+ tplg_log(tplg, 'A', pos, "tuple set: type %d (%s) tuples %d size %d", set->type,
+ get_tuple_type_name(set->type), set->num_tuples, va->size);
for (j = 0; j < set->num_tuples; j++) {
tuple = &set->tuple[j];
switch (va->type) {
@@ -1798,14 +1798,14 @@ static int tplg_verify_tuples(snd_tplg_t *tplg, size_t pos,
int err;
if (size < sizeof(*va)) {
- tplg_dv(tplg, pos, "tuples: small size %d", size);
+ tplg_log(tplg, 'A', pos, "tuples: small size %d", size);
return -EINVAL;
}
next:
va = bin;
if (size < sizeof(*va)) {
- tplg_dv(tplg, pos, "tuples: unexpected vendor arry size %d", size);
+ tplg_log(tplg, 'A', pos, "tuples: unexpected vendor arry size %d", size);
return -EINVAL;
}
@@ -1903,7 +1903,7 @@ next:
return err;
tuples = NULL;
}
- tplg_dv(tplg, pos, "add bytes: size %d", tp->size);
+ tplg_log(tplg, 'A', pos, "add bytes: size %d", tp->size);
snprintf(suffix, sizeof(suffix), "data%u", block++);
err = tplg_add_data_bytes(tplg, parent, suffix, tp->array, tp->size);
} else {
@@ -1929,7 +1929,7 @@ next:
return -ENOMEM;
}
}
- tplg_dv(tplg, pos, "decode tuples: size %d", tp->size);
+ tplg_log(tplg, 'A', pos, "decode tuples: size %d", tp->size);
err = tplg_decode_tuples(tplg, pos, parent, tuples, tp->array, tp->size);
num_tuples++;
}
diff --git a/src/topology/decoder.c b/src/topology/decoder.c
index 2d6a8969756a..66ebe5d8a668 100644
--- a/src/topology/decoder.c
+++ b/src/topology/decoder.c
@@ -18,21 +18,6 @@
#include "list.h"
#include "tplg_local.h"
-/* verbose output detailing each object size and file position */
-void tplg_dv(snd_tplg_t *tplg, size_t pos, const char *fmt, ...)
-{
- va_list va;
-
- if (!tplg->verbose)
- return;
-
- va_start(va, fmt);
- fprintf(stdout, "D0x%6.6zx/%6.6zd - ", pos, pos);
- vfprintf(stdout, fmt, va);
- va_end(va);
- putc('\n', stdout);
-}
-
int tplg_decode_template(snd_tplg_t *tplg,
size_t pos,
struct snd_soc_tplg_hdr *hdr,
@@ -41,7 +26,8 @@ int tplg_decode_template(snd_tplg_t *tplg,
int type;
type = tplg_get_type(hdr->type);
- tplg_dv(tplg, pos, "template: asoc type %d library type %d", hdr->type, type);
+ tplg_log(tplg, 'D', pos, "template: asoc type %d library type %d",
+ hdr->type, type);
if (type < 0)
return type;
@@ -50,8 +36,8 @@ int tplg_decode_template(snd_tplg_t *tplg,
t->index = hdr->index;
t->version = hdr->version;
t->vendor_type = hdr->vendor_type;
- tplg_dv(tplg, pos, "template: index %d version %d vendor_type %d",
- hdr->index, hdr->version, hdr->vendor_type);
+ tplg_log(tplg, 'D', pos, "template: index %d version %d vendor_type %d",
+ hdr->index, hdr->version, hdr->vendor_type);
return 0;
}
@@ -71,11 +57,11 @@ int snd_tplg_decode(snd_tplg_t *tplg, void *bin, size_t size, int dflags)
while (1) {
pos = b - bin;
if (size == pos) {
- tplg_dv(tplg, pos, "block: success (total %zd)", size);
+ tplg_log(tplg, 'D', pos, "block: success (total %zd)", size);
return 0;
}
if (size - pos < sizeof(*hdr)) {
- tplg_dv(tplg, pos, "block: small size");
+ tplg_log(tplg, 'D', pos, "block: small size");
SNDERR("incomplete header data to decode");
return -EINVAL;
}
@@ -85,8 +71,8 @@ int snd_tplg_decode(snd_tplg_t *tplg, void *bin, size_t size, int dflags)
return -EINVAL;
}
- tplg_dv(tplg, pos, "block: abi %d size %d payload size %d",
- hdr->abi, hdr->size, hdr->payload_size);
+ tplg_log(tplg, 'D', pos, "block: abi %d size %d payload size %d",
+ hdr->abi, hdr->size, hdr->payload_size);
if (hdr->abi != SND_SOC_TPLG_ABI_VERSION) {
SNDERR("unsupported ABI version %d", hdr->abi);
return -EINVAL;
@@ -127,7 +113,7 @@ int snd_tplg_decode(snd_tplg_t *tplg, void *bin, size_t size, int dflags)
SNDERR("unknown block type %d", hdr->type);
return -EINVAL;
}
- tplg_dv(tplg, pos, "block: type %d - %s", hdr->type, tptr->name);
+ tplg_log(tplg, 'D', pos, "block: type %d - %s", hdr->type, tptr->name);
err = tptr->decod(tplg, pos, hdr, b + hdr->size, hdr->payload_size);
if (err < 0)
return err;
diff --git a/src/topology/log.c b/src/topology/log.c
new file mode 100644
index 000000000000..1ca365287c22
--- /dev/null
+++ b/src/topology/log.c
@@ -0,0 +1,34 @@
+/*
+ Copyright (c) 2019 Red Hat Inc.
+ All rights reserved.
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of
+ the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ Authors: Jaroslav Kysela <perex@perex.cz>
+*/
+
+#include "list.h"
+#include "tplg_local.h"
+
+/* verbose output detailing each object size and file position */
+void tplg_log_(snd_tplg_t *tplg, char type, size_t pos, const char *fmt, ...)
+{
+ va_list va;
+
+ if (!tplg->verbose)
+ return;
+
+ va_start(va, fmt);
+ fprintf(stdout, "%c0x%6.6zx/%6.6zd - ", type, pos, pos);
+ vfprintf(stdout, fmt, va);
+ va_end(va);
+ putc('\n', stdout);
+}
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 4e04a6bc3d78..918e3e9a957f 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -1969,21 +1969,21 @@ next:
return -EINVAL;
}
- tplg_dv(tplg, pos, "pcm: size %d private size %d streams %d",
- pcm->size, pcm->priv.size, pcm->num_streams);
+ tplg_log(tplg, 'D', pos, "pcm: size %d private size %d streams %d",
+ pcm->size, pcm->priv.size, pcm->num_streams);
pt->pcm_name = pcm->pcm_name;
- tplg_dv(tplg, pos, "pcm: pcm_name '%s'", pt->pcm_name);
+ tplg_log(tplg, 'D', pos, "pcm: pcm_name '%s'", pt->pcm_name);
pt->dai_name = pcm->dai_name;
- tplg_dv(tplg, pos, "pcm: dai_name '%s'", pt->dai_name);
+ tplg_log(tplg, 'D', pos, "pcm: dai_name '%s'", pt->dai_name);
pt->pcm_id = pcm->pcm_id;
pt->dai_id = pcm->dai_id;
- tplg_dv(tplg, pos, "pcm: pcm_id %d dai_id %d", pt->pcm_id, pt->dai_id);
+ tplg_log(tplg, 'D', pos, "pcm: pcm_id %d dai_id %d", pt->pcm_id, pt->dai_id);
pt->playback = pcm->playback;
pt->capture = pcm->capture;
pt->compress = pcm->compress;
- tplg_dv(tplg, pos, "pcm: playback %d capture %d compress",
- pt->playback, pt->capture, pt->compress);
+ tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress",
+ pt->playback, pt->capture, pt->compress);
pt->num_streams = pcm->num_streams;
pt->flag_mask = pcm->flag_mask;
pt->flags = pcm->flags;
@@ -1995,8 +1995,8 @@ next:
return -EINVAL;
}
stream->name = pcm->stream[i].name;
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_pcm, stream[i]),
- "stream %d: '%s'", i, stream->name);
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_pcm, stream[i]),
+ "stream %d: '%s'", i, stream->name);
stream->format = pcm->stream[i].format;
stream->rate = pcm->stream[i].rate;
stream->period_bytes = pcm->stream[i].period_bytes;
@@ -2016,8 +2016,8 @@ next:
return -EINVAL;
}
cap->name = pcm->caps[i].name;
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_pcm, caps[i]),
- "caps %d: '%s'", i, cap->name);
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_pcm, caps[i]),
+ "caps %d: '%s'", i, cap->name);
cap->formats = pcm->caps[i].formats;
cap->rates = pcm->caps[i].rates;
cap->rate_min = pcm->caps[i].rate_min;
@@ -2033,8 +2033,8 @@ next:
cap->sig_bits = pcm->caps[i].sig_bits;
}
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_pcm, priv),
- "pcm: private start");
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_pcm, priv),
+ "pcm: private start");
pt->priv = &pcm->priv;
bin += sizeof(*pcm) + pcm->priv.size;
@@ -2120,16 +2120,16 @@ next:
return -EINVAL;
}
- tplg_dv(tplg, pos, "link: size %d private size %d streams %d "
- "hw_configs %d",
- link->size, link->priv.size, link->num_streams,
- link->num_hw_configs);
+ tplg_log(tplg, 'D', pos, "link: size %d private size %d streams %d "
+ "hw_configs %d",
+ link->size, link->priv.size, link->num_streams,
+ link->num_hw_configs);
lt.id = link->id;
lt.name = link->name;
- tplg_dv(tplg, pos, "link: name '%s'", lt.name);
+ tplg_log(tplg, 'D', pos, "link: name '%s'", lt.name);
lt.stream_name = link->stream_name;
- tplg_dv(tplg, pos, "link: stream_name '%s'", lt.stream_name);
+ tplg_log(tplg, 'D', pos, "link: stream_name '%s'", lt.stream_name);
lt.num_streams = link->num_streams;
lt.num_hw_configs = link->num_hw_configs;
lt.default_hw_config_id = link->default_hw_config_id;
@@ -2143,9 +2143,9 @@ next:
return -EINVAL;
}
stream->name = link->stream[i].name;
- tplg_dv(tplg,
- pos + offsetof(struct snd_soc_tplg_link_config, stream[i]),
- "stream %d: '%s'", i, stream->name);
+ tplg_log(tplg, 'D',
+ pos + offsetof(struct snd_soc_tplg_link_config, stream[i]),
+ "stream %d: '%s'", i, stream->name);
stream->format = link->stream[i].format;
stream->rate = link->stream[i].rate;
stream->period_bytes = link->stream[i].period_bytes;
@@ -2192,8 +2192,8 @@ next:
}
lt.hw_config = hws;
- tplg_dv(tplg, pos + offsetof(struct snd_soc_tplg_pcm, priv),
- "link: private start");
+ tplg_log(tplg, 'D', pos + offsetof(struct snd_soc_tplg_pcm, priv),
+ "link: private start");
lt.priv = &link->priv;
bin += sizeof(*link) + link->priv.size;
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 22fc5fba48b9..e061db755ed2 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -226,6 +226,13 @@ struct tplg_table {
extern struct tplg_table tplg_table[];
extern unsigned int tplg_table_items;
+#define tplg_log(tplg, type, pos, fmt, args...) do { \
+ if ((tplg)->verbose) \
+ tplg_log_((tplg), (type), (pos), (fmt), ##args); \
+} while (0)
+
+void tplg_log_(snd_tplg_t *tplg, char type, size_t pos, const char *fmt, ...);
+
void *tplg_calloc(struct list_head *heap, size_t size);
void tplg_free(struct list_head *heap);
@@ -373,7 +380,6 @@ int tplg_save_stream_caps(snd_tplg_t *tplg, struct tplg_elem *elem,
int tplg_save_dai(snd_tplg_t *tplg, struct tplg_elem *elem,
char **dst, const char *pfx);
-void tplg_dv(snd_tplg_t *tplg, size_t pos, const char *fmt, ...);
int tplg_decode_template(snd_tplg_t *tplg,
size_t pos,
struct snd_soc_tplg_hdr *hdr,
--
2.16.4

View File

@ -1,784 +0,0 @@
From d768da27e7f9f56328c61ed5d37c17ce075cbc6e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Jan 2020 22:44:15 +0100
Subject: [PATCH 56/63] topology: tplg_dbg() cleanups
- remove newline at the end
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/channel.c | 6 +++---
src/topology/ctl.c | 40 ++++++++++++++++++++--------------------
src/topology/dapm.c | 32 ++++++++++++++++----------------
src/topology/data.c | 48 +++++++++++++++++++++++++++---------------------
src/topology/ops.c | 8 ++++----
src/topology/pcm.c | 36 ++++++++++++++++++------------------
src/topology/text.c | 6 +++---
7 files changed, 91 insertions(+), 85 deletions(-)
diff --git a/src/topology/channel.c b/src/topology/channel.c
index 390c3f164e97..47d5ea4c419a 100644
--- a/src/topology/channel.c
+++ b/src/topology/channel.c
@@ -100,7 +100,7 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
channel += tplg->channel_idx;
snd_config_get_id(cfg, &id);
- tplg_dbg("\tChannel %s at index %d\n", id, tplg->channel_idx);
+ tplg_dbg("\tChannel %s at index %d", id, tplg->channel_idx);
channel_id = lookup_channel(id);
if (channel_id < 0) {
@@ -110,7 +110,7 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
channel->id = channel_id;
channel->size = sizeof(*channel);
- tplg_dbg("\tChan %s = %d\n", id, channel->id);
+ tplg_dbg("\tChan %s = %d", id, channel->id);
snd_config_for_each(i, next, cfg) {
@@ -129,7 +129,7 @@ int tplg_parse_channel(snd_tplg_t *tplg, snd_config_t *cfg,
else if (strcmp(id, "shift") == 0)
channel->shift = value;
- tplg_dbg("\t\t%s = %d\n", id, value);
+ tplg_dbg("\t\t%s = %d", id, value);
}
tplg->channel_idx++;
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index a5a81148d1eb..41dc2ddbb826 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -54,7 +54,7 @@ static int parse_access_values(snd_config_t *cfg,
const char *value = NULL;
unsigned int j;
- tplg_dbg(" Access:\n");
+ tplg_dbg(" Access:");
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
@@ -67,7 +67,7 @@ static int parse_access_values(snd_config_t *cfg,
for (j = 0; j < ARRAY_SIZE(ctl_access); j++) {
if (strcmp(value, ctl_access[j].name) == 0) {
hdr->access |= ctl_access[j].value;
- tplg_dbg("\t%s\n", value);
+ tplg_dbg("\t%s", value);
break;
}
}
@@ -150,7 +150,7 @@ static int copy_tlv(struct tplg_elem *elem, struct tplg_elem *ref)
struct snd_soc_tplg_mixer_control *mixer_ctrl = elem->mixer_ctrl;
struct snd_soc_tplg_ctl_tlv *tlv = ref->tlv;
- tplg_dbg("TLV '%s' used by '%s\n", ref->id, elem->id);
+ tplg_dbg("TLV '%s' used by '%s", ref->id, elem->id);
/* TLV has a fixed size */
mixer_ctrl->hdr.tlv = *tlv;
@@ -330,7 +330,7 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
const char *id = NULL;
int val;
- tplg_dbg(" scale: %s\n", elem->id);
+ tplg_dbg(" scale: %s", elem->id);
tplg_tlv->size = sizeof(struct snd_soc_tplg_ctl_tlv);
tplg_tlv->type = SNDRV_CTL_TLVT_DB_SCALE;
@@ -348,7 +348,7 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem)
if (tplg_get_integer(n, &val, 0))
continue;
- tplg_dbg("\t%s = %i\n", id, val);
+ tplg_dbg("\t%s = %i", id, val);
/* get TLV data */
if (strcmp(id, "min") == 0)
@@ -450,7 +450,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
snd_strlcpy(be->hdr.name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
be->hdr.type = SND_SOC_TPLG_TYPE_BYTES;
- tplg_dbg(" Control Bytes: %s\n", elem->id);
+ tplg_dbg(" Control Bytes: %s", elem->id);
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
@@ -468,7 +468,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
return -EINVAL;
be->base = ival;
- tplg_dbg("\t%s: %d\n", id, be->base);
+ tplg_dbg("\t%s: %d", id, be->base);
continue;
}
@@ -477,7 +477,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
return -EINVAL;
be->num_regs = ival;
- tplg_dbg("\t%s: %d\n", id, be->num_regs);
+ tplg_dbg("\t%s: %d", id, be->num_regs);
continue;
}
@@ -486,7 +486,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
return -EINVAL;
be->max = ival;
- tplg_dbg("\t%s: %d\n", id, be->max);
+ tplg_dbg("\t%s: %d", id, be->max);
continue;
}
@@ -495,7 +495,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
return -EINVAL;
be->mask = ival;
- tplg_dbg("\t%s: %d\n", id, be->mask);
+ tplg_dbg("\t%s: %d", id, be->mask);
continue;
}
@@ -515,7 +515,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
return err;
tlv_set = true;
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -625,7 +625,7 @@ int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg,
ec->channel[j].reg = -1;
}
- tplg_dbg(" Control Enum: %s\n", elem->id);
+ tplg_dbg(" Control Enum: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -644,7 +644,7 @@ int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg,
return -EINVAL;
tplg_ref_add(elem, SND_TPLG_TYPE_TEXT, val);
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -761,7 +761,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
for (j = 0; j < SND_SOC_TPLG_MAX_CHAN; j++)
mc->channel[j].reg = -1;
- tplg_dbg(" Control Mixer: %s\n", elem->id);
+ tplg_dbg(" Control Mixer: %s", elem->id);
/* giterate trough each mixer elment */
snd_config_for_each(i, next, cfg) {
@@ -795,7 +795,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
return -EINVAL;
mc->max = ival;
- tplg_dbg("\t%s: %d\n", id, mc->max);
+ tplg_dbg("\t%s: %d", id, mc->max);
continue;
}
@@ -805,7 +805,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
return -EINVAL;
mc->invert = ival;
- tplg_dbg("\t%s: %d\n", id, mc->invert);
+ tplg_dbg("\t%s: %d", id, mc->invert);
continue;
}
@@ -826,7 +826,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
return err;
tlv_set = true;
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -981,7 +981,7 @@ int tplg_add_mixer(snd_tplg_t *tplg, struct snd_tplg_mixer_template *mixer,
struct tplg_elem *elem;
int ret, i, num_channels;
- tplg_dbg(" Control Mixer: %s\n", mixer->hdr.name);
+ tplg_dbg(" Control Mixer: %s", mixer->hdr.name);
if (mixer->hdr.type != SND_SOC_TPLG_TYPE_MIXER) {
SNDERR("invalid mixer type %d", mixer->hdr.type);
@@ -1045,7 +1045,7 @@ int tplg_add_enum(snd_tplg_t *tplg, struct snd_tplg_enum_template *enum_ctl,
struct tplg_elem *elem;
int ret, i, num_items, num_channels;
- tplg_dbg(" Control Enum: %s\n", enum_ctl->hdr.name);
+ tplg_dbg(" Control Enum: %s", enum_ctl->hdr.name);
if (enum_ctl->hdr.type != SND_SOC_TPLG_TYPE_ENUM) {
SNDERR("invalid enum type %d", enum_ctl->hdr.type);
@@ -1128,7 +1128,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl,
struct tplg_elem *elem;
int ret;
- tplg_dbg(" Control Bytes: %s\n", bytes_ctl->hdr.name);
+ tplg_dbg(" Control Bytes: %s", bytes_ctl->hdr.name);
if (bytes_ctl->hdr.type != SND_SOC_TPLG_TYPE_BYTES) {
SNDERR("invalid bytes type %d", bytes_ctl->hdr.type);
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 0bf64833c11f..cb85e66734f6 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -76,8 +76,8 @@ static int copy_dapm_control(struct tplg_elem *elem, struct tplg_elem *ref)
{
struct snd_soc_tplg_dapm_widget *widget = elem->widget;
- tplg_dbg("Control '%s' used by '%s'\n", ref->id, elem->id);
- tplg_dbg("\tparent size: %d + %d -> %d, priv size -> %d\n",
+ tplg_dbg("Control '%s' used by '%s'", ref->id, elem->id);
+ tplg_dbg("\tparent size: %d + %d -> %d, priv size -> %d",
elem->size, ref->size, elem->size + ref->size,
widget->priv.size);
@@ -210,8 +210,8 @@ int tplg_build_routes(snd_tplg_t *tplg)
}
route = elem->route;
- tplg_dbg("\nCheck route: sink '%s', control '%s', source '%s'\n",
- route->sink, route->control, route->source);
+ tplg_dbg("Check route: sink '%s', control '%s', source '%s'",
+ route->sink, route->control, route->source);
/* validate sink */
if (strlen(route->sink) <= 0) {
@@ -357,7 +357,7 @@ static int tplg_parse_routes(snd_tplg_t *tplg, snd_config_t *cfg, int index)
if (err < 0)
return err;
- tplg_dbg("route: sink '%s', control '%s', source '%s'\n",
+ tplg_dbg("route: sink '%s', control '%s', source '%s'",
line->sink, line->control, line->source);
}
@@ -520,7 +520,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
if (!elem)
return -ENOMEM;
- tplg_dbg(" Widget: %s\n", elem->id);
+ tplg_dbg(" Widget: %s", elem->id);
widget = elem->widget;
snd_strlcpy(widget->name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
@@ -550,7 +550,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
}
widget->id = widget_type;
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -560,7 +560,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
snd_strlcpy(widget->sname, val,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -571,7 +571,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
widget->reg = ival ? -1 : 0;
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -580,7 +580,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->shift = ival;
- tplg_dbg("\t%s: %d\n", id, widget->shift);
+ tplg_dbg("\t%s: %d", id, widget->shift);
continue;
}
@@ -589,7 +589,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->reg = ival;
- tplg_dbg("\t%s: %d\n", id, widget->reg);
+ tplg_dbg("\t%s: %d", id, widget->reg);
continue;
}
@@ -598,7 +598,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->invert = ival;
- tplg_dbg("\t%s: %d\n", id, widget->invert);
+ tplg_dbg("\t%s: %d", id, widget->invert);
continue;
}
@@ -607,7 +607,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->subseq = ival;
- tplg_dbg("\t%s: %d\n", id, widget->subseq);
+ tplg_dbg("\t%s: %d", id, widget->subseq);
continue;
}
@@ -616,7 +616,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->event_type = ival;
- tplg_dbg("\t%s: %d\n", id, widget->event_type);
+ tplg_dbg("\t%s: %d", id, widget->event_type);
continue;
}
@@ -625,7 +625,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
return -EINVAL;
widget->event_flags = ival;
- tplg_dbg("\t%s: %d\n", id, widget->event_flags);
+ tplg_dbg("\t%s: %d", id, widget->event_flags);
continue;
}
@@ -767,7 +767,7 @@ int tplg_add_widget_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
struct tplg_elem *elem;
int i, ret = 0;
- tplg_dbg("Widget: %s\n", wt->name);
+ tplg_dbg("Widget: %s", wt->name);
elem = tplg_elem_new_common(tplg, NULL, wt->name,
SND_TPLG_TYPE_DAPM_WIDGET);
diff --git a/src/topology/data.c b/src/topology/data.c
index 0b513428da80..37c4591987db 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -87,7 +87,7 @@ int tplg_parse_refs(snd_config_t *cfg, struct tplg_elem *elem,
if (snd_config_get_string(cfg, &val) < 0)
return -EINVAL;
- tplg_dbg("\tref data: %s\n", val);
+ tplg_dbg("\tref data: %s", val);
err = tplg_ref_add(elem, type, val);
if (err < 0)
return err;
@@ -108,7 +108,7 @@ int tplg_parse_refs(snd_config_t *cfg, struct tplg_elem *elem,
if (snd_config_get_string(n, &val) < 0)
continue;
- tplg_dbg("\tref data: %s\n", val);
+ tplg_dbg("\tref data: %s", val);
err = tplg_ref_add(elem, type, val);
if (err < 0)
return err;
@@ -169,7 +169,7 @@ static int tplg_parse_data_file(snd_config_t *cfg, struct tplg_elem *elem)
size_t size, bytes_read;
int ret = 0;
- tplg_dbg("data DataFile: %s\n", elem->id);
+ tplg_dbg("data DataFile: %s", elem->id);
if (snd_config_get_string(cfg, &value) < 0)
return -EINVAL;
@@ -235,19 +235,25 @@ static void dump_priv_data(struct tplg_elem *elem ATTRIBUTE_UNUSED)
#ifdef TPLG_DEBUG
struct snd_soc_tplg_private *priv = elem->data;
unsigned char *p = (unsigned char *)priv->data;
+ char buf[128], buf2[8];
unsigned int i;
- tplg_dbg(" elem size = %d, priv data size = %d\n",
+ tplg_dbg(" elem size = %d, priv data size = %d",
elem->size, priv->size);
+ buf[0] = '\0';
for (i = 0; i < priv->size; i++) {
- if (i > 0 && (i % 16) == 0)
- tplg_dbg("\n");
+ if (i > 0 && (i % 16) == 0) {
+ tplg_dbg("%s", buf);
+ buf[0] = '\0';
+ }
- tplg_dbg(" %02x:", *p++);
+ snprintf(buf2, sizeof(buf2), " %02x", *p++);
+ strcat(buf, buf2);
}
- tplg_dbg("\n\n");
+ if (buf[0])
+ tplg_dbg("%s", buf);
#endif
}
@@ -466,7 +472,7 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
int size, esize, off, num;
int ret;
- tplg_dbg(" data: %s\n", elem->id);
+ tplg_dbg(" data: %s", elem->id);
if (snd_config_get_string(cfg, &value) < 0)
return -EINVAL;
@@ -683,7 +689,7 @@ static int build_tuples(snd_tplg_t *tplg, struct tplg_elem *elem)
if (ref->type != SND_TPLG_TYPE_TUPLE)
continue;
- tplg_dbg("tuples '%s' used by data '%s'\n", ref->id, elem->id);
+ tplg_dbg("tuples '%s' used by data '%s'", ref->id, elem->id);
if (!ref->elem)
ref->elem = tplg_elem_lookup(&tplg->tuple_list,
@@ -799,7 +805,7 @@ static int parse_tuple_set(snd_config_t *cfg,
if (!num_tuples)
return 0;
- tplg_dbg("\t %d %s tuples:\n", num_tuples, id);
+ tplg_dbg("\t %d %s tuples:", num_tuples, id);
set = calloc(1, sizeof(*set) + num_tuples * sizeof(struct tplg_tuple));
if (!set)
return -ENOMEM;
@@ -831,7 +837,7 @@ static int parse_tuple_set(snd_config_t *cfg,
continue;
snd_strlcpy(tuple->string, value,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg("\t\t%s = %s\n", tuple->token, tuple->string);
+ tplg_dbg("\t\t%s = %s", tuple->token, tuple->string);
break;
case SND_SOC_TPLG_TUPLE_TYPE_BOOL:
@@ -839,7 +845,7 @@ static int parse_tuple_set(snd_config_t *cfg,
if (ival < 0)
continue;
tuple->value = ival;
- tplg_dbg("\t\t%s = %d\n", tuple->token, tuple->value);
+ tplg_dbg("\t\t%s = %d", tuple->token, tuple->value);
break;
case SND_SOC_TPLG_TUPLE_TYPE_BYTE:
@@ -862,7 +868,7 @@ static int parse_tuple_set(snd_config_t *cfg,
}
tuple->value = tuple_val;
- tplg_dbg("\t\t%s = 0x%x\n", tuple->token, tuple->value);
+ tplg_dbg("\t\t%s = 0x%x", tuple->token, tuple->value);
break;
default:
@@ -1047,7 +1053,7 @@ int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
if (!num_tokens)
return 0;
- tplg_dbg(" Vendor tokens: %s, %d tokens\n", elem->id, num_tokens);
+ tplg_dbg(" Vendor tokens: %s, %d tokens", elem->id, num_tokens);
tokens = calloc(1, sizeof(*tokens)
+ num_tokens * sizeof(struct tplg_token));
@@ -1067,7 +1073,7 @@ int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
snd_strlcpy(tokens->token[tokens->num_tokens].id, id,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
tokens->token[tokens->num_tokens].value = value;
- tplg_dbg("\t\t %s : %d\n", tokens->token[tokens->num_tokens].id,
+ tplg_dbg("\t\t %s : %d", tokens->token[tokens->num_tokens].id,
tokens->token[tokens->num_tokens].value);
tokens->num_tokens++;
}
@@ -1116,7 +1122,7 @@ int tplg_parse_tuples(snd_tplg_t *tplg, snd_config_t *cfg,
if (!elem)
return -ENOMEM;
- tplg_dbg(" Vendor Tuples: %s\n", elem->id);
+ tplg_dbg(" Vendor Tuples: %s", elem->id);
tuples = calloc(1, sizeof(*tuples));
if (!tuples)
@@ -1133,7 +1139,7 @@ int tplg_parse_tuples(snd_tplg_t *tplg, snd_config_t *cfg,
if (snd_config_get_string(n, &value) < 0)
return -EINVAL;
tplg_ref_add(elem, SND_TPLG_TYPE_TOKEN, value);
- tplg_dbg("\t refer to vendor tokens: %s\n", value);
+ tplg_dbg("\t refer to vendor tokens: %s", value);
}
if (strcmp(id, "tuples") == 0) {
@@ -1208,7 +1214,7 @@ int tplg_parse_manifest_data(snd_tplg_t *tplg, snd_config_t *cfg,
manifest = elem->manifest;
manifest->size = elem->size;
- tplg_dbg(" Manifest: %s\n", elem->id);
+ tplg_dbg(" Manifest: %s", elem->id);
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
@@ -1402,7 +1408,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
return -EINVAL;
elem->vendor_type = ival;
- tplg_dbg("\t%s: %d\n", id, elem->index);
+ tplg_dbg("\t%s: %d", id, elem->index);
continue;
}
}
@@ -1506,7 +1512,7 @@ int tplg_copy_data(snd_tplg_t *tplg, struct tplg_elem *elem,
return -EINVAL;
}
- tplg_dbg("Data '%s' used by '%s'\n", ref->id, elem->id);
+ tplg_dbg("Data '%s' used by '%s'", ref->id, elem->id);
/* overlook empty private data */
if (!ref_elem->data || !ref_elem->data->size) {
ref->elem = ref_elem;
diff --git a/src/topology/ops.c b/src/topology/ops.c
index 2885c7814604..110eef58851d 100644
--- a/src/topology/ops.c
+++ b/src/topology/ops.c
@@ -69,7 +69,7 @@ int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED, snd_config_t *cfg,
const char *id, *value;
int ival;
- tplg_dbg("\tOps\n");
+ tplg_dbg("\tOps");
hdr->size = sizeof(*hdr);
snd_config_for_each(i, next, cfg) {
@@ -97,7 +97,7 @@ int tplg_parse_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED, snd_config_t *cfg,
else if (strcmp(id, "get") == 0)
hdr->ops.get = ival;
- tplg_dbg("\t\t%s = %d\n", id, ival);
+ tplg_dbg("\t\t%s = %d", id, ival);
}
return 0;
@@ -155,7 +155,7 @@ int tplg_parse_ext_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
const char *id, *value;
int ival;
- tplg_dbg("\tExt Ops\n");
+ tplg_dbg("\tExt Ops");
snd_config_for_each(i, next, cfg) {
@@ -182,7 +182,7 @@ int tplg_parse_ext_ops(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
else if (strcmp(id, "get") == 0)
be->ext_ops.get = ival;
- tplg_dbg("\t\t%s = %s\n", id, value);
+ tplg_dbg("\t\t%s = %s", id, value);
}
return 0;
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 918e3e9a957f..da88783f2b09 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -68,7 +68,7 @@ static void copy_stream_caps(const char *id ATTRIBUTE_UNUSED,
{
struct snd_soc_tplg_stream_caps *ref_caps = ref_elem->stream_caps;
- tplg_dbg("Copy pcm caps (%ld bytes) from '%s' to '%s' \n",
+ tplg_dbg("Copy pcm caps (%ld bytes) from '%s' to '%s'",
sizeof(*caps), ref_elem->id, id);
*caps = *ref_caps;
@@ -388,7 +388,7 @@ static int parse_unsigned(snd_config_t *n, unsigned int *dst)
{
const char *id;
if (snd_config_get_id(n, &id) >= 0)
- tplg_dbg("\t\t%s: %d\n", id, *dst);
+ tplg_dbg("\t\t%s: %d", id, *dst);
}
#endif
return 0;
@@ -415,7 +415,7 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
sc->size = elem->size;
snd_strlcpy(sc->name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg(" PCM Capabilities: %s\n", elem->id);
+ tplg_dbg(" PCM Capabilities: %s", elem->id);
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
@@ -442,7 +442,7 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
if (err < 0)
return err;
- tplg_dbg("\t\t%s: %s\n", id, val);
+ tplg_dbg("\t\t%s: %s", id, val);
continue;
}
@@ -460,7 +460,7 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg,
if (err < 0)
return err;
- tplg_dbg("\t\t%s: %s\n", id, val);
+ tplg_dbg("\t\t%s: %s", id, val);
continue;
}
@@ -625,7 +625,7 @@ static int tplg_parse_streams(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
snd_config_get_id(cfg, &id);
- tplg_dbg("\t%s:\n", id);
+ tplg_dbg("\t%s:", id);
switch (elem->type) {
case SND_TPLG_TYPE_PCM:
@@ -672,7 +672,7 @@ static int tplg_parse_streams(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
snd_strlcpy(caps[stream].name, value,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg("\t\t%s\n\t\t\t%s\n", id, value);
+ tplg_dbg("\t\t%s\n\t\t\t%s", id, value);
continue;
}
}
@@ -746,7 +746,7 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
const char *id;
snd_config_get_id(cfg, &id);
- tplg_dbg("\t\tFE DAI %s:\n", id);
+ tplg_dbg("\t\tFE DAI %s:", id);
snd_strlcpy(pcm->dai_name, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
snd_config_for_each(i, next, cfg) {
@@ -763,7 +763,7 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
return -EINVAL;
}
- tplg_dbg("\t\t\tindex: %d\n", pcm->dai_id);
+ tplg_dbg("\t\t\tindex: %d", pcm->dai_id);
}
}
@@ -847,7 +847,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
pcm->size = elem->size;
snd_strlcpy(pcm->pcm_name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg(" PCM: %s\n", elem->id);
+ tplg_dbg(" PCM: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -882,7 +882,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg, snd_config_t *cfg,
pcm->compress = ival;
- tplg_dbg("\t%s: %d\n", id, ival);
+ tplg_dbg("\t%s: %d", id, ival);
continue;
}
@@ -988,7 +988,7 @@ int tplg_parse_dai(snd_tplg_t *tplg, snd_config_t *cfg,
snd_strlcpy(dai->dai_name, elem->id,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg(" DAI: %s\n", elem->id);
+ tplg_dbg(" DAI: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -1142,7 +1142,7 @@ int tplg_parse_link(snd_tplg_t *tplg,
link->size = elem->size;
snd_strlcpy(link->name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg(" Link: %s\n", elem->id);
+ tplg_dbg(" Link: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -1168,7 +1168,7 @@ int tplg_parse_link(snd_tplg_t *tplg,
snd_strlcpy(link->stream_name, val,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg("\t%s: %s\n", id, val);
+ tplg_dbg("\t%s: %s", id, val);
continue;
}
@@ -1280,7 +1280,7 @@ int tplg_parse_cc(snd_tplg_t *tplg,
link = elem->link;
link->size = elem->size;
- tplg_dbg(" CC: %s\n", elem->id);
+ tplg_dbg(" CC: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -1412,7 +1412,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
hw_cfg = elem->hw_cfg;
hw_cfg->size = elem->size;
- tplg_dbg(" Link HW config: %s\n", elem->id);
+ tplg_dbg(" Link HW config: %s", elem->id);
snd_config_for_each(i, next, cfg) {
@@ -1719,7 +1719,7 @@ int tplg_add_pcm_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
struct tplg_elem *elem;
int ret, i;
- tplg_dbg("PCM: %s, DAI %s\n", pcm_tpl->pcm_name, pcm_tpl->dai_name);
+ tplg_dbg("PCM: %s, DAI %s", pcm_tpl->pcm_name, pcm_tpl->dai_name);
if (pcm_tpl->num_streams > SND_SOC_TPLG_STREAM_CONFIG_MAX)
return -EINVAL;
@@ -1881,7 +1881,7 @@ int tplg_add_dai_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
struct tplg_elem *elem;
int ret, i;
- tplg_dbg("DAI %s\n", dai_tpl->dai_name);
+ tplg_dbg("DAI %s", dai_tpl->dai_name);
elem = tplg_elem_new_common(tplg, NULL, dai_tpl->dai_name,
SND_TPLG_TYPE_DAI);
diff --git a/src/topology/text.c b/src/topology/text.c
index 6dbf22305fd3..507c5450ab14 100644
--- a/src/topology/text.c
+++ b/src/topology/text.c
@@ -32,13 +32,13 @@ static int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem)
const char *value = NULL;
int j = 0;
- tplg_dbg(" Text Values: %s\n", elem->id);
+ tplg_dbg(" Text Values: %s", elem->id);
snd_config_for_each(i, next, cfg) {
n = snd_config_iterator_entry(i);
if (j == SND_SOC_TPLG_NUM_TEXTS) {
- tplg_dbg("text string number exceeds %d\n", j);
+ tplg_dbg("text string number exceeds %d", j);
return -ENOMEM;
}
@@ -48,7 +48,7 @@ static int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem)
snd_strlcpy(&texts->items[j][0], value,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
- tplg_dbg("\t%s\n", &texts->items[j][0]);
+ tplg_dbg("\t%s", &texts->items[j][0]);
j++;
}
--
2.16.4

View File

@ -1,201 +0,0 @@
From b20b400e2f598c86abaf697d66396cecd49b3e14 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Jan 2020 22:56:48 +0100
Subject: [PATCH 57/63] topology: cosmetic changes (functions)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/builder.c | 3 ++-
src/topology/ctl.c | 5 +++--
src/topology/data.c | 17 +++++++++--------
src/topology/parser.c | 4 ++--
src/topology/pcm.c | 16 ++++++++--------
5 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 7af5de084d84..15757668d7d4 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -71,7 +71,8 @@ static ssize_t write_block_header(snd_tplg_t *tplg, unsigned int type,
}
static int write_elem_block(snd_tplg_t *tplg,
- struct list_head *base, size_t size, int tplg_type, const char *obj_name)
+ struct list_head *base, size_t size,
+ int tplg_type, const char *obj_name)
{
struct list_head *pos, *sub_pos, *sub_base;
struct tplg_elem *elem, *elem_next;
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 41dc2ddbb826..b78f1c54be05 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -600,7 +600,7 @@ int tplg_save_control_bytes(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
/* Parse Control Enums. */
int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_enum_control *ec;
struct tplg_elem *elem;
@@ -736,7 +736,8 @@ int tplg_save_control_enum(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
* Mixer control. Supports multiple channels.
*/
int tplg_parse_control_mixer(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+ snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_mixer_control *mc;
struct tplg_elem *elem;
diff --git a/src/topology/data.c b/src/topology/data.c
index 37c4591987db..b63e98cd7282 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -516,7 +516,7 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
/* get the token integer value from its id */
static int get_token_value(const char *token_id,
- struct tplg_vendor_tokens *tokens)
+ struct tplg_vendor_tokens *tokens)
{
unsigned int i;
@@ -589,7 +589,8 @@ unsigned int tplg_get_tuple_size(int type)
/* Add a tuples object to the private buffer of its parent data element */
static int copy_tuples(struct tplg_elem *elem,
- struct tplg_vendor_tuples *tuples, struct tplg_vendor_tokens *tokens)
+ struct tplg_vendor_tuples *tuples,
+ struct tplg_vendor_tokens *tokens)
{
struct snd_soc_tplg_private *priv = elem->data, *priv2;
struct tplg_tuple_set *tuple_set;
@@ -781,7 +782,7 @@ static const char *get_tuple_type_name(unsigned int type)
}
static int parse_tuple_set(snd_config_t *cfg,
- struct tplg_tuple_set **s)
+ struct tplg_tuple_set **s)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -965,7 +966,7 @@ static int tplg_save_tuple_set(struct tplg_vendor_tuples *tuples,
}
static int parse_tuple_sets(snd_config_t *cfg,
- struct tplg_vendor_tuples *tuples)
+ struct tplg_vendor_tuples *tuples)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -1033,7 +1034,7 @@ int tplg_save_tuple_sets(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
/* Parse vendor tokens
*/
int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -1109,7 +1110,7 @@ int tplg_save_tokens(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
/* Parse vendor tuples.
*/
int tplg_parse_tuples(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
@@ -1193,7 +1194,7 @@ void tplg_free_tuples(void *obj)
/* Parse manifest's data references
*/
int tplg_parse_manifest_data(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_manifest *manifest;
struct tplg_elem *elem;
@@ -1341,7 +1342,7 @@ int tplg_build_manifest_data(snd_tplg_t *tplg)
* words, tuples.
*/
int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
- void *private ATTRIBUTE_UNUSED)
+ void *private ATTRIBUTE_UNUSED)
{
snd_config_iterator_t i, next;
snd_config_t *n;
diff --git a/src/topology/parser.c b/src/topology/parser.c
index d7783a93ab6b..436e48416a43 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -110,8 +110,8 @@ int tplg_get_unsigned(snd_config_t *n, unsigned *val, int base)
* Parse compound
*/
int tplg_parse_compound(snd_tplg_t *tplg, snd_config_t *cfg,
- int (*fcn)(snd_tplg_t *, snd_config_t *, void *),
- void *private)
+ int (*fcn)(snd_tplg_t *, snd_config_t *, void *),
+ void *private)
{
const char *id;
snd_config_iterator_t i, next;
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index da88783f2b09..61159d33357c 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -1124,8 +1124,8 @@ static int parse_hw_config_refs(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
}
/* Parse a physical link element in text conf file */
-int tplg_parse_link(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+int tplg_parse_link(snd_tplg_t *tplg, snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_link_config *link;
struct tplg_elem *elem;
@@ -1264,8 +1264,8 @@ int tplg_save_link(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
}
/* Parse cc */
-int tplg_parse_cc(snd_tplg_t *tplg,
- snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
+int tplg_parse_cc(snd_tplg_t *tplg, snd_config_t *cfg,
+ void *private ATTRIBUTE_UNUSED)
{
struct snd_soc_tplg_link_config *link;
struct tplg_elem *elem;
@@ -1307,8 +1307,8 @@ int tplg_parse_cc(snd_tplg_t *tplg,
/* save CC */
int tplg_save_cc(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
- struct tplg_elem *elem,
- char **dst, const char *pfx)
+ struct tplg_elem *elem,
+ char **dst, const char *pfx)
{
struct snd_soc_tplg_link_config *link = elem->link;
char pfx2[16];
@@ -1668,7 +1668,7 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
/* copy stream object */
static void tplg_add_stream_object(struct snd_soc_tplg_stream *strm,
- struct snd_tplg_stream_template *strm_tpl)
+ struct snd_tplg_stream_template *strm_tpl)
{
snd_strlcpy(strm->name, strm_tpl->name,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
@@ -1773,7 +1773,7 @@ int tplg_add_pcm_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
/* Set link HW config from C API template */
static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
- struct snd_tplg_hw_config_template *tpl)
+ struct snd_tplg_hw_config_template *tpl)
{
unsigned int i;
--
2.16.4

View File

@ -1,29 +0,0 @@
From 14ad963e192f101246e9b559d3b3fd41268330fb Mon Sep 17 00:00:00 2001
From: David Fries <David@Fries.net>
Date: Tue, 7 Jan 2020 09:18:10 -0600
Subject: [PATCH 58/63] mixer: Fix memory leak for more than 16 file descriptor
case
Signed-off-by: David Fries <David@Fries.net>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/mixer/mixer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/mixer/mixer.c b/src/mixer/mixer.c
index 8205647449d2..b1af99456c8d 100644
--- a/src/mixer/mixer.c
+++ b/src/mixer/mixer.c
@@ -767,7 +767,7 @@ int snd_mixer_wait(snd_mixer_t *mixer, int timeout)
if (count < 0)
return count;
if ((unsigned int) count > sizeof(spfds) / sizeof(spfds[0])) {
- pfds = malloc(count * sizeof(*pfds));
+ pfds = alloca(count * sizeof(*pfds));
if (!pfds)
return -ENOMEM;
err = snd_mixer_poll_descriptors(mixer, pfds,
--
2.16.4

View File

@ -1,28 +0,0 @@
From a78dd1bd1e9b47c2aee9b1e066de515b6854695a Mon Sep 17 00:00:00 2001
From: Bertware <bert.marcelis@outlook.com>
Date: Mon, 13 Jan 2020 10:21:33 +0100
Subject: [PATCH 59/63] Quote strings containing [ or ] when saving an alsa
config
Signed-off-by: Bert Marcelis <bert.marcelis@outlook.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/conf.c b/src/conf.c
index c4db9f21a15e..50d0403452a0 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -1531,6 +1531,8 @@ static void string_print(char *str, int id, snd_output_t *out)
case '.':
case '{':
case '}':
+ case '[':
+ case ']':
case '\'':
case '"':
goto quoted;
--
2.16.4

View File

@ -1,32 +0,0 @@
From b34715004f4a1aabb85c5b9f03ba9f200638ee97 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 15 Jan 2020 09:41:05 +0100
Subject: [PATCH 60/63] ucm: fix the configuration directory (longname) for
ucm2
The new ucm2 expects that the longname directory is shared with
the driver directory. Fix that for 'Syntax 2'.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index d61124a343e1..b3970a13bf73 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1649,7 +1649,9 @@ __longname:
if (err == 0) {
/* got device-specific file that matches the card long name */
- snd_strlcpy(uc_mgr->conf_file_name, longname, sizeof(uc_mgr->conf_file_name));
+ if (uc_mgr->conf_format < 2)
+ snd_strlcpy(uc_mgr->conf_file_name, longname,
+ sizeof(uc_mgr->conf_file_name));
goto __parse;
}
}
--
2.16.4

View File

@ -1,209 +0,0 @@
From fe6425af751a768a2ba6cf7d430a85553d3b84f6 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 15 Jan 2020 10:31:56 +0100
Subject: [PATCH 61/63] ucm: split conf_file_name and conf_dir_name
With ucm2, the file name might differ from the directory
name. Also, allocate those fields.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/main.c | 7 ++++---
src/ucm/parser.c | 37 ++++++++++++++++++++++++++-----------
src/ucm/ucm_local.h | 4 ++--
src/ucm/ucm_subs.c | 2 +-
src/ucm/utils.c | 4 ++++
5 files changed, 37 insertions(+), 17 deletions(-)
diff --git a/src/ucm/main.c b/src/ucm/main.c
index 61922f10b7c7..23e15bd8dacb 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -1700,12 +1700,13 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
err = 0;
} else if (strcmp(identifier, "_file") == 0) {
/* get the conf file name of the opened card */
- if ((uc_mgr->card_name == NULL)
- || (uc_mgr->conf_file_name[0] == '\0')) {
+ if ((uc_mgr->card_name == NULL) ||
+ (uc_mgr->conf_file_name == NULL) ||
+ (uc_mgr->conf_file_name[0] == '\0')) {
err = -ENOENT;
goto __end;
}
- *value = strndup(uc_mgr->conf_file_name, MAX_FILE);
+ *value = strdup(uc_mgr->conf_file_name);
if (*value == NULL) {
err = -ENOMEM;
goto __end;
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index b3970a13bf73..1bfde0be327d 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -124,6 +124,16 @@ static void configuration_filename(snd_use_case_mgr_t *uc_mgr,
configuration_filename2(fn, fn_len, 2, dir, file, suffix);
}
+/*
+ * Replace mallocated string
+ */
+static char *replace_string(char **dst, const char *value)
+{
+ free(*dst);
+ *dst = strdup(value);
+ return *dst;
+}
+
/*
* Parse string
*/
@@ -1186,7 +1196,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
/* open Verb file for reading */
configuration_filename(uc_mgr, filename, sizeof(filename),
- uc_mgr->conf_file_name, file, "");
+ uc_mgr->conf_dir_name, file, "");
err = uc_mgr_config_load(uc_mgr->conf_format, filename, &cfg);
if (err < 0) {
uc_error("error: failed to open verb file %s : %d",
@@ -1404,16 +1414,16 @@ static int parse_master_file(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
if (uc_mgr->conf_format >= 2) {
err = snd_config_search(cfg, "Syntax", &n);
if (err < 0) {
- uc_error("Syntax field not found in %s", uc_mgr->conf_file_name);
+ uc_error("Syntax field not found in %s", uc_mgr->conf_dir_name);
return -EINVAL;
}
err = snd_config_get_integer(n, &l);
if (err < 0) {
- uc_error("Syntax field is invalid in %s", uc_mgr->conf_file_name);
+ uc_error("Syntax field is invalid in %s", uc_mgr->conf_dir_name);
return err;
}
if (l < 2 || l > SYNTAX_VERSION_MAX) {
- uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_file_name);
+ uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_dir_name);
return -EINVAL;
}
/* delete this field to avoid strcmp() call in the loop */
@@ -1561,8 +1571,9 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *long
return err;
_name = snd_ctl_card_info_get_name(info);
+ if (replace_string(&mgr->conf_dir_name, _name) == NULL)
+ return -ENOMEM;
_long_name = snd_ctl_card_info_get_longname(info);
- snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name));
snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
return 0;
@@ -1585,7 +1596,7 @@ static int load_master_config(snd_use_case_mgr_t *uc_mgr,
if (getenv(ALSA_CONFIG_UCM2_VAR) || !getenv(ALSA_CONFIG_UCM_VAR)) {
uc_mgr->conf_format = 2;
configuration_filename(uc_mgr, filename, sizeof(filename),
- uc_mgr->conf_file_name, card_name, ".conf");
+ uc_mgr->conf_dir_name, card_name, ".conf");
if (access(filename, R_OK) == 0)
goto __load;
}
@@ -1608,6 +1619,9 @@ __load:
return err;
}
+ if (replace_string(&uc_mgr->conf_file_name, card_name) == NULL)
+ return -ENOMEM;
+
return 0;
}
@@ -1632,7 +1646,8 @@ int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr)
char longname[MAX_CARD_LONG_NAME];
int err;
- snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name));
+ if (replace_string(&uc_mgr->conf_dir_name, uc_mgr->card_name) == NULL)
+ return -ENOMEM;
if (strncmp(name, "hw:", 3) == 0) {
err = get_by_card(uc_mgr, name, longname);
@@ -1650,14 +1665,14 @@ __longname:
if (err == 0) {
/* got device-specific file that matches the card long name */
if (uc_mgr->conf_format < 2)
- snd_strlcpy(uc_mgr->conf_file_name, longname,
- sizeof(uc_mgr->conf_file_name));
+ snd_strlcpy(uc_mgr->conf_dir_name, longname,
+ sizeof(uc_mgr->conf_dir_name));
goto __parse;
}
}
/* standard path */
- err = load_master_config(uc_mgr, uc_mgr->conf_file_name, &cfg, 0);
+ err = load_master_config(uc_mgr, uc_mgr->conf_dir_name, &cfg, 0);
if (err < 0)
goto __error;
@@ -1673,7 +1688,7 @@ __parse:
__error:
uc_mgr_free_ctl_list(uc_mgr);
- uc_mgr->conf_file_name[0] = '\0';
+ uc_mgr->conf_dir_name[0] = '\0';
return err;
}
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index ba9615078ef8..63e0f3bf1697 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -187,7 +187,6 @@ struct use_case_verb {
/* verb transition list */
struct list_head transition_list;
- /* hardware devices that can be used with this use case */
struct list_head device_list;
/* component device list */
@@ -205,7 +204,8 @@ struct use_case_verb {
*/
struct snd_use_case_mgr {
char *card_name;
- char conf_file_name[MAX_CARD_LONG_NAME];
+ char *conf_file_name;
+ char *conf_dir_name;
char *comment;
int conf_format;
diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
index 90e395f0ab6f..d931f603ddd7 100644
--- a/src/ucm/ucm_subs.c
+++ b/src/ucm/ucm_subs.c
@@ -31,7 +31,7 @@
static char *rval_conf_name(snd_use_case_mgr_t *uc_mgr)
{
- if (uc_mgr->conf_file_name[0])
+ if (uc_mgr->conf_file_name && uc_mgr->conf_file_name[0])
return strdup(uc_mgr->conf_file_name);
return NULL;
}
diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index cde1d672e7b4..daa568c16a30 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -441,7 +441,11 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
uc_mgr_free_sequence(&uc_mgr->default_list);
uc_mgr_free_value(&uc_mgr->value_list);
free(uc_mgr->comment);
+ free(uc_mgr->conf_dir_name);
+ free(uc_mgr->conf_file_name);
uc_mgr->comment = NULL;
+ uc_mgr->conf_dir_name = NULL;
+ uc_mgr->conf_file_name = NULL;
uc_mgr->active_verb = NULL;
INIT_LIST_HEAD(&uc_mgr->active_devices);
INIT_LIST_HEAD(&uc_mgr->active_modifiers);
--
2.16.4

View File

@ -1,58 +0,0 @@
From ebf5213cd61824b10bcaf67c570919e2a9ea0e1f Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 15 Jan 2020 10:40:01 +0100
Subject: [PATCH 62/63] ucm: remove MAX_FILE definition and use correct
PATH_MAX
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 6 +++---
src/ucm/ucm_local.h | 1 -
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 1bfde0be327d..6c13fafdabbf 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1167,7 +1167,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
snd_config_t *n;
struct use_case_verb *verb;
snd_config_t *cfg;
- char filename[MAX_FILE];
+ char filename[PATH_MAX];
int err;
/* allocate verb */
@@ -1582,7 +1582,7 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *long
static int load_master_config(snd_use_case_mgr_t *uc_mgr,
const char *card_name, snd_config_t **cfg, int longname)
{
- char filename[MAX_FILE];
+ char filename[PATH_MAX];
int err;
if (strnlen(card_name, MAX_CARD_LONG_NAME) == MAX_CARD_LONG_NAME) {
@@ -1733,7 +1733,7 @@ static int is_component_directory(const char *dir)
*/
int uc_mgr_scan_master_configs(const char **_list[])
{
- char filename[MAX_FILE], dfl[MAX_FILE];
+ char filename[PATH_MAX], dfl[PATH_MAX];
char *env = getenv(ALSA_CONFIG_UCM2_VAR);
const char **list, *d_name;
snd_config_t *cfg, *c;
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index 63e0f3bf1697..fa9fc16661bb 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -42,7 +42,6 @@
#define SYNTAX_VERSION_MAX 2
-#define MAX_FILE 256
#define MAX_CARD_SHORT_NAME 32
#define MAX_CARD_LONG_NAME 80
--
2.16.4

View File

@ -1,40 +0,0 @@
From fbe1ac4a09933f527aff860aad035586367f21b4 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 15 Jan 2020 10:41:35 +0100
Subject: [PATCH 63/63] topology: remove MAX_FILE definition and use correct
PATH_MAX
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 2 +-
src/topology/tplg_local.h | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/topology/data.c b/src/topology/data.c
index b63e98cd7282..5742b35773f6 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -163,7 +163,7 @@ static int tplg_parse_data_file(snd_config_t *cfg, struct tplg_elem *elem)
{
struct snd_soc_tplg_private *priv = NULL;
const char *value = NULL;
- char filename[MAX_FILE];
+ char filename[PATH_MAX];
char *env = getenv(ALSA_CONFIG_TPLG_VAR);
FILE *fp;
size_t size, bytes_read;
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index e061db755ed2..5ace0d1919e1 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -29,7 +29,6 @@
#define tplg_dbg(fmt, arg...) do { } while (0)
#endif
-#define MAX_FILE 256
#define TPLG_MAX_PRIV_SIZE (1024 * 128)
/** The name of the environment variable containing the tplg directory */
--
2.16.4

View File

@ -1,103 +0,0 @@
From 7d3fec6ac68de0244621ae0aca7474d159336639 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 17 Jan 2020 18:21:08 +0100
Subject: [PATCH 64/74] ucm: parser - cosmetic fixes in the comments
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 63 ++++++++++++++++++++++++++++----------------------------
1 file changed, 31 insertions(+), 32 deletions(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 6c13fafdabbf..6c5d29026e5e 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -676,42 +676,41 @@ static int parse_value(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED,
/*
* Parse Modifier Use cases
*
- * # Each modifier is described in new section. N modifiers are allowed
- * SectionModifier."Capture Voice" {
+ * # Each modifier is described in new section. N modifiers are allowed
+ * SectionModifier."Capture Voice" {
*
- * Comment "Record voice call"
+ * Comment "Record voice call"
*
- * SupportedDevice [
- * "x"
- * "y"
- * ]
- *
- * ConflictingDevice [
- * "x"
- * "y"
- * ]
+ * SupportedDevice [
+ * "x"
+ * "y"
+ * ]
*
- * EnableSequence [
- * ....
- * ]
+ * ConflictingDevice [
+ * "x"
+ * "y"
+ * ]
*
- * DisableSequence [
- * ...
- * ]
+ * EnableSequence [
+ * ....
+ * ]
*
- * TransitionSequence."ToModifierName" [
- * ...
- * ]
+ * DisableSequence [
+ * ...
+ * ]
*
- * # Optional TQ and ALSA PCMs
- * Value {
- * TQ Voice
- * CapturePCM "hw:1"
- * PlaybackVolume "name='Master Playback Volume',index=2"
- * PlaybackSwitch "name='Master Playback Switch',index=2"
- * }
+ * TransitionSequence."ToModifierName" [
+ * ...
+ * ]
*
- * }
+ * # Optional TQ and ALSA PCMs
+ * Value {
+ * TQ Voice
+ * CapturePCM "hw:1"
+ * PlaybackVolume "name='Master Playback Volume',index=2"
+ * PlaybackSwitch "name='Master Playback Switch',index=2"
+ * }
+ * }
*
* SupportedDevice and ConflictingDevice cannot be specified together.
* Both are optional.
@@ -836,11 +835,11 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
/*
* Parse Device Use Cases
*
- *# Each device is described in new section. N devices are allowed
- *SectionDevice."Headphones" {
+ * # Each device is described in new section. N devices are allowed
+ * SectionDevice."Headphones" {
* Comment "Headphones connected to 3.5mm jack"
*
- * upportedDevice [
+ * SupportedDevice [
* "x"
* "y"
* ]
--
2.16.4

View File

@ -1,53 +0,0 @@
From b2fe99277a73ec80eac0bd221672dd4aa02defa7 Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <tanuk@iki.fi>
Date: Fri, 20 Dec 2019 09:26:12 +0200
Subject: [PATCH 65/74] configure.ac: remove an unnecessary libtool fix
This code was added in commit 75d393a563efb578c79364a277087c6326267f52
without explaining why. I assume it was a mistake, since it looks like
the libtool problem should have gone away a long time ago. The referenced
wiki page https://wiki.debian.org/RpathIssue says:
Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no
longer sets RPATH for any directories in the dynamic linker search
path, so this should no longer be an issue unless upstream used a
really old version of libtool when creating their distribution
tarball.
This code caused problems in OpenEmbedded, where the libtool script is
named "x86_64-oe-linux-libtool" or similar rather than just "libtool",
so the sed command failed with a file not found error. Rather than
adapting the code to OpenEmbedded's peculiarities, it seems best to just
remove the unnecessary code altogether.
Note: The rpath is set (hardcoded) for 'make' but it is corrected
for 'make install' by libtool.
Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
configure.ac | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/configure.ac b/configure.ac
index 886f87bc4458..fb60c03086da 100644
--- a/configure.ac
+++ b/configure.ac
@@ -765,14 +765,3 @@ test "$build_seq" = "yes" && echo "#include <alsa/seq.h>" >> include/asoundlib.h
test "$build_seq" = "yes" && echo "#include <alsa/seqmid.h>" >> include/asoundlib.h
test "$build_seq" = "yes" && echo "#include <alsa/seq_midi_event.h>" >> include/asoundlib.h
cat "$srcdir"/include/asoundlib-tail.h >> include/asoundlib.h
-
-dnl Taken from https://wiki.debian.org/RpathIssue
-case $host in
- *-*-linux-gnu)
- AC_MSG_RESULT([Fixing libtool for -rpath problems.])
- sed < libtool > libtool-2 \
- 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'
- mv libtool-2 libtool
- chmod 755 libtool
- ;;
-esac
--
2.16.4

View File

@ -1,38 +0,0 @@
From c5a09b0feaf759957dfac2c797b652781a0d41fe Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 3 Feb 2020 14:44:13 +0100
Subject: [PATCH 66/74] ucm: parser - use correct filename in
parser_master_file()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 6c5d29026e5e..dbbd381755b1 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1413,16 +1413,16 @@ static int parse_master_file(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
if (uc_mgr->conf_format >= 2) {
err = snd_config_search(cfg, "Syntax", &n);
if (err < 0) {
- uc_error("Syntax field not found in %s", uc_mgr->conf_dir_name);
+ uc_error("Syntax field not found in %s", uc_mgr->conf_file_name);
return -EINVAL;
}
err = snd_config_get_integer(n, &l);
if (err < 0) {
- uc_error("Syntax field is invalid in %s", uc_mgr->conf_dir_name);
+ uc_error("Syntax field is invalid in %s", uc_mgr->conf_file_name);
return err;
}
if (l < 2 || l > SYNTAX_VERSION_MAX) {
- uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_dir_name);
+ uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_file_name);
return -EINVAL;
}
/* delete this field to avoid strcmp() call in the loop */
--
2.16.4

View File

@ -1,59 +0,0 @@
From 71a1367bcabc50f99302d8c76395f1cb84975775 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 3 Feb 2020 15:24:19 +0100
Subject: [PATCH 67/74] ucm: the ucm2/ subdirectory is driver name based
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index dbbd381755b1..f576fde429cf 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1515,7 +1515,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr, char *longname)
int card, err;
snd_ctl_t *ctl;
snd_ctl_card_info_t *info;
- const char *_name, *_long_name;
+ const char *_driver, *_name, *_long_name;
snd_ctl_card_info_alloca(&info);
@@ -1535,9 +1535,11 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr, char *longname)
err = get_card_info(mgr, name, &ctl, info);
if (err == 0) {
+ _driver = snd_ctl_card_info_get_driver(info);
_name = snd_ctl_card_info_get_name(info);
_long_name = snd_ctl_card_info_get_longname(info);
- if (!strcmp(card_name, _name) ||
+ if (!strcmp(card_name, _driver) ||
+ !strcmp(card_name, _name) ||
!strcmp(card_name, _long_name)) {
snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
return 0;
@@ -1560,7 +1562,7 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *long
{
snd_ctl_t *ctl;
snd_ctl_card_info_t *info;
- const char *_name, *_long_name;
+ const char *_driver, *_long_name;
int err;
snd_ctl_card_info_alloca(&info);
@@ -1569,8 +1571,8 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *long
if (err)
return err;
- _name = snd_ctl_card_info_get_name(info);
- if (replace_string(&mgr->conf_dir_name, _name) == NULL)
+ _driver = snd_ctl_card_info_get_driver(info);
+ if (replace_string(&mgr->conf_dir_name, _driver) == NULL)
return -ENOMEM;
_long_name = snd_ctl_card_info_get_longname(info);
snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
--
2.16.4

View File

@ -1,393 +0,0 @@
From 251bc204a1e7f1bf1d12b452f2b62e15543bba94 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 7 Feb 2020 10:09:07 +0100
Subject: [PATCH 68/74] ucm: implement RenameDevice and RemoveDevice verb
management
With the conditionals, it may be useful to define the devices
in the included configuration files. To satisfy the specification
requirements (device naming) those device names might require
to be renamed or deleted wrong references from the conflicting
or supported lists.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++-
src/ucm/ucm_local.h | 15 ++++++
src/ucm/utils.c | 123 ++++++++++++++++++++++++++++++++++++++++++++-----
3 files changed, 254 insertions(+), 13 deletions(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index f576fde429cf..f9a8f6283c3a 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -985,6 +985,71 @@ static int parse_device(snd_use_case_mgr_t *uc_mgr,
return 0;
}
+/*
+ * Parse Device Rename/Delete Command
+ *
+ * # The devices might be renamed to allow the better conditional runtime
+ * # evaluation. Bellow example renames Speaker1 device to Speaker and
+ * # removes Speaker2 device.
+ * RenameDevice."Speaker1" "Speaker"
+ * RemoveDevice."Speaker2" "Speaker2"
+ */
+static int parse_dev_name_list(snd_config_t *cfg,
+ struct list_head *list)
+{
+ snd_config_t *n;
+ snd_config_iterator_t i, next;
+ const char *id, *name1;
+ char *name2;
+ struct ucm_dev_name *dev;
+ snd_config_iterator_t pos;
+ int err;
+
+ if (snd_config_get_id(cfg, &id) < 0)
+ return -EINVAL;
+
+ if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
+ uc_error("compound type expected for %s", id);
+ return -EINVAL;
+ }
+
+ snd_config_for_each(i, next, cfg) {
+ n = snd_config_iterator_entry(i);
+
+ if (snd_config_get_id(n, &name1) < 0)
+ return -EINVAL;
+
+ err = parse_string(n, &name2);
+ if (err < 0) {
+ uc_error("error: failed to get target device name for '%s'", name1);
+ return err;
+ }
+
+ /* skip duplicates */
+ list_for_each(pos, list) {
+ dev = list_entry(pos, struct ucm_dev_name, list);
+ if (strcmp(dev->name1, name1) == 0) {
+ free(name2);
+ return 0;
+ }
+ }
+
+ dev = calloc(1, sizeof(*dev));
+ if (dev == NULL)
+ return -ENOMEM;
+ dev->name1 = strdup(name1);
+ if (dev->name1 == NULL) {
+ free(dev);
+ free(name2);
+ return -ENOMEM;
+ }
+ dev->name2 = name2;
+ list_add_tail(&dev->list, list);
+ }
+
+ return 0;
+}
+
static int parse_compound_check_legacy(snd_use_case_mgr_t *uc_mgr,
snd_config_t *cfg,
int (*fcn)(snd_use_case_mgr_t *, snd_config_t *, void *, void *),
@@ -1044,7 +1109,39 @@ static int parse_modifier_name(snd_use_case_mgr_t *uc_mgr,
void *data1,
void *data2 ATTRIBUTE_UNUSED)
{
- return parse_compound_check_legacy(uc_mgr, cfg, parse_modifier, data1);
+ return parse_compound(uc_mgr, cfg, parse_modifier, data1, data2);
+}
+
+static int verb_device_management(struct use_case_verb *verb)
+{
+ struct list_head *pos;
+ struct ucm_dev_name *dev;
+ int err;
+
+ /* rename devices */
+ list_for_each(pos, &verb->rename_list) {
+ dev = list_entry(pos, struct ucm_dev_name, list);
+ err = uc_mgr_rename_device(verb, dev->name1, dev->name2);
+ if (err < 0) {
+ uc_error("error: cannot rename device '%s' to '%s'", dev->name1, dev->name2);
+ return err;
+ }
+ }
+
+ /* remove devices */
+ list_for_each(pos, &verb->rename_list) {
+ dev = list_entry(pos, struct ucm_dev_name, list);
+ err = uc_mgr_remove_device(verb, dev->name2);
+ if (err < 0) {
+ uc_error("error: cannot remove device '%s'", dev->name2);
+ return err;
+ }
+ }
+
+ /* those lists are no longer used */
+ uc_mgr_free_dev_name_list(&verb->rename_list);
+ uc_mgr_free_dev_name_list(&verb->remove_list);
+ return 0;
}
/*
@@ -1180,6 +1277,8 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
INIT_LIST_HEAD(&verb->cmpt_device_list);
INIT_LIST_HEAD(&verb->modifier_list);
INIT_LIST_HEAD(&verb->value_list);
+ INIT_LIST_HEAD(&verb->rename_list);
+ INIT_LIST_HEAD(&verb->remove_list);
list_add_tail(&verb->list, &uc_mgr->verb_list);
if (use_case_name == NULL)
return -EINVAL;
@@ -1249,6 +1348,26 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
}
continue;
}
+
+ /* device renames */
+ if (strcmp(id, "RenameDevice") == 0) {
+ err = parse_dev_name_list(n, &verb->rename_list);
+ if (err < 0) {
+ uc_error("error: %s failed to parse device rename",
+ file);
+ goto _err;
+ }
+ }
+
+ /* device remove */
+ if (strcmp(id, "RemoveDevice") == 0) {
+ err = parse_dev_name_list(n, &verb->remove_list);
+ if (err < 0) {
+ uc_error("error: %s failed to parse device remove",
+ file);
+ goto _err;
+ }
+ }
}
snd_config_delete(cfg);
@@ -1258,6 +1377,14 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
uc_error("error: no use case device defined", file);
return -EINVAL;
}
+
+ /* do device rename and delete */
+ err = verb_device_management(verb);
+ if (err < 0) {
+ uc_error("error: device management error in verb '%s'", verb->name);
+ return err;
+ }
+
return 0;
_err:
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index fa9fc16661bb..ba8d2acb3355 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -117,6 +117,12 @@ struct ctl_list {
snd_ctl_card_info_t *ctl_info;
};
+struct ucm_dev_name {
+ struct list_head list;
+ char *name1;
+ char *name2;
+};
+
/*
* Describes a Use Case Modifier and it's enable and disable sequences.
* A use case verb can have N modifiers.
@@ -196,6 +202,10 @@ struct use_case_verb {
/* value list */
struct list_head value_list;
+
+ /* temporary modifications lists */
+ struct list_head rename_list;
+ struct list_head remove_list;
};
/*
@@ -252,6 +262,11 @@ int uc_mgr_config_load(int format, const char *file, snd_config_t **cfg);
int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr);
int uc_mgr_scan_master_configs(const char **_list[]);
+int uc_mgr_remove_device(struct use_case_verb *verb, const char *name);
+int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
+ const char *dst);
+
+void uc_mgr_free_dev_name_list(struct list_head *base);
void uc_mgr_free_sequence_element(struct sequence_element *seq);
void uc_mgr_free_transition_element(struct transition_sequence *seq);
void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr);
diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index daa568c16a30..60a591725835 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -328,6 +328,44 @@ void uc_mgr_free_dev_list(struct dev_list *dev_list)
}
}
+int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
+ const char *dst)
+{
+ struct list_head *pos;
+ struct dev_list_node *dlist;
+ char *dst1;
+
+ list_for_each(pos, &dev_list->list) {
+ dlist = list_entry(pos, struct dev_list_node, list);
+ if (strcmp(dlist->name, src) == 0) {
+ dst1 = strdup(dst);
+ if (dst1 == NULL)
+ return -ENOMEM;
+ free(dlist->name);
+ dlist->name = dst1;
+ return 0;
+ }
+ }
+ return -ENOENT;
+}
+
+int uc_mgr_remove_from_dev_list(struct dev_list *dev_list, const char *name)
+{
+ struct list_head *pos;
+ struct dev_list_node *dlist;
+
+ list_for_each(pos, &dev_list->list) {
+ dlist = list_entry(pos, struct dev_list_node, list);
+ if (strcmp(dlist->name, name) == 0) {
+ free(dlist->name);
+ list_del(&dlist->list);
+ free(dlist);
+ return 0;
+ }
+ }
+ return -ENODEV;
+}
+
void uc_mgr_free_sequence_element(struct sequence_element *seq)
{
if (seq == NULL)
@@ -381,6 +419,20 @@ void uc_mgr_free_transition(struct list_head *base)
}
}
+void uc_mgr_free_dev_name_list(struct list_head *base)
+{
+ struct list_head *pos, *npos;
+ struct ucm_dev_name *dev;
+
+ list_for_each_safe(pos, npos, base) {
+ dev = list_entry(pos, struct ucm_dev_name, list);
+ list_del(&dev->list);
+ free(dev->name1);
+ free(dev->name2);
+ free(dev);
+ }
+}
+
void uc_mgr_free_modifier(struct list_head *base)
{
struct list_head *pos, *npos;
@@ -400,23 +452,68 @@ void uc_mgr_free_modifier(struct list_head *base)
}
}
-void uc_mgr_free_device(struct list_head *base)
+void uc_mgr_free_device(struct use_case_device *dev)
+{
+ free(dev->name);
+ free(dev->comment);
+ uc_mgr_free_sequence(&dev->enable_list);
+ uc_mgr_free_sequence(&dev->disable_list);
+ uc_mgr_free_transition(&dev->transition_list);
+ uc_mgr_free_dev_list(&dev->dev_list);
+ uc_mgr_free_value(&dev->value_list);
+ list_del(&dev->list);
+ free(dev);
+}
+
+void uc_mgr_free_device_list(struct list_head *base)
{
struct list_head *pos, *npos;
struct use_case_device *dev;
list_for_each_safe(pos, npos, base) {
dev = list_entry(pos, struct use_case_device, list);
- free(dev->name);
- free(dev->comment);
- uc_mgr_free_sequence(&dev->enable_list);
- uc_mgr_free_sequence(&dev->disable_list);
- uc_mgr_free_transition(&dev->transition_list);
- uc_mgr_free_dev_list(&dev->dev_list);
- uc_mgr_free_value(&dev->value_list);
- list_del(&dev->list);
- free(dev);
+ uc_mgr_free_device(dev);
+ }
+}
+
+int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
+ const char *dst)
+{
+ struct use_case_device *device;
+ struct list_head *pos, *npos;
+ char *dst1;
+
+ /* no errors when device is not found */
+ list_for_each_safe(pos, npos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ if (strcmp(device->name, src) == 0) {
+ dst1 = strdup(dst);
+ if (dst1 == NULL)
+ return -ENOMEM;
+ free(device->name);
+ device->name = dst1;
+ continue;
+ }
+ uc_mgr_rename_in_dev_list(&device->dev_list, src, dst);
+ }
+ return 0;
+}
+
+int uc_mgr_remove_device(struct use_case_verb *verb, const char *name)
+{
+ struct use_case_device *device;
+ struct list_head *pos, *npos;
+
+ list_for_each_safe(pos, npos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ if (strcmp(device->name, name) == 0) {
+ uc_mgr_free_device(device);
+ continue;
+ }
+ uc_mgr_remove_from_dev_list(&device->dev_list, name);
+ return 0;
}
+ return -ENOENT;
}
void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
@@ -432,9 +529,11 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
uc_mgr_free_sequence(&verb->disable_list);
uc_mgr_free_transition(&verb->transition_list);
uc_mgr_free_value(&verb->value_list);
- uc_mgr_free_device(&verb->device_list);
- uc_mgr_free_device(&verb->cmpt_device_list);
+ uc_mgr_free_device_list(&verb->device_list);
+ uc_mgr_free_device_list(&verb->cmpt_device_list);
uc_mgr_free_modifier(&verb->modifier_list);
+ uc_mgr_free_dev_name_list(&verb->rename_list);
+ uc_mgr_free_dev_name_list(&verb->remove_list);
list_del(&verb->list);
free(verb);
}
--
2.16.4

View File

@ -1,135 +0,0 @@
From fdf96312fa3c9261db2954afcde8c6a15d2ebe44 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 7 Feb 2020 16:18:11 +0100
Subject: [PATCH 69/74] ucm: fill missing device entries (conflicting /
supported)
It is not necessary to maintain this information in sync in the configuration
files. Fill the missing entries to the complementary devices.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
src/ucm/ucm_local.h | 1 +
src/ucm/utils.c | 25 +++++++++++++++++++++++++
3 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index f9a8f6283c3a..23bf6a63f31e 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1112,6 +1112,52 @@ static int parse_modifier_name(snd_use_case_mgr_t *uc_mgr,
return parse_compound(uc_mgr, cfg, parse_modifier, data1, data2);
}
+static int verb_dev_list_add(struct use_case_verb *verb,
+ enum dev_list_type dst_type,
+ const char *dst,
+ const char *src)
+{
+ struct use_case_device *device;
+ struct list_head *pos;
+
+ list_for_each(pos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ if (strcmp(device->name, dst) != 0)
+ continue;
+ if (device->dev_list.type != dst_type) {
+ if (list_empty(&device->dev_list.list)) {
+ device->dev_list.type = dst_type;
+ } else {
+ uc_error("error: incompatible device list type ('%s', '%s')",
+ device->name, src);
+ return -EINVAL;
+ }
+ }
+ return uc_mgr_put_to_dev_list(&device->dev_list, src);
+ }
+ return -ENOENT;
+}
+
+static int verb_dev_list_check(struct use_case_verb *verb)
+{
+ struct list_head *pos, *pos2;
+ struct use_case_device *device;
+ struct dev_list_node *dlist;
+ int err;
+
+ list_for_each(pos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ list_for_each(pos2, &device->dev_list.list) {
+ dlist = list_entry(pos2, struct dev_list_node, list);
+ err = verb_dev_list_add(verb, device->dev_list.type,
+ dlist->name, device->name);
+ if (err < 0)
+ return err;
+ }
+ }
+ return 0;
+}
+
static int verb_device_management(struct use_case_verb *verb)
{
struct list_head *pos;
@@ -1141,7 +1187,9 @@ static int verb_device_management(struct use_case_verb *verb)
/* those lists are no longer used */
uc_mgr_free_dev_name_list(&verb->rename_list);
uc_mgr_free_dev_name_list(&verb->remove_list);
- return 0;
+
+ /* handle conflicting/supported lists */
+ return verb_dev_list_check(verb);
}
/*
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index ba8d2acb3355..acec4bf67e30 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -262,6 +262,7 @@ int uc_mgr_config_load(int format, const char *file, snd_config_t **cfg);
int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr);
int uc_mgr_scan_master_configs(const char **_list[]);
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name);
int uc_mgr_remove_device(struct use_case_verb *verb, const char *name);
int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
const char *dst);
diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index 60a591725835..50b2a1df4a6a 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -328,6 +328,31 @@ void uc_mgr_free_dev_list(struct dev_list *dev_list)
}
}
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name)
+{
+ struct list_head *pos;
+ struct dev_list_node *dlist;
+ char *n;
+
+ list_for_each(pos, &dev_list->list) {
+ dlist = list_entry(pos, struct dev_list_node, list);
+ if (strcmp(dlist->name, name) == 0)
+ return 0;
+ }
+
+ dlist = calloc(1, sizeof(*dlist));
+ if (dlist == NULL)
+ return -ENOMEM;
+ n = strdup(name);
+ if (n == NULL) {
+ free(dlist);
+ return -ENOMEM;
+ }
+ dlist->name = n;
+ list_add(&dlist->list, &dev_list->list);
+ return 0;
+}
+
int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
const char *dst)
{
--
2.16.4

View File

@ -1,110 +0,0 @@
From 43e137c06451bbdd7998ec5bef20ef82d9f4e5a7 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Mon, 10 Feb 2020 12:47:19 +0100
Subject: [PATCH 70/74] control: Remove access to the deprecated dimen fields
The dimen fields of control element has been deprecated, and it's
finally dropped in kernel 5.6 ABI definition. Remove the
corresponding accesses in alsa-lib code.
As of this patch, it's disabled via ifdef, just to be sure. The
disabled code should be removed in a later stage as a cleanup.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/control/control.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/control/control.c b/src/control/control.c
index 33650155cac7..27f421350fb7 100644
--- a/src/control/control.c
+++ b/src/control/control.c
@@ -303,6 +303,7 @@ int snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
return ctl->ops->element_info(ctl, info);
}
+#if 0 /* deprecated */
static bool validate_element_member_dimension(snd_ctl_elem_info_t *info)
{
unsigned int members;
@@ -328,6 +329,9 @@ static bool validate_element_member_dimension(snd_ctl_elem_info_t *info)
return members == info->count;
}
+#else /* deprecated */
+#define validate_element_member_dimension(info) true
+#endif /* deprecated */
/**
* \brief Create and add some user-defined control elements of integer type.
@@ -2510,11 +2514,12 @@ const char *snd_ctl_elem_info_get_item_name(const snd_ctl_elem_info_t *obj)
* #snd_ctl_elem_info_get_dimensions is deprecated without any replacement.
*/
#ifndef DOXYGEN
-EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimensions)(const snd_ctl_elem_info_t *obj)
+EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimensions)(const snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED)
#else
int snd_ctl_elem_info_get_dimensions(const snd_ctl_elem_info_t *obj)
#endif
{
+#if 0 /* deprecated */
int i;
assert(obj);
@@ -2522,6 +2527,9 @@ int snd_ctl_elem_info_get_dimensions(const snd_ctl_elem_info_t *obj)
if (obj->dimen.d[i])
break;
return i + 1;
+#else
+ return -EINVAL;
+#endif
}
use_default_symbol_version(__snd_ctl_elem_info_get_dimensions, snd_ctl_elem_info_get_dimensions, ALSA_0.9.3);
@@ -2535,15 +2543,19 @@ use_default_symbol_version(__snd_ctl_elem_info_get_dimensions, snd_ctl_elem_info
* #snd_ctl_elem_info_get_dimension is deprecated without any replacement.
*/
#ifndef DOXYGEN
-EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimension)(const snd_ctl_elem_info_t *obj, unsigned int idx)
+EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimension)(const snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED, unsigned int idx ATTRIBUTE_UNUSED)
#else
int snd_ctl_elem_info_get_dimension(const snd_ctl_elem_info_t *obj, unsigned int idx)
#endif
{
+#if 0 /* deprecated */
assert(obj);
if (idx > 3)
return 0;
return obj->dimen.d[idx];
+#else /* deprecated */
+ return -EINVAL;
+#endif /* deprecated */
}
use_default_symbol_version(__snd_ctl_elem_info_get_dimension, snd_ctl_elem_info_get_dimension, ALSA_0.9.3);
@@ -2565,9 +2577,10 @@ use_default_symbol_version(__snd_ctl_elem_info_get_dimension, snd_ctl_elem_info_
* \deprecated Since 1.1.5
* #snd_ctl_elem_info_set_dimension is deprecated without any replacement.
*/
-int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info,
- const int dimension[4])
+int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info ATTRIBUTE_UNUSED,
+ const int dimension[4] ATTRIBUTE_UNUSED)
{
+#if 0 /* deprecated */
unsigned int i;
if (info == NULL)
@@ -2581,6 +2594,9 @@ int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info,
}
return 0;
+#else /* deprecated */
+ return -EINVAL;
+#endif /* deprecated */
}
/**
--
2.16.4

View File

@ -1,29 +0,0 @@
From beb6b178e6d0ca4a9b6c528bac9bfa899b733462 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Mon, 10 Feb 2020 12:49:25 +0100
Subject: [PATCH 71/74] topology: Drop SNDRV_CTL_ELEM_ACCESS_TIMESTAMP access
SNDRV_CTL_ELEM_ACCESS_TIMESTAMP is removed from 5.6 kernel ABI as the
ctl timestamp field has been never used and deprecated.
Drop the corresponding access from the topology code, too.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/topology/ctl.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index b78f1c54be05..90241b6318c5 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -35,7 +35,6 @@ static const struct ctl_access_elem ctl_access[] = {
{"read", SNDRV_CTL_ELEM_ACCESS_READ},
{"write", SNDRV_CTL_ELEM_ACCESS_WRITE},
{"volatile", SNDRV_CTL_ELEM_ACCESS_VOLATILE},
- {"timestamp", SNDRV_CTL_ELEM_ACCESS_TIMESTAMP},
{"tlv_read", SNDRV_CTL_ELEM_ACCESS_TLV_READ},
{"tlv_write", SNDRV_CTL_ELEM_ACCESS_TLV_WRITE},
{"tlv_command", SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND},
--
2.16.4

View File

@ -1,721 +0,0 @@
From 5bbe8b2fb90e78d6ff35eeddbc2b579b8e05cd8f Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Mon, 10 Feb 2020 12:50:50 +0100
Subject: [PATCH 72/74] uapi: Sync with 5.6 kernel ABI
This is a sync with 5.6-rc1 kernel headers. The copy is performed
from the sanitized headers installed via make headers_install.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/uapi/asequencer.h | 12 +-
include/sound/uapi/asoc.h | 9 +-
include/sound/uapi/asound.h | 319 ++++++++++++++++++++++++++--------------
include/sound/uapi/emu10k1.h | 12 +-
include/sound/uapi/hdsp.h | 4 +
include/sound/uapi/hdspm.h | 4 +
include/sound/uapi/sb16_csp.h | 6 +-
7 files changed, 235 insertions(+), 131 deletions(-)
diff --git a/include/sound/uapi/asequencer.h b/include/sound/uapi/asequencer.h
index a75e14edc957..2d600320e2ae 100644
--- a/include/sound/uapi/asequencer.h
+++ b/include/sound/uapi/asequencer.h
@@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
-#ifndef _UAPI__SOUND_ASEQUENCER_H
-#define _UAPI__SOUND_ASEQUENCER_H
+#ifndef __SOUND_ASEQUENCER_H
+#define __SOUND_ASEQUENCER_H
#include <sound/asound.h>
@@ -339,9 +339,9 @@ struct snd_seq_running_info {
/* client types */
typedef int __bitwise snd_seq_client_type_t;
-#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
-#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
-#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
+#define NO_CLIENT ((snd_seq_client_type_t) 0)
+#define USER_CLIENT ((snd_seq_client_type_t) 1)
+#define KERNEL_CLIENT ((snd_seq_client_type_t) 2)
/* event filter flags */
#define SNDRV_SEQ_FILTER_BROADCAST (1<<0) /* accept broadcast messages */
@@ -609,4 +609,4 @@ struct snd_seq_query_subs {
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct snd_seq_port_info)
-#endif /* _UAPI__SOUND_ASEQUENCER_H */
+#endif /* __SOUND_ASEQUENCER_H */
diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
index a74ca232f1fc..4efb4ec42500 100644
--- a/include/sound/uapi/asoc.h
+++ b/include/sound/uapi/asoc.h
@@ -17,7 +17,6 @@
#define __LINUX_UAPI_SND_ASOC_H
#include <linux/types.h>
-#include <sound/asound.h>
/*
* Maximum number of channels topology kcontrol can represent.
@@ -587,7 +586,7 @@ struct snd_soc_tplg_manifest_v4 {
__le32 pcm_elems; /* number of PCM elements */
__le32 dai_link_elems; /* number of DAI link elements */
struct snd_soc_tplg_private priv;
-} __packed;
+} __attribute__((packed));
/* Stream Capabilities v4 */
struct snd_soc_tplg_stream_caps_v4 {
@@ -605,7 +604,7 @@ struct snd_soc_tplg_stream_caps_v4 {
__le32 period_size_max; /* max period size bytes */
__le32 buffer_size_min; /* min buffer size bytes */
__le32 buffer_size_max; /* max buffer size bytes */
-} __packed;
+} __attribute__((packed));
/* PCM v4 */
struct snd_soc_tplg_pcm_v4 {
@@ -620,7 +619,7 @@ struct snd_soc_tplg_pcm_v4 {
struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
__le32 num_streams; /* number of streams */
struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
+} __attribute__((packed));
/* Physical link config v4 */
struct snd_soc_tplg_link_config_v4 {
@@ -628,6 +627,6 @@ struct snd_soc_tplg_link_config_v4 {
__le32 id; /* unique ID - used to match */
struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
__le32 num_streams; /* number of streams */
-} __packed;
+} __attribute__((packed));
#endif
diff --git a/include/sound/uapi/asound.h b/include/sound/uapi/asound.h
index df1153cea0b7..ec610c270411 100644
--- a/include/sound/uapi/asound.h
+++ b/include/sound/uapi/asound.h
@@ -21,19 +21,19 @@
*
*/
-#ifndef _UAPI__SOUND_ASOUND_H
-#define _UAPI__SOUND_ASOUND_H
+#ifndef __SOUND_ASOUND_H
+#define __SOUND_ASOUND_H
#if defined(__KERNEL__) || defined(__linux__)
#include <linux/types.h>
+#include <asm/byteorder.h>
#else
+#include <endian.h>
#include <sys/ioctl.h>
#endif
-#ifndef __KERNEL__
#include <stdlib.h>
#include <time.h>
-#endif
/*
* protocol version
@@ -138,7 +138,7 @@ struct snd_hwdep_dsp_status {
struct snd_hwdep_dsp_image {
unsigned int index; /* W: DSP index */
unsigned char name[64]; /* W: ID (e.g. file name) */
- unsigned char __user *image; /* W: binary image */
+ unsigned char *image; /* W: binary image */
size_t length; /* W: size of image in bytes */
unsigned long driver_data; /* W: driver-specific data */
};
@@ -154,7 +154,7 @@ struct snd_hwdep_dsp_image {
* *
*****************************************************************************/
-#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 14)
+#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 15)
typedef unsigned long snd_pcm_uframes_t;
typedef signed long snd_pcm_sframes_t;
@@ -182,66 +182,66 @@ enum {
};
typedef int __bitwise snd_pcm_access_t;
-#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((__force snd_pcm_access_t) 0) /* interleaved mmap */
-#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
-#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((__force snd_pcm_access_t) 2) /* complex mmap */
-#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((__force snd_pcm_access_t) 3) /* readi/writei */
-#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((__force snd_pcm_access_t) 4) /* readn/writen */
+#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((snd_pcm_access_t) 0) /* interleaved mmap */
+#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((snd_pcm_access_t) 1) /* noninterleaved mmap */
+#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((snd_pcm_access_t) 2) /* complex mmap */
+#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((snd_pcm_access_t) 3) /* readi/writei */
+#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((snd_pcm_access_t) 4) /* readn/writen */
#define SNDRV_PCM_ACCESS_LAST SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
typedef int __bitwise snd_pcm_format_t;
-#define SNDRV_PCM_FORMAT_S8 ((__force snd_pcm_format_t) 0)
-#define SNDRV_PCM_FORMAT_U8 ((__force snd_pcm_format_t) 1)
-#define SNDRV_PCM_FORMAT_S16_LE ((__force snd_pcm_format_t) 2)
-#define SNDRV_PCM_FORMAT_S16_BE ((__force snd_pcm_format_t) 3)
-#define SNDRV_PCM_FORMAT_U16_LE ((__force snd_pcm_format_t) 4)
-#define SNDRV_PCM_FORMAT_U16_BE ((__force snd_pcm_format_t) 5)
-#define SNDRV_PCM_FORMAT_S24_LE ((__force snd_pcm_format_t) 6) /* low three bytes */
-#define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7) /* low three bytes */
-#define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8) /* low three bytes */
-#define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9) /* low three bytes */
-#define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10)
-#define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11)
-#define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12)
-#define SNDRV_PCM_FORMAT_U32_BE ((__force snd_pcm_format_t) 13)
-#define SNDRV_PCM_FORMAT_FLOAT_LE ((__force snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
-#define SNDRV_PCM_FORMAT_FLOAT_BE ((__force snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
-#define SNDRV_PCM_FORMAT_FLOAT64_LE ((__force snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
-#define SNDRV_PCM_FORMAT_FLOAT64_BE ((__force snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
-#define SNDRV_PCM_FORMAT_MU_LAW ((__force snd_pcm_format_t) 20)
-#define SNDRV_PCM_FORMAT_A_LAW ((__force snd_pcm_format_t) 21)
-#define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22)
-#define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23)
-#define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24)
-#define SNDRV_PCM_FORMAT_S20_LE ((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */
-#define SNDRV_PCM_FORMAT_S20_BE ((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */
-#define SNDRV_PCM_FORMAT_U20_LE ((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */
-#define SNDRV_PCM_FORMAT_U20_BE ((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */
+#define SNDRV_PCM_FORMAT_S8 ((snd_pcm_format_t) 0)
+#define SNDRV_PCM_FORMAT_U8 ((snd_pcm_format_t) 1)
+#define SNDRV_PCM_FORMAT_S16_LE ((snd_pcm_format_t) 2)
+#define SNDRV_PCM_FORMAT_S16_BE ((snd_pcm_format_t) 3)
+#define SNDRV_PCM_FORMAT_U16_LE ((snd_pcm_format_t) 4)
+#define SNDRV_PCM_FORMAT_U16_BE ((snd_pcm_format_t) 5)
+#define SNDRV_PCM_FORMAT_S24_LE ((snd_pcm_format_t) 6) /* low three bytes */
+#define SNDRV_PCM_FORMAT_S24_BE ((snd_pcm_format_t) 7) /* low three bytes */
+#define SNDRV_PCM_FORMAT_U24_LE ((snd_pcm_format_t) 8) /* low three bytes */
+#define SNDRV_PCM_FORMAT_U24_BE ((snd_pcm_format_t) 9) /* low three bytes */
+#define SNDRV_PCM_FORMAT_S32_LE ((snd_pcm_format_t) 10)
+#define SNDRV_PCM_FORMAT_S32_BE ((snd_pcm_format_t) 11)
+#define SNDRV_PCM_FORMAT_U32_LE ((snd_pcm_format_t) 12)
+#define SNDRV_PCM_FORMAT_U32_BE ((snd_pcm_format_t) 13)
+#define SNDRV_PCM_FORMAT_FLOAT_LE ((snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
+#define SNDRV_PCM_FORMAT_FLOAT_BE ((snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
+#define SNDRV_PCM_FORMAT_FLOAT64_LE ((snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
+#define SNDRV_PCM_FORMAT_FLOAT64_BE ((snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
+#define SNDRV_PCM_FORMAT_MU_LAW ((snd_pcm_format_t) 20)
+#define SNDRV_PCM_FORMAT_A_LAW ((snd_pcm_format_t) 21)
+#define SNDRV_PCM_FORMAT_IMA_ADPCM ((snd_pcm_format_t) 22)
+#define SNDRV_PCM_FORMAT_MPEG ((snd_pcm_format_t) 23)
+#define SNDRV_PCM_FORMAT_GSM ((snd_pcm_format_t) 24)
+#define SNDRV_PCM_FORMAT_S20_LE ((snd_pcm_format_t) 25) /* in four bytes, LSB justified */
+#define SNDRV_PCM_FORMAT_S20_BE ((snd_pcm_format_t) 26) /* in four bytes, LSB justified */
+#define SNDRV_PCM_FORMAT_U20_LE ((snd_pcm_format_t) 27) /* in four bytes, LSB justified */
+#define SNDRV_PCM_FORMAT_U20_BE ((snd_pcm_format_t) 28) /* in four bytes, LSB justified */
/* gap in the numbering for a future standard linear format */
-#define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31)
-#define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32) /* in three bytes */
-#define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U24_3LE ((__force snd_pcm_format_t) 34) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U24_3BE ((__force snd_pcm_format_t) 35) /* in three bytes */
-#define SNDRV_PCM_FORMAT_S20_3LE ((__force snd_pcm_format_t) 36) /* in three bytes */
-#define SNDRV_PCM_FORMAT_S20_3BE ((__force snd_pcm_format_t) 37) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U20_3LE ((__force snd_pcm_format_t) 38) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U20_3BE ((__force snd_pcm_format_t) 39) /* in three bytes */
-#define SNDRV_PCM_FORMAT_S18_3LE ((__force snd_pcm_format_t) 40) /* in three bytes */
-#define SNDRV_PCM_FORMAT_S18_3BE ((__force snd_pcm_format_t) 41) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U18_3LE ((__force snd_pcm_format_t) 42) /* in three bytes */
-#define SNDRV_PCM_FORMAT_U18_3BE ((__force snd_pcm_format_t) 43) /* in three bytes */
-#define SNDRV_PCM_FORMAT_G723_24 ((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
-#define SNDRV_PCM_FORMAT_G723_24_1B ((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
-#define SNDRV_PCM_FORMAT_G723_40 ((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
-#define SNDRV_PCM_FORMAT_G723_40_1B ((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
-#define SNDRV_PCM_FORMAT_DSD_U8 ((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
-#define SNDRV_PCM_FORMAT_DSD_U16_LE ((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
-#define SNDRV_PCM_FORMAT_DSD_U32_LE ((__force snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
-#define SNDRV_PCM_FORMAT_DSD_U16_BE ((__force snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
-#define SNDRV_PCM_FORMAT_DSD_U32_BE ((__force snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
+#define SNDRV_PCM_FORMAT_SPECIAL ((snd_pcm_format_t) 31)
+#define SNDRV_PCM_FORMAT_S24_3LE ((snd_pcm_format_t) 32) /* in three bytes */
+#define SNDRV_PCM_FORMAT_S24_3BE ((snd_pcm_format_t) 33) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U24_3LE ((snd_pcm_format_t) 34) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U24_3BE ((snd_pcm_format_t) 35) /* in three bytes */
+#define SNDRV_PCM_FORMAT_S20_3LE ((snd_pcm_format_t) 36) /* in three bytes */
+#define SNDRV_PCM_FORMAT_S20_3BE ((snd_pcm_format_t) 37) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U20_3LE ((snd_pcm_format_t) 38) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U20_3BE ((snd_pcm_format_t) 39) /* in three bytes */
+#define SNDRV_PCM_FORMAT_S18_3LE ((snd_pcm_format_t) 40) /* in three bytes */
+#define SNDRV_PCM_FORMAT_S18_3BE ((snd_pcm_format_t) 41) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U18_3LE ((snd_pcm_format_t) 42) /* in three bytes */
+#define SNDRV_PCM_FORMAT_U18_3BE ((snd_pcm_format_t) 43) /* in three bytes */
+#define SNDRV_PCM_FORMAT_G723_24 ((snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
+#define SNDRV_PCM_FORMAT_G723_24_1B ((snd_pcm_format_t) 45) /* 1 sample in 1 byte */
+#define SNDRV_PCM_FORMAT_G723_40 ((snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
+#define SNDRV_PCM_FORMAT_G723_40_1B ((snd_pcm_format_t) 47) /* 1 sample in 1 byte */
+#define SNDRV_PCM_FORMAT_DSD_U8 ((snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
+#define SNDRV_PCM_FORMAT_DSD_U16_LE ((snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
+#define SNDRV_PCM_FORMAT_DSD_U32_LE ((snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
+#define SNDRV_PCM_FORMAT_DSD_U16_BE ((snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
+#define SNDRV_PCM_FORMAT_DSD_U32_BE ((snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
#define SNDRV_PCM_FORMAT_LAST SNDRV_PCM_FORMAT_DSD_U32_BE
#define SNDRV_PCM_FORMAT_FIRST SNDRV_PCM_FORMAT_S8
@@ -273,7 +273,7 @@ typedef int __bitwise snd_pcm_format_t;
#endif
typedef int __bitwise snd_pcm_subformat_t;
-#define SNDRV_PCM_SUBFORMAT_STD ((__force snd_pcm_subformat_t) 0)
+#define SNDRV_PCM_SUBFORMAT_STD ((snd_pcm_subformat_t) 0)
#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD
#define SNDRV_PCM_INFO_MMAP 0x00000001 /* hardware supports mmap */
@@ -301,24 +301,35 @@ typedef int __bitwise snd_pcm_subformat_t;
#define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */
#define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */
-
+#if (__BITS_PER_LONG == 32 && defined(__USE_TIME_BITS64)) || defined __KERNEL__
+#define __SND_STRUCT_TIME64
+#endif
typedef int __bitwise snd_pcm_state_t;
-#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */
-#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1) /* stream has a setup */
-#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2) /* stream is ready to start */
-#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3) /* stream is running */
-#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4) /* stream reached an xrun */
-#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5) /* stream is draining */
-#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6) /* stream is paused */
-#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7) /* hardware is suspended */
-#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8) /* hardware is disconnected */
+#define SNDRV_PCM_STATE_OPEN ((snd_pcm_state_t) 0) /* stream is open */
+#define SNDRV_PCM_STATE_SETUP ((snd_pcm_state_t) 1) /* stream has a setup */
+#define SNDRV_PCM_STATE_PREPARED ((snd_pcm_state_t) 2) /* stream is ready to start */
+#define SNDRV_PCM_STATE_RUNNING ((snd_pcm_state_t) 3) /* stream is running */
+#define SNDRV_PCM_STATE_XRUN ((snd_pcm_state_t) 4) /* stream reached an xrun */
+#define SNDRV_PCM_STATE_DRAINING ((snd_pcm_state_t) 5) /* stream is draining */
+#define SNDRV_PCM_STATE_PAUSED ((snd_pcm_state_t) 6) /* stream is paused */
+#define SNDRV_PCM_STATE_SUSPENDED ((snd_pcm_state_t) 7) /* hardware is suspended */
+#define SNDRV_PCM_STATE_DISCONNECTED ((snd_pcm_state_t) 8) /* hardware is disconnected */
#define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
enum {
SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
- SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
- SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
+ SNDRV_PCM_MMAP_OFFSET_STATUS_OLD = 0x80000000,
+ SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD = 0x81000000,
+ SNDRV_PCM_MMAP_OFFSET_STATUS_NEW = 0x82000000,
+ SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW = 0x83000000,
+#ifdef __SND_STRUCT_TIME64
+ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_NEW,
+ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW,
+#else
+ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_OLD,
+ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD,
+#endif
};
union snd_pcm_sync_id {
@@ -456,8 +467,12 @@ enum {
SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
};
+/* explicit padding avoids incompatibility between i386 and x86-64 */
+typedef struct { unsigned char pad[sizeof(time_t) - sizeof(int)]; } __time_pad;
+
struct snd_pcm_status {
snd_pcm_state_t state; /* stream state */
+ __time_pad pad1; /* align to timespec */
struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */
struct timespec tstamp; /* reference timestamp */
snd_pcm_uframes_t appl_ptr; /* appl ptr */
@@ -474,16 +489,42 @@ struct snd_pcm_status {
unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */
};
-struct snd_pcm_mmap_status {
+/*
+ * For mmap operations, we need the 64-bit layout, both for compat mode,
+ * and for y2038 compatibility. For 64-bit applications, the two definitions
+ * are identical, so we keep the traditional version.
+ */
+#ifdef __SND_STRUCT_TIME64
+#define __snd_pcm_mmap_status64 snd_pcm_mmap_status
+#define __snd_pcm_mmap_control64 snd_pcm_mmap_control
+#define __snd_pcm_sync_ptr64 snd_pcm_sync_ptr
+#define __snd_timespec64 timespec
+struct __snd_timespec {
+ __s32 tv_sec;
+ __s32 tv_nsec;
+};
+#else
+#define __snd_pcm_mmap_status snd_pcm_mmap_status
+#define __snd_pcm_mmap_control snd_pcm_mmap_control
+#define __snd_pcm_sync_ptr snd_pcm_sync_ptr
+#define __snd_timespec timespec
+struct __snd_timespec64 {
+ __s64 tv_sec;
+ __s64 tv_nsec;
+};
+
+#endif
+
+struct __snd_pcm_mmap_status {
snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
int pad1; /* Needed for 64 bit alignment */
snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
- struct timespec tstamp; /* Timestamp */
+ struct __snd_timespec tstamp; /* Timestamp */
snd_pcm_state_t suspended_state; /* RO: suspended stream state */
- struct timespec audio_tstamp; /* from sample counter or wall clock */
+ struct __snd_timespec audio_tstamp; /* from sample counter or wall clock */
};
-struct snd_pcm_mmap_control {
+struct __snd_pcm_mmap_control {
snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
};
@@ -492,27 +533,72 @@ struct snd_pcm_mmap_control {
#define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */
#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */
-struct snd_pcm_sync_ptr {
+struct __snd_pcm_sync_ptr {
unsigned int flags;
union {
- struct snd_pcm_mmap_status status;
+ struct __snd_pcm_mmap_status status;
unsigned char reserved[64];
} s;
union {
- struct snd_pcm_mmap_control control;
+ struct __snd_pcm_mmap_control control;
+ unsigned char reserved[64];
+ } c;
+};
+
+#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN)
+typedef char __pad_before_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)];
+typedef char __pad_after_uframe[0];
+#endif
+
+#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN)
+typedef char __pad_before_uframe[0];
+typedef char __pad_after_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)];
+#endif
+
+struct __snd_pcm_mmap_status64 {
+ snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
+ __u32 pad1; /* Needed for 64 bit alignment */
+ __pad_before_uframe __pad1;
+ snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
+ __pad_after_uframe __pad2;
+ struct __snd_timespec64 tstamp; /* Timestamp */
+ snd_pcm_state_t suspended_state;/* RO: suspended stream state */
+ __u32 pad3; /* Needed for 64 bit alignment */
+ struct __snd_timespec64 audio_tstamp; /* sample counter or wall clock */
+};
+
+struct __snd_pcm_mmap_control64 {
+ __pad_before_uframe __pad1;
+ snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
+ __pad_before_uframe __pad2;
+
+ __pad_before_uframe __pad3;
+ snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
+ __pad_after_uframe __pad4;
+};
+
+struct __snd_pcm_sync_ptr64 {
+ __u32 flags;
+ __u32 pad1;
+ union {
+ struct __snd_pcm_mmap_status64 status;
+ unsigned char reserved[64];
+ } s;
+ union {
+ struct __snd_pcm_mmap_control64 control;
unsigned char reserved[64];
} c;
};
struct snd_xferi {
snd_pcm_sframes_t result;
- void __user *buf;
+ void *buf;
snd_pcm_uframes_t frames;
};
struct snd_xfern {
snd_pcm_sframes_t result;
- void __user * __user *bufs;
+ void * *bufs;
snd_pcm_uframes_t frames;
};
@@ -584,6 +670,8 @@ enum {
#define SNDRV_PCM_IOCTL_STATUS _IOR('A', 0x20, struct snd_pcm_status)
#define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t)
#define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22)
+#define __SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct __snd_pcm_sync_ptr)
+#define __SNDRV_PCM_IOCTL_SYNC_PTR64 _IOWR('A', 0x23, struct __snd_pcm_sync_ptr64)
#define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr)
#define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status)
#define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info)
@@ -614,7 +702,7 @@ enum {
* Raw MIDI section - /dev/snd/midi??
*/
-#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
+#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 1)
enum {
SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
@@ -650,6 +738,7 @@ struct snd_rawmidi_params {
struct snd_rawmidi_status {
int stream;
+ __time_pad pad1;
struct timespec tstamp; /* Timestamp */
size_t avail; /* available bytes */
size_t xruns; /* count of overruns since last status (in bytes) */
@@ -667,7 +756,7 @@ struct snd_rawmidi_status {
* Timer section - /dev/snd/timer
*/
-#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6)
+#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
enum {
SNDRV_TIMER_CLASS_NONE = -1,
@@ -772,7 +861,7 @@ struct snd_timer_status {
#define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int)
#define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id)
-#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int)
+#define SNDRV_TIMER_IOCTL_TREAD_OLD _IOW('T', 0x02, int)
#define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo)
#define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams)
#define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus)
@@ -785,6 +874,15 @@ struct snd_timer_status {
#define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1)
#define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2)
#define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3)
+#define SNDRV_TIMER_IOCTL_TREAD64 _IOW('T', 0xa4, int)
+
+#if __BITS_PER_LONG == 64
+#define SNDRV_TIMER_IOCTL_TREAD SNDRV_TIMER_IOCTL_TREAD_OLD
+#else
+#define SNDRV_TIMER_IOCTL_TREAD ((sizeof(__kernel_long_t) >= sizeof(time_t)) ? \
+ SNDRV_TIMER_IOCTL_TREAD_OLD : \
+ SNDRV_TIMER_IOCTL_TREAD64)
+#endif
struct snd_timer_read {
unsigned int resolution;
@@ -812,8 +910,10 @@ enum {
struct snd_timer_tread {
int event;
+ __time_pad pad1;
struct timespec tstamp;
unsigned int val;
+ __time_pad pad2;
};
/****************************************************************************
@@ -822,7 +922,7 @@ struct snd_timer_tread {
* *
****************************************************************************/
-#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
+#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 8)
struct snd_ctl_card_info {
int card; /* card number */
@@ -837,30 +937,30 @@ struct snd_ctl_card_info {
};
typedef int __bitwise snd_ctl_elem_type_t;
-#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0) /* invalid */
-#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1) /* boolean type */
-#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2) /* integer type */
-#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3) /* enumerated type */
-#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4) /* byte array */
-#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
-#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
+#define SNDRV_CTL_ELEM_TYPE_NONE ((snd_ctl_elem_type_t) 0) /* invalid */
+#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((snd_ctl_elem_type_t) 1) /* boolean type */
+#define SNDRV_CTL_ELEM_TYPE_INTEGER ((snd_ctl_elem_type_t) 2) /* integer type */
+#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((snd_ctl_elem_type_t) 3) /* enumerated type */
+#define SNDRV_CTL_ELEM_TYPE_BYTES ((snd_ctl_elem_type_t) 4) /* byte array */
+#define SNDRV_CTL_ELEM_TYPE_IEC958 ((snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
+#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((snd_ctl_elem_type_t) 6) /* 64-bit integer type */
#define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
typedef int __bitwise snd_ctl_elem_iface_t;
-#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0) /* global control */
-#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
-#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
-#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3) /* PCM device */
-#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
-#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5) /* timer device */
-#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
+#define SNDRV_CTL_ELEM_IFACE_CARD ((snd_ctl_elem_iface_t) 0) /* global control */
+#define SNDRV_CTL_ELEM_IFACE_HWDEP ((snd_ctl_elem_iface_t) 1) /* hardware dependent device */
+#define SNDRV_CTL_ELEM_IFACE_MIXER ((snd_ctl_elem_iface_t) 2) /* virtual mixer device */
+#define SNDRV_CTL_ELEM_IFACE_PCM ((snd_ctl_elem_iface_t) 3) /* PCM device */
+#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((snd_ctl_elem_iface_t) 4) /* RawMidi device */
+#define SNDRV_CTL_ELEM_IFACE_TIMER ((snd_ctl_elem_iface_t) 5) /* timer device */
+#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((snd_ctl_elem_iface_t) 6) /* sequencer client */
#define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
#define SNDRV_CTL_ELEM_ACCESS_READ (1<<0)
#define SNDRV_CTL_ELEM_ACCESS_WRITE (1<<1)
#define SNDRV_CTL_ELEM_ACCESS_READWRITE (SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
#define SNDRV_CTL_ELEM_ACCESS_VOLATILE (1<<2) /* control value may be changed without a notification */
-#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP (1<<3) /* when was control changed */
+// (1 << 3) is unused.
#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1<<4) /* TLV read is possible */
#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE (1<<5) /* TLV write is possible */
#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE (SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
@@ -896,7 +996,7 @@ struct snd_ctl_elem_list {
unsigned int space; /* W: count of element IDs to get */
unsigned int used; /* R: count of element IDs set */
unsigned int count; /* R: count of all elements */
- struct snd_ctl_elem_id __user *pids; /* R: IDs */
+ struct snd_ctl_elem_id *pids; /* R: IDs */
unsigned char reserved[50];
};
@@ -926,11 +1026,7 @@ struct snd_ctl_elem_info {
} enumerated;
unsigned char reserved[128];
} value;
- union {
- unsigned short d[4]; /* dimensions */
- unsigned short *d_ptr; /* indirect - obsoleted */
- } dimen;
- unsigned char reserved[64-4*sizeof(unsigned short)];
+ unsigned char reserved[64];
};
struct snd_ctl_elem_value {
@@ -955,8 +1051,7 @@ struct snd_ctl_elem_value {
} bytes;
struct snd_aes_iec958 iec958;
} value; /* RO */
- struct timespec tstamp;
- unsigned char reserved[128-sizeof(struct timespec)];
+ unsigned char reserved[128];
};
struct snd_ctl_tlv {
@@ -1035,4 +1130,4 @@ struct snd_ctl_event {
#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
#define SNDRV_CTL_NAME_IEC958(expl,direction,what) "IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
-#endif /* _UAPI__SOUND_ASOUND_H */
+#endif /* __SOUND_ASOUND_H */
diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
index 6bcd76f64c1c..78d794c03cd4 100644
--- a/include/sound/uapi/emu10k1.h
+++ b/include/sound/uapi/emu10k1.h
@@ -20,8 +20,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
-#ifndef _UAPI__SOUND_EMU10K1_H
-#define _UAPI__SOUND_EMU10K1_H
+#ifndef __SOUND_EMU10K1_H
+#define __SOUND_EMU10K1_H
+
+#ifdef __linux__
+#include <linux/types.h>
+#endif
/*
* ---- FX8010 ----
@@ -256,13 +260,11 @@
#define EMU10K1_DBG_SINGLE_STEP_ADDR 0x000001ff /* single step address */
/* tank memory address line */
-#ifndef __KERNEL__
#define TANKMEMADDRREG_ADDR_MASK 0x000fffff /* 20 bit tank address field */
#define TANKMEMADDRREG_CLEAR 0x00800000 /* Clear tank memory */
#define TANKMEMADDRREG_ALIGN 0x00400000 /* Align read or write relative to tank access */
#define TANKMEMADDRREG_WRITE 0x00200000 /* Write to tank memory */
#define TANKMEMADDRREG_READ 0x00100000 /* Read from tank memory */
-#endif
struct snd_emu10k1_fx8010_info {
unsigned int internal_tram_size; /* in samples */
@@ -382,4 +384,4 @@ struct snd_emu10k1_fx8010_pcm_rec {
#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
-#endif /* _UAPI__SOUND_EMU10K1_H */
+#endif /* __SOUND_EMU10K1_H */
diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
index 7ac2d3f2a9b3..b8df62b60f4d 100644
--- a/include/sound/uapi/hdsp.h
+++ b/include/sound/uapi/hdsp.h
@@ -20,6 +20,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#ifdef __linux__
+#include <linux/types.h>
+#endif
+
#define HDSP_MATRIX_MIXER_SIZE 2048
enum HDSP_IO_Type {
diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
index 3fbfd9dc5f51..14af3d00ea3f 100644
--- a/include/sound/uapi/hdspm.h
+++ b/include/sound/uapi/hdspm.h
@@ -21,6 +21,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#ifdef __linux__
+#include <linux/types.h>
+#endif
+
/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
#define HDSPM_MAX_CHANNELS 64
diff --git a/include/sound/uapi/sb16_csp.h b/include/sound/uapi/sb16_csp.h
index e64851481d88..55db0b44a8b7 100644
--- a/include/sound/uapi/sb16_csp.h
+++ b/include/sound/uapi/sb16_csp.h
@@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
-#ifndef _UAPI__SOUND_SB16_CSP_H
-#define _UAPI__SOUND_SB16_CSP_H
+#ifndef __SOUND_SB16_CSP_H
+#define __SOUND_SB16_CSP_H
/* CSP modes */
@@ -120,4 +120,4 @@ struct snd_sb_csp_info {
#define SNDRV_SB_CSP_IOCTL_RESTART _IO('H', 0x16)
-#endif /* _UAPI__SOUND_SB16_CSP_H */
+#endif /* __SOUND_SB16_CSP_H */
--
2.16.4

View File

@ -1,25 +0,0 @@
From 5bc3d4c4c14c6a54f61465987fe7e1a097288e4b Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 10 Feb 2020 13:18:23 +0100
Subject: [PATCH 73/74] ucm: parser - add error message to verb_dev_list_add()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 23bf6a63f31e..8d6eea31f8e7 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1135,6 +1135,7 @@ static int verb_dev_list_add(struct use_case_verb *verb,
}
return uc_mgr_put_to_dev_list(&device->dev_list, src);
}
+ uc_error("error: unable to find device '%s'", dst);
return -ENOENT;
}
--
2.16.4

View File

@ -1,32 +0,0 @@
From b367274b4dcdd1e83e6e7211dd2c08df05c8a998 Mon Sep 17 00:00:00 2001
From: Rolf Eike Beer <eb@emlix.com>
Date: Tue, 11 Feb 2020 11:22:18 +0100
Subject: [PATCH 74/74] do not set close-on-exec flag on descriptor if it was
already set
There is no need to set this again if O_CLOEXEC is supported.
Signed-off-by: Rolf Eike Beer <eb@emlix.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
include/local.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/local.h b/include/local.h
index ea0ec32d96b3..ed6ba93664dd 100644
--- a/include/local.h
+++ b/include/local.h
@@ -320,8 +320,10 @@ static inline int snd_open_device(const char *filename, int fmode)
fd = rsm_open_device(filename, fmode);
}
#endif
+#ifndef O_CLOEXEC
if (fd >= 0)
fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
return fd;
}
--
2.16.4

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:958e260e3673f1f6ff6b2d2c0df3fc2e469bea5b2957163ce96ce17f23e87943
size 1004129

3
alsa-lib-1.2.2.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d8e853d8805574777bbe40937812ad1419c9ea7210e176f0def3e6ed255ab3ec
size 1030747

View File

@ -1,3 +1,91 @@
-------------------------------------------------------------------
Fri Mar 13 14:37:03 CET 2020 - tiwai@suse.de
- Update to alsa-lib 1.2.2:
including previous fixes
- Backport recent upstream fixes:
conf updates, PCM ordering fix, configure fix;
0001-conf-change-the-order-of-PCM-devices-in-alsa.conf.patch
0002-conf-namehint-add-omit_noargs-to-the-hint-section.patch
0003-Change-PCM-device-number-of-Asus-Xonar-U5.patch
0004-configure-add-embed-for-python3-config-python-3.8.patch
0005-conf-USB-Audio-Add-C-Media-USB-Headphone-Set-to-the-.patch
- Drop obsoleted patches:
0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
0003-ucm-add-_identifiers-list.patch
0004-namehint-correct-the-args-check.patch
0005-namehint-improve-the-previous-patch-check-the-return.patch
0006-ucm-docs-allow-spaces-in-device-names-for-JackHWMute.patch
0007-use-case-docs-add-PlaybackMixerCopy-and-CaptureMixer.patch
0008-ucm-docs-add-JackCTL-rearrange-JackControl-and-JackD.patch
0009-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
0010-src-ucm-main.c-fix-build-without-mixer.patch
0011-alsa.m4-another-try-to-fix-the-libatopology-detectio.patch
0012-ucm-docs-add-Mic-DigitalMic-and-multiple-devices-com.patch
0013-ucm-docs-remove-DigitalMic-it-does-not-have-sense.patch
0014-ucm-docs-change-the-Mic-description-to-simple-Microp.patch
0015-ucm-docs-add-note-about-the-sequences-and-device-spl.patch
0016-ucm-docs-remove-MixerCopy-values-add-Priority-for-ve.patch
0017-ucm-setup-conf_format-after-getting-ALSA_CONFIG_UCM_.patch
0018-alsa-lib-fix-the-array-parser-unique-compound-keys.patch
0019-topology-remove-vendor_fd-name-from-snd_tplg-structu.patch
0020-topology-file-position-and-size-cleanups.patch
0021-topology-use-an-array-describing-blocks-for-the-main.patch
0022-topology-use-size_t-for-calc_block_size.patch
0023-topology-merge-write_block-to-tplg_write_data.patch
0024-topology-make-vebose-output-more-nice.patch
0025-topology-use-list_insert-macro-in-tplg_elem_insert.patch
0026-topology-dapm-coding-fixes.patch
0027-topology-dapm-merge-identical-index-blocks-like-for-.patch
0028-topology-more-coding-fixes.patch
0029-Fix-alsa-sound-.h-for-external-programs.patch
0030-type_compat-Add-missing-__s64-and-__u64-definitions-.patch
0031-uapi-Move-typedefs-from-uapi-to-sound.patch
0032-Update-the-attributes.m4-macro-file-from-xine.patch
0033-topology-avoid-to-use-the-atoi-directly-when-expecte.patch
0034-topology-use-snd_config_get_bool-instead-own-impleme.patch
0035-topology-fix-tplg_get_integer-handle-errno-ERANGE.patch
0036-topology-add-tplg_get_unsigned-function.patch
0037-topology-convert-builder-to-use-the-mallocated-memor.patch
0038-topology-add-binary-output-from-the-builder.patch
0039-topology-parser-recode-tplg_parse_config.patch
0040-topology-add-snd_tplg_load-remove-snd_tplg_build_bin.patch
0041-topology-move-the-topology-element-table-from-builde.patch
0042-topology-add-parser-to-the-tplg_table.patch
0043-topology-add-snd_tplg_save.patch
0044-topology-add-snd_tplg_create-with-flags.patch
0045-topology-add-snd_tplg_version-function.patch
0046-topology-cleanup-the-SNDERR-calls.patch
0047-topology-dapm-fix-the-SNDERR-Undefined.patch
0048-topology-fix-the-unitialized-tuples.patch
0049-topology-implement-shorter-hexa-uuid-00-00-parser.patch
0050-topology-fix-the-TPLG_DEBUG-compilation.patch
0051-topology-fix-the-ops-parser-accept-integer-hexa-valu.patch
0052-topology-fix-the-wrong-memory-access-object-realloc.patch
0053-topology-implement-snd_tplg_decode.patch
0054-topology-move-the-elem-list-delete-to-tplg_elem_free.patch
0055-topology-unify-the-log-mechanism.patch
0056-topology-tplg_dbg-cleanups.patch
0057-topology-cosmetic-changes-functions.patch
0058-mixer-Fix-memory-leak-for-more-than-16-file-descript.patch
0059-Quote-strings-containing-or-when-saving-an-alsa-conf.patch
0060-ucm-fix-the-configuration-directory-longname-for-ucm.patch
0061-ucm-split-conf_file_name-and-conf_dir_name.patch
0062-ucm-remove-MAX_FILE-definition-and-use-correct-PATH_.patch
0063-topology-remove-MAX_FILE-definition-and-use-correct-.patch
0064-ucm-parser-cosmetic-fixes-in-the-comments.patch
0065-configure.ac-remove-an-unnecessary-libtool-fix.patch
0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch
0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch
0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch
0069-ucm-fill-missing-device-entries-conflicting-supporte.patch
0070-control-Remove-access-to-the-deprecated-dimen-fields.patch
0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch
0072-uapi-Sync-with-5.6-kernel-ABI.patch
0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch
0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Wed Feb 12 20:36:56 CET 2020 - tiwai@suse.de Wed Feb 12 20:36:56 CET 2020 - tiwai@suse.de

150
alsa.spec
View File

@ -26,7 +26,7 @@
%endif %endif
Name: alsa Name: alsa
Version: 1.2.1.2 Version: 1.2.2
Release: 0 Release: 0
Summary: Advanced Linux Sound Architecture Summary: Advanced Linux Sound Architecture
License: LGPL-2.1-or-later License: LGPL-2.1-or-later
@ -48,80 +48,11 @@ Source31: all_notes_off.bin
Source32: all_notes_off.mid Source32: all_notes_off.mid
Source34: alsa-init.sh Source34: alsa-init.sh
# upstream fixes # upstream fixes
Patch1: 0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch Patch1: 0001-conf-change-the-order-of-PCM-devices-in-alsa.conf.patch
Patch2: 0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch Patch2: 0002-conf-namehint-add-omit_noargs-to-the-hint-section.patch
Patch3: 0003-ucm-add-_identifiers-list.patch Patch3: 0003-Change-PCM-device-number-of-Asus-Xonar-U5.patch
Patch4: 0004-namehint-correct-the-args-check.patch Patch4: 0004-configure-add-embed-for-python3-config-python-3.8.patch
Patch5: 0005-namehint-improve-the-previous-patch-check-the-return.patch Patch5: 0005-conf-USB-Audio-Add-C-Media-USB-Headphone-Set-to-the-.patch
Patch6: 0006-ucm-docs-allow-spaces-in-device-names-for-JackHWMute.patch
Patch7: 0007-use-case-docs-add-PlaybackMixerCopy-and-CaptureMixer.patch
Patch8: 0008-ucm-docs-add-JackCTL-rearrange-JackControl-and-JackD.patch
Patch9: 0009-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
Patch10: 0010-src-ucm-main.c-fix-build-without-mixer.patch
Patch11: 0011-alsa.m4-another-try-to-fix-the-libatopology-detectio.patch
Patch12: 0012-ucm-docs-add-Mic-DigitalMic-and-multiple-devices-com.patch
Patch13: 0013-ucm-docs-remove-DigitalMic-it-does-not-have-sense.patch
Patch14: 0014-ucm-docs-change-the-Mic-description-to-simple-Microp.patch
Patch15: 0015-ucm-docs-add-note-about-the-sequences-and-device-spl.patch
Patch16: 0016-ucm-docs-remove-MixerCopy-values-add-Priority-for-ve.patch
Patch17: 0017-ucm-setup-conf_format-after-getting-ALSA_CONFIG_UCM_.patch
Patch18: 0018-alsa-lib-fix-the-array-parser-unique-compound-keys.patch
Patch19: 0019-topology-remove-vendor_fd-name-from-snd_tplg-structu.patch
Patch20: 0020-topology-file-position-and-size-cleanups.patch
Patch21: 0021-topology-use-an-array-describing-blocks-for-the-main.patch
Patch22: 0022-topology-use-size_t-for-calc_block_size.patch
Patch23: 0023-topology-merge-write_block-to-tplg_write_data.patch
Patch24: 0024-topology-make-vebose-output-more-nice.patch
Patch25: 0025-topology-use-list_insert-macro-in-tplg_elem_insert.patch
Patch26: 0026-topology-dapm-coding-fixes.patch
Patch27: 0027-topology-dapm-merge-identical-index-blocks-like-for-.patch
Patch28: 0028-topology-more-coding-fixes.patch
Patch29: 0029-Fix-alsa-sound-.h-for-external-programs.patch
Patch30: 0030-type_compat-Add-missing-__s64-and-__u64-definitions-.patch
Patch31: 0031-uapi-Move-typedefs-from-uapi-to-sound.patch
Patch32: 0032-Update-the-attributes.m4-macro-file-from-xine.patch
Patch33: 0033-topology-avoid-to-use-the-atoi-directly-when-expecte.patch
Patch34: 0034-topology-use-snd_config_get_bool-instead-own-impleme.patch
Patch35: 0035-topology-fix-tplg_get_integer-handle-errno-ERANGE.patch
Patch36: 0036-topology-add-tplg_get_unsigned-function.patch
Patch37: 0037-topology-convert-builder-to-use-the-mallocated-memor.patch
Patch38: 0038-topology-add-binary-output-from-the-builder.patch
Patch39: 0039-topology-parser-recode-tplg_parse_config.patch
Patch40: 0040-topology-add-snd_tplg_load-remove-snd_tplg_build_bin.patch
Patch41: 0041-topology-move-the-topology-element-table-from-builde.patch
Patch42: 0042-topology-add-parser-to-the-tplg_table.patch
Patch43: 0043-topology-add-snd_tplg_save.patch
Patch44: 0044-topology-add-snd_tplg_create-with-flags.patch
Patch45: 0045-topology-add-snd_tplg_version-function.patch
Patch46: 0046-topology-cleanup-the-SNDERR-calls.patch
Patch47: 0047-topology-dapm-fix-the-SNDERR-Undefined.patch
Patch48: 0048-topology-fix-the-unitialized-tuples.patch
Patch49: 0049-topology-implement-shorter-hexa-uuid-00-00-parser.patch
Patch50: 0050-topology-fix-the-TPLG_DEBUG-compilation.patch
Patch51: 0051-topology-fix-the-ops-parser-accept-integer-hexa-valu.patch
Patch52: 0052-topology-fix-the-wrong-memory-access-object-realloc.patch
Patch53: 0053-topology-implement-snd_tplg_decode.patch
Patch54: 0054-topology-move-the-elem-list-delete-to-tplg_elem_free.patch
Patch55: 0055-topology-unify-the-log-mechanism.patch
Patch56: 0056-topology-tplg_dbg-cleanups.patch
Patch57: 0057-topology-cosmetic-changes-functions.patch
Patch58: 0058-mixer-Fix-memory-leak-for-more-than-16-file-descript.patch
Patch59: 0059-Quote-strings-containing-or-when-saving-an-alsa-conf.patch
Patch60: 0060-ucm-fix-the-configuration-directory-longname-for-ucm.patch
Patch61: 0061-ucm-split-conf_file_name-and-conf_dir_name.patch
Patch62: 0062-ucm-remove-MAX_FILE-definition-and-use-correct-PATH_.patch
Patch63: 0063-topology-remove-MAX_FILE-definition-and-use-correct-.patch
Patch64: 0064-ucm-parser-cosmetic-fixes-in-the-comments.patch
Patch65: 0065-configure.ac-remove-an-unnecessary-libtool-fix.patch
Patch66: 0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch
Patch67: 0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch
Patch68: 0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch
Patch69: 0069-ucm-fill-missing-device-entries-conflicting-supporte.patch
Patch70: 0070-control-Remove-access-to-the-deprecated-dimen-fields.patch
Patch71: 0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch
Patch72: 0072-uapi-Sync-with-5.6-kernel-ABI.patch
Patch73: 0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch
Patch74: 0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch
# rest suse fixes # rest suse fixes
Patch101: alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch Patch101: alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch
BuildRequires: doxygen BuildRequires: doxygen
@ -211,75 +142,6 @@ This package contains the library for ALSA topology support.
%patch3 -p1 %patch3 -p1
%patch4 -p1 %patch4 -p1
%patch5 -p1 %patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1
%patch39 -p1
%patch40 -p1
%patch41 -p1
%patch42 -p1
%patch43 -p1
%patch44 -p1
%patch45 -p1
%patch46 -p1
%patch47 -p1
%patch48 -p1
%patch49 -p1
%patch50 -p1
%patch51 -p1
%patch52 -p1
%patch53 -p1
%patch54 -p1
%patch55 -p1
%patch56 -p1
%patch57 -p1
%patch58 -p1
%patch59 -p1
%patch60 -p1
%patch61 -p1
%patch62 -p1
%patch63 -p1
%patch64 -p1
%patch65 -p1
%patch66 -p1
%patch67 -p1
%patch68 -p1
%patch69 -p1
%patch70 -p1
%patch71 -p1
%patch72 -p1
%patch73 -p1
%patch74 -p1
%patch101 -p1 %patch101 -p1
%build %build