Hello community, here is the log from the commit of package alsa for openSUSE:Factory checked in at 2015-10-14 16:40:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/alsa (Old) and /work/SRC/openSUSE:Factory/.alsa.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "alsa" Changes: -------- --- /work/SRC/openSUSE:Factory/alsa/alsa.changes 2015-08-21 07:37:19.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.alsa.new/alsa.changes 2015-10-14 16:41:01.000000000 +0200 @@ -1,0 +2,29 @@ +Fri Oct 2 12:11:24 CEST 2015 - [email protected] + +- Backport upsteram fixes: more topology API updates/fixes, misc + documentation fixes, some logical error fixes in PCM plugins, + LADSPA plugin segfault fix: + 0050-topology-fix-element-object-type-is-switch.patch + 0051-topology-Add-element-ID-so-we-can-look-up-references.patch + 0052-topology-Add-support-for-writing-manifest-private-da.patch + 0053-topology-update-ABI-to-improve-support-for-different.patch + 0054-topology-Add-ops-support-to-byte-control-objects.patch + 0055-topology-treat-all-DAPM-controls-types-the-same-when.patch + 0056-topology-print-error-prefix-on-error-message.patch + 0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch + 0058-core-add-convenience-macros-to-local.h.patch + 0059-topology-Add-C-templates-structure-for-building-topo.patch + 0060-topology-A-API-calls-to-directly-build-topology-data.patch + 0061-pcm-Fix-doxygen-for-two-enums.patch + 0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch + 0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch + 0064-topology-builder-Fix-possibly-uninitialized-variable.patch + 0065-topology-ctl-Fix-access-type-checks.patch + 0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch + 0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch + 0068-topology-pcm-Remove-unused-variables.patch + 0069-build-Do-not-try-to-detect-cross-compiler.patch + 0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch + 0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch + +------------------------------------------------------------------- New: ---- 0050-topology-fix-element-object-type-is-switch.patch 0051-topology-Add-element-ID-so-we-can-look-up-references.patch 0052-topology-Add-support-for-writing-manifest-private-da.patch 0053-topology-update-ABI-to-improve-support-for-different.patch 0054-topology-Add-ops-support-to-byte-control-objects.patch 0055-topology-treat-all-DAPM-controls-types-the-same-when.patch 0056-topology-print-error-prefix-on-error-message.patch 0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch 0058-core-add-convenience-macros-to-local.h.patch 0059-topology-Add-C-templates-structure-for-building-topo.patch 0060-topology-A-API-calls-to-directly-build-topology-data.patch 0061-pcm-Fix-doxygen-for-two-enums.patch 0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch 0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch 0064-topology-builder-Fix-possibly-uninitialized-variable.patch 0065-topology-ctl-Fix-access-type-checks.patch 0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch 0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch 0068-topology-pcm-Remove-unused-variables.patch 0069-build-Do-not-try-to-detect-cross-compiler.patch 0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch 0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ alsa.spec ++++++ --- /var/tmp/diff_new_pack.5ipw1a/_old 2015-10-14 16:41:03.000000000 +0200 +++ /var/tmp/diff_new_pack.5ipw1a/_new 2015-10-14 16:41:03.000000000 +0200 @@ -98,6 +98,28 @@ Patch47: 0047-conf-topology-Add-topology-file-for-broadwell-audio-.patch Patch48: 0048-topology-Fix-missing-inclusion-of-ctype.h.patch Patch49: 0049-topology-Fix-typos.patch +Patch50: 0050-topology-fix-element-object-type-is-switch.patch +Patch51: 0051-topology-Add-element-ID-so-we-can-look-up-references.patch +Patch52: 0052-topology-Add-support-for-writing-manifest-private-da.patch +Patch53: 0053-topology-update-ABI-to-improve-support-for-different.patch +Patch54: 0054-topology-Add-ops-support-to-byte-control-objects.patch +Patch55: 0055-topology-treat-all-DAPM-controls-types-the-same-when.patch +Patch56: 0056-topology-print-error-prefix-on-error-message.patch +Patch57: 0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch +Patch58: 0058-core-add-convenience-macros-to-local.h.patch +Patch59: 0059-topology-Add-C-templates-structure-for-building-topo.patch +Patch60: 0060-topology-A-API-calls-to-directly-build-topology-data.patch +Patch61: 0061-pcm-Fix-doxygen-for-two-enums.patch +Patch62: 0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch +Patch63: 0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch +Patch64: 0064-topology-builder-Fix-possibly-uninitialized-variable.patch +Patch65: 0065-topology-ctl-Fix-access-type-checks.patch +Patch66: 0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch +Patch67: 0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch +Patch68: 0068-topology-pcm-Remove-unused-variables.patch +Patch69: 0069-build-Do-not-try-to-detect-cross-compiler.patch +Patch70: 0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch +Patch71: 0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch # rest suse patches Patch99: alsa-lib-doxygen-avoid-crash-for-11.3.diff # suppress timestamp in documents @@ -217,6 +239,28 @@ %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 %if 0%{?suse_version} == 1130 %patch99 -p1 %endif ++++++ 0050-topology-fix-element-object-type-is-switch.patch ++++++ >From 1bb4c2fc304515278e6510ba7288b94f99f50bcd Mon Sep 17 00:00:00 2001 From: Liam Girdwood <[email protected]> Date: Tue, 4 Aug 2015 18:06:55 +0100 Subject: [PATCH] topology: fix element object type is switch() Use the correct type for this object. Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/elem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topology/elem.c b/src/topology/elem.c index 32ba2c12375b..d7a1fd715d49 100644 --- a/src/topology/elem.c +++ b/src/topology/elem.c @@ -137,7 +137,7 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg, list_add_tail(&elem->list, &tplg->enum_list); obj_size = sizeof(struct snd_soc_tplg_enum_control); break; - case SND_SOC_TPLG_TYPE_MIXER: + case OBJECT_TYPE_MIXER: list_add_tail(&elem->list, &tplg->mixer_list); obj_size = sizeof(struct snd_soc_tplg_mixer_control); break; -- 2.5.3 ++++++ 0051-topology-Add-element-ID-so-we-can-look-up-references.patch ++++++ >From 120b3b8eadd9a2a4c2ede0a246bffa1cfac562a9 Mon Sep 17 00:00:00 2001 From: Jin Yao <[email protected]> Date: Tue, 4 Aug 2015 18:09:12 +0100 Subject: [PATCH] topology: Add element ID so we can look up references by name. Add support to lookup elements by name. This is in preparation for adding some new API calls that will allow building topology data using a C API. This will allow applications to build their own topology data directly. Signed-off-by: Jin Yao <[email protected]> Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/ctl.c | 9 ++++----- src/topology/dapm.c | 2 +- src/topology/data.c | 2 +- src/topology/elem.c | 15 +++++++++++---- src/topology/pcm.c | 10 +++++----- src/topology/text.c | 2 +- src/topology/tplg_local.h | 2 +- 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/topology/ctl.c b/src/topology/ctl.c index 9c1333c1fc88..aa06ff64bc48 100644 --- a/src/topology/ctl.c +++ b/src/topology/ctl.c @@ -264,7 +264,7 @@ int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg, int err = 0; struct tplg_elem *elem; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_TLV); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_TLV); if (!elem) return -ENOMEM; @@ -298,7 +298,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg, const char *id, *val = NULL; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_BYTES); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_BYTES); if (!elem) return -ENOMEM; @@ -403,11 +403,10 @@ int tplg_parse_control_enum(snd_tplg_t *tplg, snd_config_t *cfg, const char *id, *val = NULL; int err, j; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_ENUM); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_ENUM); if (!elem) return -ENOMEM; - /* init new mixer */ ec = elem->enum_ctrl; elem_copy_text(ec->hdr.name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); ec->hdr.type = SND_SOC_TPLG_TYPE_ENUM; @@ -501,7 +500,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg, const char *id, *val = NULL; int err, j; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_MIXER); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_MIXER); if (!elem) return -ENOMEM; diff --git a/src/topology/dapm.c b/src/topology/dapm.c index 1da82adea470..7e26ea0326ec 100644 --- a/src/topology/dapm.c +++ b/src/topology/dapm.c @@ -420,7 +420,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg, const char *id, *val = NULL; int widget_type, err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_DAPM_WIDGET); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_DAPM_WIDGET); if (!elem) return -ENOMEM; diff --git a/src/topology/data.c b/src/topology/data.c index 13e1e2bb60fb..c768bc5b0b04 100644 --- a/src/topology/data.c +++ b/src/topology/data.c @@ -268,7 +268,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg, int err = 0; struct tplg_elem *elem; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_DATA); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_DATA); if (!elem) return -ENOMEM; diff --git a/src/topology/elem.c b/src/topology/elem.c index d7a1fd715d49..7fee65332124 100644 --- a/src/topology/elem.c +++ b/src/topology/elem.c @@ -103,20 +103,27 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id, /* create a new common element and object */ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg, - snd_config_t *cfg, enum object_type type) + snd_config_t *cfg, const char *name, enum object_type type) { struct tplg_elem *elem; const char *id; int obj_size = 0; void *obj; + if (!cfg && !name) + return NULL; + elem = tplg_elem_new(); if (!elem) return NULL; - snd_config_get_id(cfg, &id); - strncpy(elem->id, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); - elem->id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN - 1] = 0; + /* do we get name from cfg */ + if (cfg) { + snd_config_get_id(cfg, &id); + elem_copy_text(elem->id, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); + elem->id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN - 1] = 0; + } else if (name != NULL) + elem_copy_text(elem->id, name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); switch (type) { case OBJECT_TYPE_DATA: diff --git a/src/topology/pcm.c b/src/topology/pcm.c index 8f23a6f12ec4..deae47b771be 100644 --- a/src/topology/pcm.c +++ b/src/topology/pcm.c @@ -228,7 +228,7 @@ int tplg_parse_pcm_config(snd_tplg_t *tplg, const char *id; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_STREAM_CONFIG); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_STREAM_CONFIG); if (!elem) return -ENOMEM; @@ -294,7 +294,7 @@ int tplg_parse_pcm_caps(snd_tplg_t *tplg, char *s; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_STREAM_CAPS); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_STREAM_CAPS); if (!elem) return -ENOMEM; @@ -461,7 +461,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg, const char *id, *val = NULL; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_PCM); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_PCM); if (!elem) return -ENOMEM; @@ -524,7 +524,7 @@ int tplg_parse_be(snd_tplg_t *tplg, const char *id, *val = NULL; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_BE); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_BE); if (!elem) return -ENOMEM; @@ -587,7 +587,7 @@ int tplg_parse_cc(snd_tplg_t *tplg, const char *id, *val = NULL; int err; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_CC); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_CC); if (!elem) return -ENOMEM; diff --git a/src/topology/text.c b/src/topology/text.c index ebb6e3840d62..7128056d5d34 100644 --- a/src/topology/text.c +++ b/src/topology/text.c @@ -64,7 +64,7 @@ int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg, int err = 0; struct tplg_elem *elem; - elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_TEXT); + elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_TEXT); if (!elem) return -ENOMEM; diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h index 688c78f3a6a4..62788e4b7ca1 100644 --- a/src/topology/tplg_local.h +++ b/src/topology/tplg_local.h @@ -216,7 +216,7 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id, unsigned int type); struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg, - snd_config_t *cfg, enum object_type type); + snd_config_t *cfg, const char *name, enum object_type type); static inline void elem_copy_text(char *dest, const char *src, int len) { -- 2.5.3 ++++++ 0052-topology-Add-support-for-writing-manifest-private-da.patch ++++++ >From d5e7e8bb38681c2cbf3777314c422130a740810e Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Tue, 4 Aug 2015 18:09:46 +0100 Subject: [PATCH] topology: Add support for writing manifest private data. Allow manifest to contain private data and write this data to file. Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/builder.c | 37 ++++++++++++++++++++++++++++++++----- src/topology/tplg_local.h | 1 + 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/topology/builder.c b/src/topology/builder.c index 0066b220353c..a944866a2d68 100644 --- a/src/topology/builder.c +++ b/src/topology/builder.c @@ -226,9 +226,6 @@ static int write_block(snd_tplg_t *tplg, struct list_head *base, case OBJECT_TYPE_CC: return write_elem_block(tplg, base, size, SND_SOC_TPLG_TYPE_DAI_LINK, "cc"); - case OBJECT_TYPE_MANIFEST: - return write_data_block(tplg, size, SND_SOC_TPLG_TYPE_MANIFEST, - "manifest", &tplg->manifest); case OBJECT_TYPE_DATA: return write_elem_block(tplg, base, size, SND_SOC_TPLG_TYPE_PDATA, "data"); @@ -239,13 +236,43 @@ static int write_block(snd_tplg_t *tplg, struct list_head *base, return 0; } +/* write the manifest including its private data */ +static int write_manifest_data(snd_tplg_t *tplg) +{ + int ret; + + /* write the header for this block */ + ret = write_block_header(tplg, SND_SOC_TPLG_TYPE_MANIFEST, 0, + SND_SOC_TPLG_ABI_VERSION, 0, + sizeof(tplg->manifest) + tplg->manifest.priv.size, 1); + if (ret < 0) { + SNDERR("error: failed to write manifest block %d\n", ret); + 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; + } + + 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; +} + int tplg_write_data(snd_tplg_t *tplg) { int ret; /* write manifest */ - ret = write_data_block(tplg, sizeof(tplg->manifest), - OBJECT_TYPE_MANIFEST, "manifest", &tplg->manifest); + ret = write_manifest_data(tplg); if (ret < 0) { SNDERR("failed to write manifest %d\n", ret); return ret; diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h index 62788e4b7ca1..ad38945056df 100644 --- a/src/topology/tplg_local.h +++ b/src/topology/tplg_local.h @@ -77,6 +77,7 @@ struct snd_tplg { /* manifest */ struct snd_soc_tplg_manifest manifest; + const void *manifest_pdata; /* copied by builder at file write */ /* list of each element type */ struct list_head tlv_list; -- 2.5.3 ++++++ 0053-topology-update-ABI-to-improve-support-for-different.patch ++++++ >From 8c8372cc060ec16776db28f927c9402dcc09b001 Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Wed, 5 Aug 2015 14:41:50 +0100 Subject: [PATCH] topology: update ABI to improve support for different TLV object types. Currently the TLV topology structure is targeted at only supporting the DB scale data. This patch extends support for the other TLV types so they can be easily added at a later stage. TLV structure is moved to common topology control header since it's a common field for controls and can be processed in a general way. Users must set a proper access flag for a control since it's used to decide if the TLV field is valid and if a TLV callback is needed. Removed the following fields from topology TLV struct: - size/count: type can decide the size. - numid: not needed to initialize TLV for kcontrol. - data: replaced by the type specific struct. Added TLV structure to generic control header and removed TLV structure from mixer control. Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/sound/asoc.h | 19 +++++++++++++------ src/topology/ctl.c | 20 ++++++++------------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/include/sound/asoc.h b/include/sound/asoc.h index bb6dcf3ff7b4..73eb80ef17cc 100644 --- a/include/sound/asoc.h +++ b/include/sound/asoc.h @@ -135,11 +135,19 @@ struct snd_soc_tplg_private { /* * Kcontrol TLV data. */ +struct snd_soc_tplg_tlv_dbscale { + __le32 min; + __le32 step; + __le32 mute; +} __attribute__((packed)); + struct snd_soc_tplg_ctl_tlv { - __le32 size; /* in bytes aligned to 4 */ - __le32 numid; /* control element numeric identification */ - __le32 count; /* number of elem in data array */ - __le32 data[SND_SOC_TPLG_TLV_SIZE]; + __le32 size; /* in bytes of this structure */ + __le32 type; /* SNDRV_CTL_TLVT_*, type of TLV */ + union { + __le32 data[SND_SOC_TPLG_TLV_SIZE]; + struct snd_soc_tplg_tlv_dbscale scale; + }; } __attribute__((packed)); /* @@ -170,7 +178,7 @@ struct snd_soc_tplg_ctl_hdr { char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; __le32 access; struct snd_soc_tplg_kcontrol_ops_id ops; - __le32 tlv_size; /* non zero means control has TLV data */ + struct snd_soc_tplg_ctl_tlv tlv; } __attribute__((packed)); /* @@ -258,7 +266,6 @@ struct snd_soc_tplg_mixer_control { __le32 invert; __le32 num_channels; struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN]; - struct snd_soc_tplg_ctl_tlv tlv; struct snd_soc_tplg_private priv; } __attribute__((packed)); diff --git a/src/topology/ctl.c b/src/topology/ctl.c index aa06ff64bc48..930b50897220 100644 --- a/src/topology/ctl.c +++ b/src/topology/ctl.c @@ -28,10 +28,7 @@ static int copy_tlv(struct tplg_elem *elem, struct tplg_elem *ref) tplg_dbg("TLV '%s' used by '%s\n", ref->id, elem->id); /* TLV has a fixed size */ - mixer_ctrl->tlv = *tlv; - - /* set size of TLV data */ - mixer_ctrl->hdr.tlv_size = tlv->count * sizeof(uint32_t); + mixer_ctrl->hdr.tlv = *tlv; return 0; } @@ -209,20 +206,19 @@ 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_tlv_dbscale *scale; const char *id = NULL, *value = NULL; - int *data; tplg_dbg(" scale: %s\n", elem->id); tplg_tlv = calloc(1, sizeof(*tplg_tlv)); if (!tplg_tlv) return -ENOMEM; - data = (int*)(tplg_tlv->data); elem->tlv = tplg_tlv; - tplg_tlv->numid = SNDRV_CTL_TLVT_DB_SCALE; - tplg_tlv->count = 8; - tplg_tlv->size = sizeof(*tplg_tlv); + tplg_tlv->size = sizeof(struct snd_soc_tplg_ctl_tlv); + tplg_tlv->type = SNDRV_CTL_TLVT_DB_SCALE; + scale = &tplg_tlv->scale; snd_config_for_each(i, next, cfg) { @@ -242,11 +238,11 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, struct tplg_elem *elem) /* get TLV data */ if (strcmp(id, "min") == 0) - data[0] = atoi(value); + scale->min = atoi(value); else if (strcmp(id, "step") == 0) - data[1] = atoi(value); + scale->step = atoi(value); else if (strcmp(id, "mute") == 0) - data[2] = atoi(value); + scale->mute = atoi(value); else SNDERR("error: unknown key %s\n", id); } -- 2.5.3 ++++++ 0054-topology-Add-ops-support-to-byte-control-objects.patch ++++++ >From 80a8283d179739f73ad007b5d60dbf28b80fddb9 Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Wed, 5 Aug 2015 14:41:51 +0100 Subject: [PATCH] topology: Add ops support to byte control objects. Rename the control ops structure to make it more generic so we can use it with other objects like bytes controls. Add this structure to the byte control structure. Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/sound/asoc.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/sound/asoc.h b/include/sound/asoc.h index 73eb80ef17cc..c642855e4b0c 100644 --- a/include/sound/asoc.h +++ b/include/sound/asoc.h @@ -161,9 +161,11 @@ struct snd_soc_tplg_channel { } __attribute__((packed)); /* - * Kcontrol Operations IDs + * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops + * Kcontrol ops need get/put/info. + * Bytes ext ops need get/put. */ -struct snd_soc_tplg_kcontrol_ops_id { +struct snd_soc_tplg_io_ops { __le32 get; __le32 put; __le32 info; @@ -177,7 +179,7 @@ struct snd_soc_tplg_ctl_hdr { __le32 type; char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; __le32 access; - struct snd_soc_tplg_kcontrol_ops_id ops; + struct snd_soc_tplg_io_ops ops; struct snd_soc_tplg_ctl_tlv tlv; } __attribute__((packed)); @@ -309,6 +311,7 @@ struct snd_soc_tplg_bytes_control { __le32 mask; __le32 base; __le32 num_regs; + struct snd_soc_tplg_io_ops ext_ops; struct snd_soc_tplg_private priv; } __attribute__((packed)); -- 2.5.3 ++++++ 0055-topology-treat-all-DAPM-controls-types-the-same-when.patch ++++++ >From ecf7fdaeef57d300b94a1cd00db8a8b04a2edceb Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Fri, 7 Aug 2015 16:39:15 +0100 Subject: [PATCH] topology: treat all DAPM controls types the same when copying Copy all DAPM controls types using the same method. Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/dapm.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/topology/dapm.c b/src/topology/dapm.c index 7e26ea0326ec..a0a8b8656c21 100644 --- a/src/topology/dapm.c +++ b/src/topology/dapm.c @@ -107,8 +107,6 @@ static int tplg_parse_dapm_enums(snd_config_t *cfg, struct tplg_elem *elem) static int copy_dapm_control(struct tplg_elem *elem, struct tplg_elem *ref) { struct snd_soc_tplg_dapm_widget *widget = elem->widget; - struct snd_soc_tplg_mixer_control *mixer_ctrl = ref->mixer_ctrl; - struct snd_soc_tplg_enum_control *enum_ctrl = ref->enum_ctrl; tplg_dbg("Control '%s' used by '%s'\n", ref->id, elem->id); tplg_dbg("\tparent size: %d + %d -> %d, priv size -> %d\n", @@ -121,13 +119,10 @@ static int copy_dapm_control(struct tplg_elem *elem, struct tplg_elem *ref) elem->widget = widget; - /* copy new widget at the end */ - if (ref->type == OBJECT_TYPE_MIXER) - memcpy((void*)widget + elem->size, mixer_ctrl, ref->size); - else if (ref->type == OBJECT_TYPE_ENUM) - memcpy((void*)widget + elem->size, enum_ctrl, ref->size); - + /* append the control to the end of the widget */ + memcpy((void*)widget + elem->size, ref->obj, ref->size); elem->size += ref->size; + widget->num_kcontrols++; ref->compound_elem = 1; return 0; -- 2.5.3 ++++++ 0056-topology-print-error-prefix-on-error-message.patch ++++++ >From b47cf00197420d7dc9dc01dce75b41aaad49278e Mon Sep 17 00:00:00 2001 From: Liam Girdwood <[email protected]> Date: Fri, 7 Aug 2015 16:39:16 +0100 Subject: [PATCH] topology: print error prefix on error message. Let the user know it's an error. Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topology/data.c b/src/topology/data.c index c768bc5b0b04..090185174ce4 100644 --- a/src/topology/data.c +++ b/src/topology/data.c @@ -384,7 +384,7 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref) break; default: - SNDERR("elem '%s': type %d private data not supported \n", + SNDERR("error: elem '%s': type %d private data not supported \n", elem->id, elem->type); return -EINVAL; } -- 2.5.3 ++++++ 0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch ++++++ ++++ 782 lines (skipped) ++++++ 0058-core-add-convenience-macros-to-local.h.patch ++++++ >From ab9633d581110a5da08bd2d2c7c070f3862fe9af Mon Sep 17 00:00:00 2001 From: Liam Girdwood <[email protected]> Date: Tue, 11 Aug 2015 18:23:15 +0100 Subject: [PATCH] core: add convenience macros to local.h Move ARRAY_SIZE() from tplg_local.h to local.h and add container_of() macro to local.h. Both macros are generic but are initially used by topology. Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/local.h | 7 +++++++ src/topology/tplg_local.h | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/local.h b/include/local.h index 660081638a1c..b429f5d0094c 100644 --- a/include/local.h +++ b/include/local.h @@ -350,4 +350,11 @@ int snd_config_search_alias_hooks(snd_config_t *config, int _snd_conf_generic_id(const char *id); +/* convenience macros */ +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + #endif diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h index febc1772fd04..3982cc70dce5 100644 --- a/src/topology/tplg_local.h +++ b/src/topology/tplg_local.h @@ -32,7 +32,6 @@ #define MAX_FILE 256 #define TPLG_MAX_PRIV_SIZE (1024 * 128) #define ALSA_TPLG_DIR ALSA_CONFIG_DIR "/topology" -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) /** The name of the environment variable containing the tplg directory */ #define ALSA_CONFIG_TPLG_VAR "ALSA_CONFIG_TPLG" -- 2.5.3 ++++++ 0059-topology-Add-C-templates-structure-for-building-topo.patch ++++++ >From 1b148ef590f94fc30b4c814c1ce2bc31621af840 Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Tue, 11 Aug 2015 18:23:16 +0100 Subject: [PATCH] topology: Add C templates structure for building topology from C programs Define structures that can be used by applications to directly build topology data instead of using text files. The application will build up the topology data by populating the template structures for each object type and then registering the template with the topology core. Signed-off-by: Mengdong Lin <[email protected]> Signed-off-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/topology.h | 176 ++++++++++++++++++++++++++++++++++++++++++++++ src/topology/tplg_local.h | 18 ----- 2 files changed, 176 insertions(+), 18 deletions(-) diff --git a/include/topology.h b/include/topology.h index 0cb2d79e5574..aee43de6e009 100644 --- a/include/topology.h +++ b/include/topology.h @@ -456,9 +456,30 @@ extern "C" { * */ +/** Maximum number of channels supported in one control */ +#define SND_TPLG_MAX_CHAN 8 + /** Topology context */ typedef struct snd_tplg snd_tplg_t; +/** Topology object types */ +enum snd_tplg_type { + SND_TPLG_TYPE_TLV = 0, /*!< TLV Data */ + SND_TPLG_TYPE_MIXER, /*!< Mixer control*/ + SND_TPLG_TYPE_ENUM, /*!< Enumerated control */ + SND_TPLG_TYPE_TEXT, /*!< Text data */ + SND_TPLG_TYPE_DATA, /*!< Private data */ + SND_TPLG_TYPE_BYTES, /*!< Byte control */ + SND_TPLG_TYPE_STREAM_CONFIG, /*!< PCM Stream configuration */ + SND_TPLG_TYPE_STREAM_CAPS, /*!< PCM Stream capabilities */ + SND_TPLG_TYPE_PCM, /*!< PCM stream device */ + SND_TPLG_TYPE_DAPM_WIDGET, /*!< DAPM widget */ + SND_TPLG_TYPE_DAPM_GRAPH, /*!< DAPM graph elements */ + SND_TPLG_TYPE_BE, /*!< BE DAI link */ + SND_TPLG_TYPE_CC, /*!< Hostless codec <-> codec link */ + SND_TPLG_TYPE_MANIFEST, /*!< Topology manifest */ +}; + /** * \brief Create a new topology parser instance. * \return New topology parser instance @@ -488,6 +509,161 @@ int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile, */ void snd_tplg_verbose(snd_tplg_t *tplg, int verbose); +/** \struct snd_tplg_tlv_template + * \brief Template type for all TLV objects. + */ +struct snd_tplg_tlv_template { + int type; /*!< TLV type SNDRV_CTL_TLVT_ */ +}; + +/** \struct snd_tplg_tlv_dbscale_template + * \brief Template type for TLV Scale objects. + */ +struct snd_tplg_tlv_dbscale_template { + struct snd_tplg_tlv_template hdr; /*!< TLV type header */ + int min; /*!< dB minimum value in 0.1dB */ + int step; /*!< dB step size in 0.1dB */ + int mute; /*!< is min dB value mute ? */ +}; + +/** \struct snd_tplg_channel_template + * \brief Template type for single channel mapping. + */ +struct snd_tplg_channel_elem { + int size; /*!< size in bytes of this structure */ + int reg; /*!< channel control register */ + int shift; /*!< channel shift for control bits */ + int id; /*!< ID maps to Left, Right, LFE etc */ +}; + +/** \struct snd_tplg_channel_map_template + * \brief Template type for channel mapping. + */ +struct snd_tplg_channel_map_template { + int num_channels; /*!< number of channel mappings */ + struct snd_tplg_channel_elem channel[SND_TPLG_MAX_CHAN]; /*!< mapping */ +}; + +/** \struct snd_tplg_pdata_template + * \brief Template type for private data objects. + */ +struct snd_tplg_pdata_template { + unsigned int length; /*!< data length */ + const void *data; /*!< data */ +}; + +/** \struct snd_tplg_io_ops_template + * \brief Template type for object operations mapping. + */ +struct snd_tplg_io_ops_template { + int get; /*!< get callback ID */ + int put; /*!< put callback ID */ + int info; /*!< info callback ID */ +}; + +/** \struct snd_tplg_ctl_template + * \brief Template type for control objects. + */ +struct snd_tplg_ctl_template { + int type; /*!< Control type */ + const char *name; /*!< Control name */ + int access; /*!< Control access */ + struct snd_tplg_io_ops_template ops; /*!< operations */ + struct snd_tplg_tlv_template *tlv; /*!< non NULL means we have TLV data */ +}; + +/** \struct snd_tplg_mixer_template + * \brief Template type for mixer control objects. + */ +struct snd_tplg_mixer_template { + struct snd_tplg_ctl_template hdr; /*!< control type header */ + struct snd_tplg_channel_map_template *map; /*!< channel map */ + int min; /*!< min value for mixer */ + int max; /*!< max value for mixer */ + int platform_max; /*!< max value for platform control */ + int invert; /*!< whether controls bits are inverted */ + struct snd_soc_tplg_private *priv; /*!< control private data */ +}; + +/** \struct snd_tplg_enum_template + * \brief Template type for enumerated control objects. + */ +struct snd_tplg_enum_template { + struct snd_tplg_ctl_template hdr; /*!< control type header */ + struct snd_tplg_channel_map_template *map; /*!< channel map */ + int items; /*!< number of enumerated items in control */ + int mask; /*!< register mask size */ + const char **texts; /*!< control text items */ + const int **values; /*!< control value items */ + struct snd_soc_tplg_private *priv; /*!< control private data */ +}; + +/** \struct snd_tplg_bytes_template + * \brief Template type for TLV Scale objects. + */ +struct snd_tplg_bytes_template { + struct snd_tplg_ctl_template hdr; /*!< control type header */ + int max; /*!< max byte control value */ + int mask; /*!< byte control mask */ + int base; /*!< base register */ + int num_regs; /*!< number of registers */ + struct snd_tplg_io_ops_template ext_ops; /*!< ops mapping */ + struct snd_soc_tplg_private *priv; /*!< control private data */ +}; + +/** \struct snd_tplg_graph_elem + * \brief Template type for single DAPM graph element. + */ +struct snd_tplg_graph_elem { + const char *src; /*!< source widget name */ + const char *ctl; /*!< control name or NULL if no control */ + const char *sink; /*!< sink widget name */ +}; + +/** \struct snd_tplg_graph_template + * \brief Template type for array of DAPM graph elements. + */ +struct snd_tplg_graph_template { + int count; /*!< Number of graph elements */ + struct snd_tplg_graph_elem elem[0]; /*!< graph elements */ +}; + +/** \struct snd_tplg_widget_template + * \brief Template type for DAPM widget objects. + */ +struct snd_tplg_widget_template { + int id; /*!< SND_SOC_DAPM_CTL */ + const char *name; /*!< widget name */ + const char *sname; /*!< stream name (certain widgets only) */ + int reg; /*!< negative reg = no direct dapm */ + int shift; /*!< bits to shift */ + int mask; /*!< non-shifted mask */ + int subseq; /*!< sort within widget type */ + unsigned int invert; /*!< invert the power bit */ + unsigned int ignore_suspend; /*!< kept enabled over suspend */ + unsigned short event_flags; /*!< PM event sequence flags */ + unsigned short event_type; /*!< PM event sequence type */ + struct snd_soc_tplg_private *priv; /*!< widget private data */ + int num_ctls; /*!< Number of controls used by widget */ + struct snd_tplg_ctl_template *ctl[0]; /*!< array of widget controls */ +}; + +/** \struct snd_tplg_obj_template + * \brief Generic Template Object + */ +typedef struct snd_tplg_obj_template { + enum snd_tplg_type type; /*!< template object type */ + int index; /*!< group index for object */ + int version; /*!< optional vendor specific version details */ + int vendor_type; /*!< optional vendor specific type info */ + union { + struct snd_tplg_widget_template *widget; /*!< DAPM widget */ + struct snd_tplg_mixer_template *mixer; /*!< Mixer control */ + struct snd_tplg_bytes_template *bytes_ctl; /*!< Bytes control */ + struct snd_tplg_enum_template *enum_ctl; /*!< Enum control */ + struct snd_tplg_graph_template *graph; /*!< Graph elements */ + }; +} snd_tplg_obj_template_t; /* \} */ #ifdef __cplusplus diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h index 3982cc70dce5..ec6304599538 100644 --- a/src/topology/tplg_local.h +++ b/src/topology/tplg_local.h @@ -39,24 +39,6 @@ struct tplg_ref; struct tplg_elem; -/** Topology object types */ -enum snd_tplg_type { - SND_TPLG_TYPE_TLV = 0, /*!< TLV Data */ - SND_TPLG_TYPE_MIXER, /*!< Mixer control*/ - SND_TPLG_TYPE_ENUM, /*!< Enumerated control */ - SND_TPLG_TYPE_TEXT, /*!< Text data */ - SND_TPLG_TYPE_DATA, /*!< Private data */ - SND_TPLG_TYPE_BYTES, /*!< Byte control */ - SND_TPLG_TYPE_STREAM_CONFIG, /*!< PCM Stream configuration */ - SND_TPLG_TYPE_STREAM_CAPS, /*!< PCM Stream capabilities */ - SND_TPLG_TYPE_PCM, /*!< PCM stream device */ - SND_TPLG_TYPE_DAPM_WIDGET, /*!< DAPM widget */ - SND_TPLG_TYPE_DAPM_GRAPH, /*!< DAPM graph elements */ - SND_TPLG_TYPE_BE, /*!< BE DAI link */ - SND_TPLG_TYPE_CC, /*!< Hostless codec <-> codec link */ - SND_TPLG_TYPE_MANIFEST, /*!< Topology manifest */ -}; - struct snd_tplg { /* opaque vendor data */ -- 2.5.3 ++++++ 0060-topology-A-API-calls-to-directly-build-topology-data.patch ++++++ ++++ 732 lines (skipped) ++++++ 0061-pcm-Fix-doxygen-for-two-enums.patch ++++++ >From 3313f8740d936b1dbc6391ce3227ba467c6f603d Mon Sep 17 00:00:00 2001 From: David Henningsson <[email protected]> Date: Mon, 24 Aug 2015 20:37:29 +0200 Subject: [PATCH] pcm: Fix doxygen for two enums The doxygen comments were wrong, making doxygen output weird. Signed-off-by: David Henningsson <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/pcm.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/pcm.h b/include/pcm.h index a1d14a989a47..0be1a321adba 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -324,9 +324,9 @@ typedef enum _snd_pcm_tstamp { } snd_pcm_tstamp_t; typedef enum _snd_pcm_tstamp_type { - SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0, /** gettimeofday equivalent */ - SND_PCM_TSTAMP_TYPE_MONOTONIC, /** posix_clock_monotonic equivalent */ - SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW, /** monotonic_raw (no NTP) */ + SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0, /**< gettimeofday equivalent */ + SND_PCM_TSTAMP_TYPE_MONOTONIC, /**< posix_clock_monotonic equivalent */ + SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW, /**< monotonic_raw (no NTP) */ SND_PCM_TSTAMP_TYPE_LAST = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW, } snd_pcm_tstamp_type_t; @@ -527,11 +527,11 @@ int snd_pcm_unlink(snd_pcm_t *pcm); /** channel map list type */ enum snd_pcm_chmap_type { - SND_CHMAP_TYPE_NONE = 0,/** unspecified channel position */ - SND_CHMAP_TYPE_FIXED, /** fixed channel position */ - SND_CHMAP_TYPE_VAR, /** freely swappable channel position */ - SND_CHMAP_TYPE_PAIRED, /** pair-wise swappable channel position */ - SND_CHMAP_TYPE_LAST = SND_CHMAP_TYPE_PAIRED, /** last entry */ + SND_CHMAP_TYPE_NONE = 0,/**< unspecified channel position */ + SND_CHMAP_TYPE_FIXED, /**< fixed channel position */ + SND_CHMAP_TYPE_VAR, /**< freely swappable channel position */ + SND_CHMAP_TYPE_PAIRED, /**< pair-wise swappable channel position */ + SND_CHMAP_TYPE_LAST = SND_CHMAP_TYPE_PAIRED, /**< last entry */ }; /** channel positions */ -- 2.5.3 ++++++ 0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch ++++++ >From fe8bb1fe02f9c7b7cb6048a17a8ff1ea30f97fc8 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 20:57:47 +0200 Subject: [PATCH] pcm: ioplug,extplug: Fix logic errors in type checks A few error checks are wrongly performed with logical and (&&) instead of logical or (||), which condition never met. Reported-by: David Binderman <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_extplug.c | 8 ++++---- src/pcm/pcm_ioplug.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pcm/pcm_extplug.c b/src/pcm/pcm_extplug.c index a5de6d848e21..a04f826c90a0 100644 --- a/src/pcm/pcm_extplug.c +++ b/src/pcm/pcm_extplug.c @@ -766,7 +766,7 @@ void snd_pcm_extplug_params_reset(snd_pcm_extplug_t *extplug) int snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t *extplug, int type, unsigned int num_list, const unsigned int *list) { extplug_priv_t *ext = extplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) { SNDERR("EXTPLUG: invalid parameter type %d", type); return -EINVAL; } @@ -788,7 +788,7 @@ int snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t *extplug, int type, u int snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max) { extplug_priv_t *ext = extplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) { SNDERR("EXTPLUG: invalid parameter type %d", type); return -EINVAL; } @@ -814,7 +814,7 @@ int snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int type, int snd_pcm_extplug_set_param_list(snd_pcm_extplug_t *extplug, int type, unsigned int num_list, const unsigned int *list) { extplug_priv_t *ext = extplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) { SNDERR("EXTPLUG: invalid parameter type %d", type); return -EINVAL; } @@ -836,7 +836,7 @@ int snd_pcm_extplug_set_param_list(snd_pcm_extplug_t *extplug, int type, unsigne int snd_pcm_extplug_set_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max) { extplug_priv_t *ext = extplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) { SNDERR("EXTPLUG: invalid parameter type %d", type); return -EINVAL; } diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c index fe9347c835d5..43550c03875b 100644 --- a/src/pcm/pcm_ioplug.c +++ b/src/pcm/pcm_ioplug.c @@ -1019,7 +1019,7 @@ void snd_pcm_ioplug_params_reset(snd_pcm_ioplug_t *ioplug) int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *ioplug, int type, unsigned int num_list, const unsigned int *list) { ioplug_priv_t *io = ioplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_IOPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_IOPLUG_HW_PARAMS) { SNDERR("IOPLUG: invalid parameter type %d", type); return -EINVAL; } @@ -1043,7 +1043,7 @@ int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *ioplug, int type, unsigned i int snd_pcm_ioplug_set_param_minmax(snd_pcm_ioplug_t *ioplug, int type, unsigned int min, unsigned int max) { ioplug_priv_t *io = ioplug->pcm->private_data; - if (type < 0 && type >= SND_PCM_IOPLUG_HW_PARAMS) { + if (type < 0 || type >= SND_PCM_IOPLUG_HW_PARAMS) { SNDERR("IOPLUG: invalid parameter type %d", type); return -EINVAL; } -- 2.5.3 ++++++ 0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch ++++++ >From 03d6b15291e3534afb72c5aa36495a932ef0cc6a Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 21:48:17 +0200 Subject: [PATCH] pcm: route: Remove bogus ! in snd_config_get_id() checks There are strange "!" added before snd_config_get_id() return value checks in a couple of places in pcm_route.c. This essentially makes the result always positive, making checks bogus. Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_route.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c index 2a437e88b93c..646517d2a9d2 100644 --- a/src/pcm/pcm_route.c +++ b/src/pcm/pcm_route.c @@ -770,7 +770,7 @@ static int determine_chmap(snd_config_t *tt, snd_pcm_chmap_t **tt_chmap) snd_config_iterator_t j, jnext; snd_config_t *in = snd_config_iterator_entry(i); - if (!snd_config_get_id(in, &id) < 0) + if (snd_config_get_id(in, &id) < 0) continue; if (snd_config_get_type(in) != SND_CONFIG_TYPE_COMPOUND) goto err; @@ -1070,7 +1070,7 @@ static int _snd_pcm_route_determine_ttable(snd_config_t *tt, snd_config_iterator_t j, jnext; long cchannel; const char *id; - if (!snd_config_get_id(in, &id) < 0) + if (snd_config_get_id(in, &id) < 0) continue; err = safe_strtol(id, &cchannel); if (err < 0) { -- 2.5.3 ++++++ 0064-topology-builder-Fix-possibly-uninitialized-variable.patch ++++++ >From 76b9cae026bf73a00ccf3ec8833ec56f0e64f451 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 22:04:48 +0200 Subject: [PATCH] topology: builder: Fix possibly uninitialized variable in write_elem_block() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an empty list is passed to write_elem_block(), it may leave vendor_type uninitialized. builder.c: In function ‘write_elem_block’: builder.c:127:8: warning: ‘vendor_type’ may be used uninitialized in this function [-Wmaybe-uninitialized] ret = write_block_header(tplg, tplg_type, vendor_type, ^ builder.c:114:33: note: ‘vendor_type’ was declared here int ret, wsize = 0, count = 0, vendor_type; ^ Add an immediate return for count = 0 for avoiding it, and simplify the code initializing vendor_type without using a one-shot loop. Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/builder.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/topology/builder.c b/src/topology/builder.c index 3bccd44827cc..91412aadd098 100644 --- a/src/topology/builder.c +++ b/src/topology/builder.c @@ -116,13 +116,12 @@ static int write_elem_block(snd_tplg_t *tplg, /* count number of elements */ list_for_each(pos, base) count++; + if (!count) + return 0; /* write the header for this block */ - list_for_each(pos, base) { - elem = list_entry(pos, struct tplg_elem, list); - vendor_type = elem->vendor_type; - break; - } + elem = list_entry(base->next, struct tplg_elem, list); + vendor_type = elem->vendor_type; ret = write_block_header(tplg, tplg_type, vendor_type, SND_SOC_TPLG_ABI_VERSION, 0, size, count); -- 2.5.3 ++++++ 0065-topology-ctl-Fix-access-type-checks.patch ++++++ >From f41fe763e9bc80783bf1471141ac06d514ffaef3 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 22:09:44 +0200 Subject: [PATCH] topology: ctl: Fix access type checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the wrong bit-and check by adding parentheses properly: ctl.c: In function ‘tplg_add_bytes’: ctl.c:868:22: warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses] if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE ^ Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/ctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topology/ctl.c b/src/topology/ctl.c index 68c4ce5803d1..7d8787f347b8 100644 --- a/src/topology/ctl.c +++ b/src/topology/ctl.c @@ -865,7 +865,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl, /* check on TLV bytes control */ if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { - if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE + 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", be->hdr.access); -- 2.5.3 ++++++ 0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch ++++++ >From 5b21400c42877ff6c2a386c7c5ed5c6c6c9bf664 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 22:11:48 +0200 Subject: [PATCH] topology: data: Fix wrong size check in tplg_parse_data_hex() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A wrong, uninitialized variable is referred as the size to check in tplg_parse_data_hex(). Spotted by gcc warning: data.c: In function ‘tplg_parse_data_hex’: data.c:228:5: warning: ‘esize’ may be used uninitialized in this function [-Wmaybe-uninitialized] if (esize > TPLG_MAX_PRIV_SIZE) { ^ data.c:211:12: note: ‘esize’ was declared here int size, esize, off, num; ^ Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/data.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/topology/data.c b/src/topology/data.c index 4ee1f8a15f95..370c0faead36 100644 --- a/src/topology/data.c +++ b/src/topology/data.c @@ -225,8 +225,8 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem, size = num * width; priv = elem->data; - if (esize > TPLG_MAX_PRIV_SIZE) { - SNDERR("error: data too big %d\n", esize); + if (size > TPLG_MAX_PRIV_SIZE) { + SNDERR("error: data too big %d\n", size); return -EINVAL; } -- 2.5.3 ++++++ 0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch ++++++ >From e38b13f128c743fe1f664e4491fdd0c880265da1 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 22:13:50 +0200 Subject: [PATCH] topology: parser: Add missing return value to snd_tplg_set_manifest_data() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spotted by gcc warning: parser.c: In function ‘snd_tplg_set_manifest_data’: parser.c:361:1: warning: control reaches end of non-void function [-Wreturn-type] } ^ Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/parser.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/topology/parser.c b/src/topology/parser.c index ca7de0689cea..44c6146b22f2 100644 --- a/src/topology/parser.c +++ b/src/topology/parser.c @@ -358,6 +358,7 @@ int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len) { tplg->manifest.priv.size = len; tplg->manifest_pdata = data; + return 0; } void snd_tplg_verbose(snd_tplg_t *tplg, int verbose) -- 2.5.3 ++++++ 0068-topology-pcm-Remove-unused-variables.patch ++++++ >From 9a2fe5399c6ff987fe4e23907c6467c3d2baa307 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 8 Sep 2015 22:15:02 +0200 Subject: [PATCH] topology: pcm: Remove unused variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix gcc warnings: pcm.c: In function ‘tplg_parse_stream_cfg’: pcm.c:160:6: warning: unused variable ‘ret’ [-Wunused-variable] int ret; ^ pcm.c: In function ‘split_format’: pcm.c:267:13: warning: unused variable ‘ret’ [-Wunused-variable] int i = 0, ret; ^ Signed-off-by: Takashi Iwai <[email protected]> --- src/topology/pcm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/topology/pcm.c b/src/topology/pcm.c index 6e42aa18b99b..18d5f0b1b040 100644 --- a/src/topology/pcm.c +++ b/src/topology/pcm.c @@ -157,7 +157,6 @@ static int tplg_parse_stream_cfg(snd_tplg_t *tplg ATTRIBUTE_UNUSED, struct snd_soc_tplg_stream *stream; const char *id, *val; snd_pcm_format_t format; - int ret; snd_config_get_id(cfg, &id); @@ -264,7 +263,7 @@ static int split_format(struct snd_soc_tplg_stream_caps *caps, char *str) { char *s = NULL; snd_pcm_format_t format; - int i = 0, ret; + int i = 0; s = strtok(str, ","); while ((s != NULL) && (i < SND_SOC_TPLG_MAX_FORMATS)) { -- 2.5.3 ++++++ 0069-build-Do-not-try-to-detect-cross-compiler.patch ++++++ >From c82417650a1ea4446c19dd82bfab9d8e6cd5a969 Mon Sep 17 00:00:00 2001 From: Khem Raj <[email protected]> Date: Tue, 15 Sep 2015 18:48:02 +0300 Subject: [PATCH] build: Do not try to detect cross-compiler cross compilers are passed via path may not be a gcc based cross compiler in such cases this check fails and try's to force gcc based cross compiler detection, This code is a convenience that limits the build system Signed-off-by: Khem Raj <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- configure.ac | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/configure.ac b/configure.ac index a482b3e7f6ca..a14e52de5e3b 100644 --- a/configure.ac +++ b/configure.ac @@ -27,20 +27,6 @@ AC_PREFIX_DEFAULT(/usr) dnl Checks for programs. -dnl try to gues cross-compiler if not set -if test "x$host" != "x$build" -a -z "`echo $CC | grep -e '-gcc'`"; -then - AC_MSG_CHECKING(for cross-compiler) - - which ${program_prefix}gcc >/dev/null 2>&1 && CC=${program_prefix}gcc - which ${host_cpu}-${host_os}-gcc >/dev/null 2>&1 \ - && CC=${host_cpu}-${host_os}-gcc - which ${host_cpu}-${host_vendor}-${host_os}-gcc >/dev/null 2>&1 \ - && CC=${host_cpu}-${host_vendor}-${host_os}-gcc - - AC_MSG_RESULT($CC) -fi - CFLAGS="$CFLAGS -D_GNU_SOURCE" -- 2.5.3 ++++++ 0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch ++++++ >From 8b0a5310bf3cb6ca1f7d70e3f4149b25b17b453a Mon Sep 17 00:00:00 2001 From: Mengdong Lin <[email protected]> Date: Wed, 16 Sep 2015 17:07:13 +0800 Subject: [PATCH] topology: Add API to set a vendor specific version number This vendor-specific version number is optional. It will be written to the 'version' field of each block header of the binary toplogy data file. The vendor driver can check this number for further processing in kernel. The topology ABI version number is still stored in the 'abi' field of block headers. Signed-off-by: Mengdong Lin <[email protected]> Reviewed-by: Liam Girdwood <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- include/topology.h | 8 ++++++++ src/topology/builder.c | 6 +++--- src/topology/parser.c | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/topology.h b/include/topology.h index 6ff8c5fb4609..9b84bd9331dc 100644 --- a/include/topology.h +++ b/include/topology.h @@ -690,6 +690,14 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile); */ int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len); +/** + * \brief Set an optional vendor specific version number. + * \param tplg Topology instance. + * \param version Vendor specific version number. + * \return Zero on success, otherwise a negative error code + */ +int snd_tplg_set_version(snd_tplg_t *tplg, unsigned int version); + /* \} */ #ifdef __cplusplus diff --git a/src/topology/builder.c b/src/topology/builder.c index 91412aadd098..8d57a8b719f7 100644 --- a/src/topology/builder.c +++ b/src/topology/builder.c @@ -89,7 +89,7 @@ static int write_data_block(snd_tplg_t *tplg, int size, int tplg_type, /* write the header for this block */ ret = write_block_header(tplg, tplg_type, 0, - SND_SOC_TPLG_ABI_VERSION, 0, size, 1); + tplg->version, 0, size, 1); if (ret < 0) { SNDERR("error: failed to write %s block %d\n", obj_name, ret); return ret; @@ -124,7 +124,7 @@ static int write_elem_block(snd_tplg_t *tplg, vendor_type = elem->vendor_type; ret = write_block_header(tplg, tplg_type, vendor_type, - SND_SOC_TPLG_ABI_VERSION, 0, size, count); + tplg->version, 0, size, count); if (ret < 0) { SNDERR("error: failed to write %s block %d\n", obj_name, ret); @@ -242,7 +242,7 @@ static int write_manifest_data(snd_tplg_t *tplg) /* write the header for this block */ ret = write_block_header(tplg, SND_SOC_TPLG_TYPE_MANIFEST, 0, - SND_SOC_TPLG_ABI_VERSION, 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); diff --git a/src/topology/parser.c b/src/topology/parser.c index 44c6146b22f2..6671055ae226 100644 --- a/src/topology/parser.c +++ b/src/topology/parser.c @@ -361,6 +361,13 @@ int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len) return 0; } +int snd_tplg_set_version(snd_tplg_t *tplg, unsigned int version) +{ + tplg->version = version; + + return 0; +} + void snd_tplg_verbose(snd_tplg_t *tplg, int verbose) { tplg->verbose = verbose; -- 2.5.3 ++++++ 0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch ++++++ >From f07e9af7eeebc950fd7bf4101a6af7f53ac741b6 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Fri, 2 Oct 2015 11:55:36 +0200 Subject: [PATCH] pcm: ladspa: Fix segfault due to a wrong channel reference Because of a typo in referencing the input array in snd_pcm_ladspa_allocate_memory(), ladpsa PCM plugin may cause a segfault at prepare when input and and output channels are different: #0 0x00007ffff78623ef in snd_pcm_ladspa_allocate_memory (pcm=0x626fa0, pcm=0x626fa0, pcm=0x626fa0, ladspa=0x621ad0) at pcm_ladspa.c:753 #1 snd_pcm_ladspa_init (pcm=0x626fa0) at pcm_ladspa.c:834 #2 0x00007ffff7842946 in snd_pcm_plugin_prepare (pcm=0x626fa0) at pcm_plugin.c:171 #3 0x00007ffff784290f in snd_pcm_plugin_prepare (pcm=0x62c760) at pcm_plugin.c:162 #4 0x000000000040256a in ?? () #5 0x00007ffff7222ec5 in __libc_start_main (main=0x401d80,a argc=4, argv=0x7fffffffde28, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde18) at libc-start.c:287 #6 0x0000000000402fdd in ?? () This patch corrects the wrong reference. Reported-and-tested-by: Andreas Hartmann <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_ladspa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pcm/pcm_ladspa.c b/src/pcm/pcm_ladspa.c index 631ee0f35b73..6552b4379ec0 100644 --- a/src/pcm/pcm_ladspa.c +++ b/src/pcm/pcm_ladspa.c @@ -749,7 +749,7 @@ static int snd_pcm_ladspa_allocate_memory(snd_pcm_t *pcm, snd_pcm_ladspa_t *lads return -ENOMEM; } for (idx = 0; idx < instance->input.channels.size; idx++) { - chn = instance->output.channels.array[idx]; + chn = instance->input.channels.array[idx]; if (pchannels[chn] == NULL && chn < ichannels) { instance->input.data[idx] = NULL; continue; -- 2.5.3
