SND_PCM_FORMAT_MPEG,
/** GSM */
SND_PCM_FORMAT_GSM,
+ /** Signed 20bit Little Endian in 4bytes format, LSB justified */
+ SND_PCM_FORMAT_S20_LE,
+ /** Signed 20bit Big Endian in 4bytes format, LSB justified */
+ SND_PCM_FORMAT_S20_BE,
+ /** Unsigned 20bit Little Endian in 4bytes format, LSB justified */
+ SND_PCM_FORMAT_U20_LE,
+ /** Unsigned 20bit Big Endian in 4bytes format, LSB justified */
+ SND_PCM_FORMAT_U20_BE,
/** Special */
SND_PCM_FORMAT_SPECIAL = 31,
/** Signed 24bit Little Endian in 3bytes format */
/** Float 64 bit CPU endian */
SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_LE,
/** IEC-958 CPU Endian */
- SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_LE
+ SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
+ /** Signed 20bit in 4bytes format, LSB justified, CPU Endian */
+ SND_PCM_FORMAT_S20 = SND_PCM_FORMAT_S20_LE,
+ /** Unsigned 20bit in 4bytes format, LSB justified, CPU Endian */
+ SND_PCM_FORMAT_U20 = SND_PCM_FORMAT_U20_LE,
#elif __BYTE_ORDER == __BIG_ENDIAN
/** Signed 16 bit CPU endian */
SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_BE,
/** Float 64 bit CPU endian */
SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_BE,
/** IEC-958 CPU Endian */
- SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_BE
+ SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
+ /** Signed 20bit in 4bytes format, LSB justified, CPU Endian */
+ SND_PCM_FORMAT_S20 = SND_PCM_FORMAT_S20_BE,
+ /** Unsigned 20bit in 4bytes format, LSB justified, CPU Endian */
+ SND_PCM_FORMAT_U20 = SND_PCM_FORMAT_U20_BE,
#else
#error "Unknown endian"
#endif
case SNDRV_PCM_FORMAT_S8:
case SNDRV_PCM_FORMAT_S16_LE:
case SNDRV_PCM_FORMAT_S16_BE:
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_S20_BE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_BE:
case SNDRV_PCM_FORMAT_S32_LE:
case SNDRV_PCM_FORMAT_U8:
case SNDRV_PCM_FORMAT_U16_LE:
case SNDRV_PCM_FORMAT_U16_BE:
+ case SNDRV_PCM_FORMAT_U20_LE:
+ case SNDRV_PCM_FORMAT_U20_BE:
case SNDRV_PCM_FORMAT_U24_LE:
case SNDRV_PCM_FORMAT_U24_BE:
case SNDRV_PCM_FORMAT_U32_LE:
switch (format) {
case SNDRV_PCM_FORMAT_S16_LE:
case SNDRV_PCM_FORMAT_U16_LE:
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_U20_LE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_U24_LE:
case SNDRV_PCM_FORMAT_S32_LE:
return 1;
case SNDRV_PCM_FORMAT_S16_BE:
case SNDRV_PCM_FORMAT_U16_BE:
+ case SNDRV_PCM_FORMAT_S20_BE:
+ case SNDRV_PCM_FORMAT_U20_BE:
case SNDRV_PCM_FORMAT_S24_BE:
case SNDRV_PCM_FORMAT_U24_BE:
case SNDRV_PCM_FORMAT_S32_BE:
case SNDRV_PCM_FORMAT_U18_3LE:
case SNDRV_PCM_FORMAT_U18_3BE:
return 18;
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_S20_BE:
+ case SNDRV_PCM_FORMAT_U20_LE:
+ case SNDRV_PCM_FORMAT_U20_BE:
case SNDRV_PCM_FORMAT_S20_3LE:
case SNDRV_PCM_FORMAT_S20_3BE:
case SNDRV_PCM_FORMAT_U20_3LE:
case SNDRV_PCM_FORMAT_U24_3LE:
case SNDRV_PCM_FORMAT_U24_3BE:
return 24;
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_S20_BE:
+ case SNDRV_PCM_FORMAT_U20_LE:
+ case SNDRV_PCM_FORMAT_U20_BE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_BE:
case SNDRV_PCM_FORMAT_U24_LE:
case SNDRV_PCM_FORMAT_U24_3LE:
case SNDRV_PCM_FORMAT_U24_3BE:
return samples * 3;
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_S20_BE:
+ case SNDRV_PCM_FORMAT_U20_LE:
+ case SNDRV_PCM_FORMAT_U20_BE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_BE:
case SNDRV_PCM_FORMAT_U24_LE:
case SNDRV_PCM_FORMAT_S8:
case SNDRV_PCM_FORMAT_S16_LE:
case SNDRV_PCM_FORMAT_S16_BE:
+ case SNDRV_PCM_FORMAT_S20_LE:
+ case SNDRV_PCM_FORMAT_S20_BE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_BE:
case SNDRV_PCM_FORMAT_S32_LE:
#ifdef SNDRV_LITTLE_ENDIAN
case SNDRV_PCM_FORMAT_U16_LE:
return 0x8000800080008000ULL;
+ case SNDRV_PCM_FORMAT_U20_LE:
+ return 0x0008000000080000ULL;
case SNDRV_PCM_FORMAT_U24_LE:
return 0x0080000000800000ULL;
case SNDRV_PCM_FORMAT_U32_LE:
return 0x8000000080000000ULL;
case SNDRV_PCM_FORMAT_U16_BE:
return 0x0080008000800080ULL;
+ case SNDRV_PCM_FORMAT_U20_BE:
+ return 0x0000080000000800ULL;
case SNDRV_PCM_FORMAT_U24_BE:
return 0x0000800000008000ULL;
case SNDRV_PCM_FORMAT_U32_BE:
#else
case SNDRV_PCM_FORMAT_U16_LE:
return 0x0080008000800080ULL;
+ case SNDRV_PCM_FORMAT_U20_LE:
+ return 0x0000080000000800ULL;
case SNDRV_PCM_FORMAT_U24_LE:
return 0x0000800000008000ULL;
case SNDRV_PCM_FORMAT_U32_LE:
return 0x0000008000000080ULL;
case SNDRV_PCM_FORMAT_U16_BE:
return 0x8000800080008000ULL;
+ case SNDRV_PCM_FORMAT_U20_BE:
+ return 0x0008000000080000ULL;
case SNDRV_PCM_FORMAT_U24_BE:
return 0x0080000000800000ULL;
case SNDRV_PCM_FORMAT_U32_BE:
return 0;
}
-static const int linear_formats[4][2][2] = {
+static const int linear_formats[5][2][2] = {
{ { SNDRV_PCM_FORMAT_S8, SNDRV_PCM_FORMAT_S8 },
{ SNDRV_PCM_FORMAT_U8, SNDRV_PCM_FORMAT_U8 } },
{ { SNDRV_PCM_FORMAT_S16_LE, SNDRV_PCM_FORMAT_S16_BE },
{ SNDRV_PCM_FORMAT_U16_LE, SNDRV_PCM_FORMAT_U16_BE } },
+ { { SNDRV_PCM_FORMAT_S20_LE, SNDRV_PCM_FORMAT_S20_BE },
+ { SNDRV_PCM_FORMAT_U20_LE, SNDRV_PCM_FORMAT_U20_BE } },
{ { SNDRV_PCM_FORMAT_S24_LE, SNDRV_PCM_FORMAT_S24_BE },
{ SNDRV_PCM_FORMAT_U24_LE, SNDRV_PCM_FORMAT_U24_BE } },
{ { SNDRV_PCM_FORMAT_S32_LE, SNDRV_PCM_FORMAT_S32_BE },
case 16:
width = 1;
break;
- case 24:
+ case 20:
width = 2;
break;
- case 32:
+ case 24:
width = 3;
break;
+ case 32:
+ width = 4;
+ break;
default:
return SND_PCM_FORMAT_UNKNOWN;
}