Page MenuHomeFreeBSD

D47638.id149763.diff
No OneTemporary

D47638.id149763.diff

diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c
--- a/sys/dev/sound/pcm/channel.c
+++ b/sys/dev/sound/pcm/channel.c
@@ -973,9 +973,13 @@
#if BYTE_ORDER == LITTLE_ENDIAN
{ "s32le", "s32", "32", AFMT_S32_LE },
{ "s32be", NULL, NULL, AFMT_S32_BE },
+ { "f32le", "f32", NULL, AFMT_F32_LE },
+ { "f32be", NULL, NULL, AFMT_F32_BE },
#else
{ "s32le", NULL, NULL, AFMT_S32_LE },
{ "s32be", "s32", "32", AFMT_S32_BE },
+ { "f32le", NULL, NULL, AFMT_F32_LE },
+ { "f32be", "f32", NULL, AFMT_F32_BE },
#endif
{ "u32le", NULL, NULL, AFMT_U32_LE },
{ "u32be", NULL, NULL, AFMT_U32_BE },
diff --git a/sys/dev/sound/pcm/feeder_chain.c b/sys/dev/sound/pcm/feeder_chain.c
--- a/sys/dev/sound/pcm/feeder_chain.c
+++ b/sys/dev/sound/pcm/feeder_chain.c
@@ -102,6 +102,7 @@
AFMT_S16_LE, AFMT_S16_BE, AFMT_U16_LE, AFMT_U16_BE,
AFMT_S24_LE, AFMT_S24_BE, AFMT_U24_LE, AFMT_U24_BE,
AFMT_S32_LE, AFMT_S32_BE, AFMT_U32_LE, AFMT_U32_BE,
+ AFMT_F32_LE, AFMT_F32_BE,
0
};
@@ -111,6 +112,7 @@
AFMT_S16_LE, AFMT_S16_BE, AFMT_U16_LE, AFMT_U16_BE,
AFMT_S24_LE, AFMT_S24_BE, AFMT_U24_LE, AFMT_U24_BE,
AFMT_S32_LE, AFMT_S32_BE, AFMT_U32_LE, AFMT_U32_BE,
+ AFMT_F32_LE, AFMT_F32_BE,
0
};
diff --git a/sys/dev/sound/pcm/feeder_mixer.c b/sys/dev/sound/pcm/feeder_mixer.c
--- a/sys/dev/sound/pcm/feeder_mixer.c
+++ b/sys/dev/sound/pcm/feeder_mixer.c
@@ -72,10 +72,12 @@
#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
FEEDMIXER_DECLARE(S, 16, LE)
FEEDMIXER_DECLARE(S, 32, LE)
+FEEDMIXER_DECLARE(F, 32, LE)
#endif
#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
FEEDMIXER_DECLARE(S, 16, BE)
FEEDMIXER_DECLARE(S, 32, BE)
+FEEDMIXER_DECLARE(F, 32, BE)
#endif
#ifdef SND_FEEDER_MULTIFORMAT
FEEDMIXER_DECLARE(S, 8, NE)
@@ -107,10 +109,12 @@
#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
FEEDMIXER_ENTRY(S, 16, LE),
FEEDMIXER_ENTRY(S, 32, LE),
+ FEEDMIXER_ENTRY(F, 32, LE),
#endif
#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
FEEDMIXER_ENTRY(S, 16, BE),
FEEDMIXER_ENTRY(S, 32, BE),
+ FEEDMIXER_ENTRY(F, 32, BE),
#endif
#ifdef SND_FEEDER_MULTIFORMAT
FEEDMIXER_ENTRY(S, 24, LE),
diff --git a/sys/dev/sound/pcm/feeder_rate.c b/sys/dev/sound/pcm/feeder_rate.c
--- a/sys/dev/sound/pcm/feeder_rate.c
+++ b/sys/dev/sound/pcm/feeder_rate.c
@@ -643,6 +643,8 @@
Z_DECLARE(U, 16, BE)
Z_DECLARE(U, 24, BE)
Z_DECLARE(U, 32, BE)
+Z_DECLARE(F, 32, LE)
+Z_DECLARE(F, 32, BE)
#endif
enum {
@@ -691,6 +693,8 @@
Z_RESAMPLER_ENTRY(U, 16, BE),
Z_RESAMPLER_ENTRY(U, 24, BE),
Z_RESAMPLER_ENTRY(U, 32, BE),
+ Z_RESAMPLER_ENTRY(F, 32, LE),
+ Z_RESAMPLER_ENTRY(F, 32, BE),
#endif
};
diff --git a/sys/dev/sound/pcm/feeder_volume.c b/sys/dev/sound/pcm/feeder_volume.c
--- a/sys/dev/sound/pcm/feeder_volume.c
+++ b/sys/dev/sound/pcm/feeder_volume.c
@@ -91,6 +91,8 @@
FEEDVOLUME_DECLARE(U, 16, BE)
FEEDVOLUME_DECLARE(U, 24, BE)
FEEDVOLUME_DECLARE(U, 32, BE)
+FEEDVOLUME_DECLARE(F, 32, LE)
+FEEDVOLUME_DECLARE(F, 32, BE)
#endif
struct feed_volume_info {
diff --git a/sys/dev/sound/pcm/pcm.h b/sys/dev/sound/pcm/pcm.h
--- a/sys/dev/sound/pcm/pcm.h
+++ b/sys/dev/sound/pcm/pcm.h
@@ -124,6 +124,8 @@
static __always_inline __unused intpcm_t
pcm_sample_read(const uint8_t *src, uint32_t fmt)
{
+ uint8_t *tmp;
+ float fv;
intpcm_t v;
fmt = AFMT_ENCODING(fmt);
@@ -186,12 +188,33 @@
v = INTPCM_T(src[3] | src[2] << 8 | src[1] << 16 |
(int8_t)(src[0] ^ 0x80) << 24);
break;
+ case AFMT_F32_LE: /* FALLTHROUGH */
+ case AFMT_F32_BE:
+#ifdef _KERNEL
+ fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);
+#endif
+ v = *__DECONST(int32_t *, src);
+ memcpy(&fv, &v, sizeof(fv));
+ v = INTPCM_T(fv * (float)PCM_S32_MAX);
+ tmp = (uint8_t *)&v;
+ if (fmt == AFMT_F32_LE) {
+ v = INTPCM_T(tmp[0] | tmp[1] << 8 | tmp[2] << 16 |
+ (int8_t)tmp[3] << 24);
+ } else {
+ v = INTPCM_T(tmp[3] | tmp[2] << 8 | tmp[1] << 16 |
+ (int8_t)tmp[0] << 24);
+ }
+#ifdef _KERNEL
+ fpu_kern_leave(curthread, NULL);
+#endif
+ break;
default:
v = 0;
printf("%s(): unknown format: 0x%08x\n", __func__, fmt);
__assert_unreachable();
}
+
return (v);
}
@@ -291,13 +314,15 @@
dst[1] = v >> 8;
dst[0] = (v >> 16) ^ 0x80;
break;
- case AFMT_S32_LE:
+ case AFMT_S32_LE: /* FALLTHROUGH */
+ case AFMT_F32_LE:
dst[0] = v;
dst[1] = v >> 8;
dst[2] = v >> 16;
dst[3] = v >> 24;
break;
- case AFMT_S32_BE:
+ case AFMT_S32_BE: /* FALLTHROUGH */
+ case AFMT_F32_BE:
dst[3] = v;
dst[2] = v >> 8;
dst[1] = v >> 16;
@@ -319,6 +344,16 @@
printf("%s(): unknown format: 0x%08x\n", __func__, fmt);
__assert_unreachable();
}
+
+ if (fmt & (AFMT_F32_LE | AFMT_F32_BE)) {
+#ifdef _KERNEL
+ fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);
+#endif
+ *(float *)dst = *(int32_t *)dst / (float)PCM_S32_MAX;
+#ifdef _KERNEL
+ fpu_kern_leave(curthread, NULL);
+#endif
+ }
}
/*
diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h
--- a/sys/dev/sound/pcm/sound.h
+++ b/sys/dev/sound/pcm/sound.h
@@ -444,15 +444,17 @@
#endif /* _KERNEL */
/* make figuring out what a format is easier. got AFMT_STEREO already */
-#define AFMT_32BIT (AFMT_S32_LE | AFMT_S32_BE | AFMT_U32_LE | AFMT_U32_BE)
+#define AFMT_32BIT (AFMT_S32_LE | AFMT_S32_BE | AFMT_U32_LE | AFMT_U32_BE | \
+ AFMT_F32_LE | AFMT_F32_BE)
#define AFMT_24BIT (AFMT_S24_LE | AFMT_S24_BE | AFMT_U24_LE | AFMT_U24_BE)
#define AFMT_16BIT (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE)
#define AFMT_G711 (AFMT_MU_LAW | AFMT_A_LAW)
#define AFMT_8BIT (AFMT_G711 | AFMT_U8 | AFMT_S8)
-#define AFMT_SIGNED (AFMT_S32_LE | AFMT_S32_BE | AFMT_S24_LE | AFMT_S24_BE | \
+#define AFMT_SIGNED (AFMT_S32_LE | AFMT_S32_BE | AFMT_F32_LE | AFMT_F32_BE | \
+ AFMT_S24_LE | AFMT_S24_BE | \
AFMT_S16_LE | AFMT_S16_BE | AFMT_S8)
-#define AFMT_BIGENDIAN (AFMT_S32_BE | AFMT_U32_BE | AFMT_S24_BE | AFMT_U24_BE | \
- AFMT_S16_BE | AFMT_U16_BE)
+#define AFMT_BIGENDIAN (AFMT_S32_BE | AFMT_U32_BE | AFMT_F32_BE | \
+ AFMT_S24_BE | AFMT_U24_BE | AFMT_S16_BE | AFMT_U16_BE)
#define AFMT_CONVERTIBLE (AFMT_8BIT | AFMT_16BIT | AFMT_24BIT | \
AFMT_32BIT)
@@ -502,7 +504,8 @@
#define AFMT_U8_NE AFMT_U8
#define AFMT_S8_NE AFMT_S8
-#define AFMT_SIGNED_NE (AFMT_S8_NE | AFMT_S16_NE | AFMT_S24_NE | AFMT_S32_NE)
+#define AFMT_SIGNED_NE (AFMT_S8_NE | AFMT_S16_NE | AFMT_S24_NE | \
+ AFMT_S32_NE | AFMT_F32_NE)
#define AFMT_NE (AFMT_SIGNED_NE | AFMT_U8_NE | AFMT_U16_NE | \
AFMT_U24_NE | AFMT_U32_NE)
diff --git a/sys/sys/soundcard.h b/sys/sys/soundcard.h
--- a/sys/sys/soundcard.h
+++ b/sys/sys/soundcard.h
@@ -184,6 +184,8 @@
#define AFMT_S24_BE 0x00020000 /* Big endian signed 24-bit */
#define AFMT_U24_LE 0x00040000 /* Little endian unsigned 24-bit */
#define AFMT_U24_BE 0x00080000 /* Big endian unsigned 24-bit */
+#define AFMT_F32_LE 0x10000000 /* Little endian 32-bit floating point */
+#define AFMT_F32_BE 0x20000000 /* Big endian 32-bit floating point */
/* Machine dependent AFMT_* definitions. */
#if BYTE_ORDER == LITTLE_ENDIAN
@@ -199,6 +201,8 @@
#define AFMT_U16_OE AFMT_U16_BE
#define AFMT_U24_OE AFMT_U24_BE
#define AFMT_U32_OE AFMT_U32_BE
+#define AFMT_F32_NE AFMT_F32_LE
+#define AFMT_F32_OE AFMT_F32_BE
#else
#define AFMT_S16_OE AFMT_S16_LE
#define AFMT_S24_OE AFMT_S24_LE
@@ -212,8 +216,12 @@
#define AFMT_U16_NE AFMT_U16_BE
#define AFMT_U24_NE AFMT_U24_BE
#define AFMT_U32_NE AFMT_U32_BE
+#define AFMT_F32_NE AFMT_F32_BE
+#define AFMT_F32_OE AFMT_F32_LE
#endif
+#define AFMT_FLOAT AFMT_F32_NE /* compatibility alias */
+
#define AFMT_STEREO 0x10000000 /* can do/want stereo */
/*
diff --git a/tests/sys/sound/pcm_read_write.c b/tests/sys/sound/pcm_read_write.c
--- a/tests/sys/sound/pcm_read_write.c
+++ b/tests/sys/sound/pcm_read_write.c
@@ -70,6 +70,12 @@
{"u32be_1", {0x01, 0x02, 0x03, 0x04}, 4, AFMT_U32_BE, 0x81020304},
{"u32be_2", {0x81, 0x82, 0x83, 0x84}, 4, AFMT_U32_BE, 0x01828384},
+ /* 32 bit floating point sample formats. */
+ {"f32le_1", {0x00, 0x00, 0x00, 0x3f}, 4, AFMT_F32_LE, 0x40000000},
+ {"f32le_2", {0x00, 0x00, 0x00, 0xbf}, 4, AFMT_F32_LE, 0xc0000000},
+ {"f32be_1", {0x00, 0x00, 0x00, 0x3f}, 4, AFMT_F32_BE, 0x00000040},
+ {"f32be_2", {0x00, 0x00, 0x00, 0xbf}, 4, AFMT_F32_BE, 0x000000c0},
+
/* u-law and A-law sample formats. */
{"mulaw_1", {0x01, 0x00, 0x00, 0x00}, 1, AFMT_MU_LAW, 0xffffff87},
{"mulaw_2", {0x81, 0x00, 0x00, 0x00}, 1, AFMT_MU_LAW, 0x00000079},

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 13, 12:54 AM (19 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16619845
Default Alt Text
D47638.id149763.diff (8 KB)

Event Timeline