87f2283286
- Backport upstream fixes: A couple of USB-audio config addition/fix, dmix PCM stop fix, a memory leak fix, DSD format endianess fix, PCM timestamp fixes, etc. 0050-USB-Audio-Add-Scarlett-2i4-USB-to-S-PDIF-blacklist.patch 0051-snd_user_file-fix-memory-leak.patch 0052-pcm-dmix-Don-t-ignore-SND_TIMER_EVENT_MSTOP.patch 0053-snd_dlsym-only-do-versioning-checks-if-built-with-ve.patch 0054-dlmisc-Remove-unused-label.patch 0055-USB-audio-Add-five-more-cards-to-IEC958-blacklist.patch 0056-pcm-Fix-DSD-sample-format-endianess-and-add-big-endi.patch 0057-mixer-Fix-inclusion-of-config.h.patch 0058-mixer-Fix-unused-parameter-warnings.patch 0059-ucm-Fix-uninitialized-err-in-snd_use_case_set.patch 0060-pcm-Fix-assorted-tstamp_type-bugs-omissions.patch OBS-URL: https://build.opensuse.org/request/show/264171 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=174
167 lines
6.5 KiB
Diff
167 lines
6.5 KiB
Diff
From b14c49ab3d09f0e678209216a5e38934d904da3d Mon Sep 17 00:00:00 2001
|
|
From: Jussi Laako <jussi@sonarnerd.net>
|
|
Date: Fri, 21 Nov 2014 16:04:47 +0200
|
|
Subject: [PATCH 56/60] pcm: Fix DSD sample format endianess and add big-endian
|
|
format
|
|
|
|
This patch adds big-endian DSD sample format and fixes return value of DSD
|
|
formats for snd_pcm_format_little_endian().
|
|
|
|
Signed-off-by: Jussi Laako <jussi@sonarnerd.net>
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
include/pcm.h | 6 +++++-
|
|
include/sound/asound.h | 4 +++-
|
|
src/pcm/pcm.c | 4 ++++
|
|
src/pcm/pcm_misc.c | 17 ++++++++++++++---
|
|
4 files changed, 26 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/include/pcm.h b/include/pcm.h
|
|
index db88ad5ee41a..0655e7f43ef6 100644
|
|
--- a/include/pcm.h
|
|
+++ b/include/pcm.h
|
|
@@ -213,7 +213,11 @@ typedef enum _snd_pcm_format {
|
|
SND_PCM_FORMAT_DSD_U16_LE,
|
|
/* Direct Stream Digital (DSD) in 4-byte samples (x32) */
|
|
SND_PCM_FORMAT_DSD_U32_LE,
|
|
- SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_DSD_U32_LE,
|
|
+ /* Direct Stream Digital (DSD) in 2-byte samples (x16) */
|
|
+ SND_PCM_FORMAT_DSD_U16_BE,
|
|
+ /* Direct Stream Digital (DSD) in 4-byte samples (x32) */
|
|
+ SND_PCM_FORMAT_DSD_U32_BE,
|
|
+ SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_DSD_U32_BE,
|
|
|
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
/** Signed 16 bit CPU endian */
|
|
diff --git a/include/sound/asound.h b/include/sound/asound.h
|
|
index 6ee586728df9..941d32f007dc 100644
|
|
--- a/include/sound/asound.h
|
|
+++ b/include/sound/asound.h
|
|
@@ -220,7 +220,9 @@ typedef int __bitwise snd_pcm_format_t;
|
|
#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_LAST SNDRV_PCM_FORMAT_DSD_U32_LE
|
|
+#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_LAST SNDRV_PCM_FORMAT_DSD_U32_BE
|
|
|
|
#ifdef SNDRV_LITTLE_ENDIAN
|
|
#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_LE
|
|
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
|
|
index 4a7be6c1a55f..39042566ae32 100644
|
|
--- a/src/pcm/pcm.c
|
|
+++ b/src/pcm/pcm.c
|
|
@@ -1566,6 +1566,8 @@ static const char *const snd_pcm_format_names[] = {
|
|
FORMAT(DSD_U8),
|
|
FORMAT(DSD_U16_LE),
|
|
FORMAT(DSD_U32_LE),
|
|
+ FORMAT(DSD_U16_BE),
|
|
+ FORMAT(DSD_U32_BE),
|
|
};
|
|
|
|
static const char *const snd_pcm_format_aliases[SND_PCM_FORMAT_LAST+1] = {
|
|
@@ -1626,6 +1628,8 @@ static const char *const snd_pcm_format_descriptions[] = {
|
|
FORMATD(DSD_U8, "Direct Stream Digital, 1-byte (x8), oldest bit in MSB"),
|
|
FORMATD(DSD_U16_LE, "Direct Stream Digital, 2-byte (x16), little endian, oldest bits in MSB"),
|
|
FORMATD(DSD_U32_LE, "Direct Stream Digital, 4-byte (x32), little endian, oldest bits in MSB"),
|
|
+ FORMATD(DSD_U16_BE, "Direct Stream Digital, 2-byte (x16), big endian, oldest bits in MSB"),
|
|
+ FORMATD(DSD_U32_BE, "Direct Stream Digital, 4-byte (x32), big endian, oldest bits in MSB"),
|
|
};
|
|
|
|
static const char *const snd_pcm_type_names[] = {
|
|
diff --git a/src/pcm/pcm_misc.c b/src/pcm/pcm_misc.c
|
|
index 92721796aa1f..5870f82c0b4c 100644
|
|
--- a/src/pcm/pcm_misc.c
|
|
+++ b/src/pcm/pcm_misc.c
|
|
@@ -65,6 +65,8 @@ int snd_pcm_format_signed(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_DSD_U8:
|
|
case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return 0;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -137,6 +139,8 @@ int snd_pcm_format_little_endian(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_U24_3LE:
|
|
case SNDRV_PCM_FORMAT_U20_3LE:
|
|
case SNDRV_PCM_FORMAT_U18_3LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
return 1;
|
|
case SNDRV_PCM_FORMAT_S16_BE:
|
|
case SNDRV_PCM_FORMAT_U16_BE:
|
|
@@ -153,9 +157,8 @@ int snd_pcm_format_little_endian(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_U24_3BE:
|
|
case SNDRV_PCM_FORMAT_U20_3BE:
|
|
case SNDRV_PCM_FORMAT_U18_3BE:
|
|
- case SNDRV_PCM_FORMAT_DSD_U8:
|
|
- case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
- case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return 0;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -208,6 +211,7 @@ int snd_pcm_format_width(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_U16_LE:
|
|
case SNDRV_PCM_FORMAT_U16_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
return 16;
|
|
case SNDRV_PCM_FORMAT_S18_3LE:
|
|
case SNDRV_PCM_FORMAT_S18_3BE:
|
|
@@ -235,6 +239,7 @@ int snd_pcm_format_width(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_FLOAT_LE:
|
|
case SNDRV_PCM_FORMAT_FLOAT_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return 32;
|
|
case SNDRV_PCM_FORMAT_FLOAT64_LE:
|
|
case SNDRV_PCM_FORMAT_FLOAT64_BE:
|
|
@@ -269,6 +274,7 @@ int snd_pcm_format_physical_width(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_U16_LE:
|
|
case SNDRV_PCM_FORMAT_U16_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
return 16;
|
|
case SNDRV_PCM_FORMAT_S18_3LE:
|
|
case SNDRV_PCM_FORMAT_S18_3BE:
|
|
@@ -296,6 +302,7 @@ int snd_pcm_format_physical_width(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
|
|
case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return 32;
|
|
case SNDRV_PCM_FORMAT_FLOAT64_LE:
|
|
case SNDRV_PCM_FORMAT_FLOAT64_BE:
|
|
@@ -328,6 +335,7 @@ ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples)
|
|
case SNDRV_PCM_FORMAT_U16_LE:
|
|
case SNDRV_PCM_FORMAT_U16_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
return samples * 2;
|
|
case SNDRV_PCM_FORMAT_S18_3LE:
|
|
case SNDRV_PCM_FORMAT_S18_3BE:
|
|
@@ -353,6 +361,7 @@ ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples)
|
|
case SNDRV_PCM_FORMAT_FLOAT_LE:
|
|
case SNDRV_PCM_FORMAT_FLOAT_BE:
|
|
case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return samples * 4;
|
|
case SNDRV_PCM_FORMAT_FLOAT64_LE:
|
|
case SNDRV_PCM_FORMAT_FLOAT64_BE:
|
|
@@ -400,6 +409,8 @@ u_int64_t snd_pcm_format_silence_64(snd_pcm_format_t format)
|
|
case SNDRV_PCM_FORMAT_DSD_U8:
|
|
case SNDRV_PCM_FORMAT_DSD_U16_LE:
|
|
case SNDRV_PCM_FORMAT_DSD_U32_LE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U16_BE:
|
|
+ case SNDRV_PCM_FORMAT_DSD_U32_BE:
|
|
return 0x6969696969696969ULL;
|
|
#ifdef SNDRV_LITTLE_ENDIAN
|
|
case SNDRV_PCM_FORMAT_U16_LE:
|
|
--
|
|
2.1.3
|
|
|