annotate foosdk/sdk/pfc/audio_sample.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "audio_sample.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "primitives.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "byte_order.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 float audio_math::decodeFloat24ptr(const void* sourcePtr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 PFC_STATIC_ASSERT(pfc::byte_order_is_little_endian);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 union {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 uint8_t bytes[4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 float v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 } u;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 const uint8_t* s = reinterpret_cast<const uint8_t*>(sourcePtr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 u.bytes[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 u.bytes[1] = s[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 u.bytes[2] = s[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 u.bytes[3] = s[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 return u.v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 float audio_math::decodeFloat24ptrbs(const void* sourcePtr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 PFC_STATIC_ASSERT(pfc::byte_order_is_little_endian);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 union {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 uint8_t bytes[4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 float v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 } u;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 const uint8_t* s = reinterpret_cast<const uint8_t*>(sourcePtr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 u.bytes[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 u.bytes[1] = s[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 u.bytes[2] = s[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 u.bytes[3] = s[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 return u.v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 float audio_math::decodeFloat16(uint16_t source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 const unsigned fractionBits = 10;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 const unsigned widthBits = 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 typedef uint16_t source_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 /* typedef uint64_t out_t; typedef double retval_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 outExponent = 11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 outFraction = 52,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 outExponentShift = (1 << (outExponent-1))-1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 };*/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 typedef uint32_t out_t; typedef float retval_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 outExponent = 8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 outFraction = 23,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 outExponentShift = (1 << (outExponent - 1)) - 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 const unsigned exponentBits = widthBits - fractionBits - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 // 1 bit sign | exponent | fraction
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 source_t fraction = source & (((source_t)1 << fractionBits) - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 source >>= fractionBits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 int exponent = (int)(source & (((source_t)1 << exponentBits) - 1)) - (int)((1 << (exponentBits - 1)) - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 source >>= exponentBits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if constexpr (outExponent + outExponentShift <= 0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 out_t output = (out_t)(source & 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 output <<= outExponent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 output |= (unsigned)(exponent + outExponentShift) & ((1 << outExponent) - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 output <<= outFraction;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 int shift = (int)outFraction - (int)fractionBits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (shift < 0) output |= (out_t)(fraction >> -shift);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 else output |= (out_t)(fraction << shift);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 return *(retval_t*)&output / pfc::audio_math::float16scale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 unsigned audio_math::bitrate_kbps(uint64_t fileSize, double duration) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if (fileSize > 0 && duration > 0) return (unsigned)floor((double)fileSize * 8 / (duration * 1000) + 0.5);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }