diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/audio_sample.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,76 @@
+#include "pfc-lite.h"
+#include "audio_sample.h"
+#include "primitives.h"
+#include "byte_order.h"
+
+namespace pfc {
+	float audio_math::decodeFloat24ptr(const void* sourcePtr) {
+		PFC_STATIC_ASSERT(pfc::byte_order_is_little_endian);
+		union {
+			uint8_t bytes[4];
+			float v;
+		} u;
+		const uint8_t* s = reinterpret_cast<const uint8_t*>(sourcePtr);
+		u.bytes[0] = 0;
+		u.bytes[1] = s[0];
+		u.bytes[2] = s[1];
+		u.bytes[3] = s[2];
+		return u.v;
+	}
+	float audio_math::decodeFloat24ptrbs(const void* sourcePtr) {
+		PFC_STATIC_ASSERT(pfc::byte_order_is_little_endian);
+		union {
+			uint8_t bytes[4];
+			float v;
+		} u;
+		const uint8_t* s = reinterpret_cast<const uint8_t*>(sourcePtr);
+		u.bytes[0] = 0;
+		u.bytes[1] = s[2];
+		u.bytes[2] = s[1];
+		u.bytes[3] = s[0];
+		return u.v;
+	}
+
+	float audio_math::decodeFloat16(uint16_t source) {
+		const unsigned fractionBits = 10;
+		const unsigned widthBits = 16;
+		typedef uint16_t source_t;
+
+		/*	typedef uint64_t out_t; typedef double retval_t;
+			enum {
+				outExponent = 11,
+				outFraction = 52,
+				outExponentShift = (1 << (outExponent-1))-1
+			};*/
+
+		typedef uint32_t out_t; typedef float retval_t;
+		enum {
+			outExponent = 8,
+			outFraction = 23,
+			outExponentShift = (1 << (outExponent - 1)) - 1
+		};
+
+		const unsigned exponentBits = widthBits - fractionBits - 1;
+		// 1 bit sign | exponent | fraction
+		source_t fraction = source & (((source_t)1 << fractionBits) - 1);
+		source >>= fractionBits;
+		int exponent = (int)(source & (((source_t)1 << exponentBits) - 1)) - (int)((1 << (exponentBits - 1)) - 1);
+		source >>= exponentBits;
+
+		if constexpr (outExponent + outExponentShift <= 0) return 0;
+
+		out_t output = (out_t)(source & 1);
+		output <<= outExponent;
+		output |= (unsigned)(exponent + outExponentShift) & ((1 << outExponent) - 1);
+		output <<= outFraction;
+		int shift = (int)outFraction - (int)fractionBits;
+		if (shift < 0) output |= (out_t)(fraction >> -shift);
+		else output |= (out_t)(fraction << shift);
+		return *(retval_t*)&output / pfc::audio_math::float16scale;
+	}
+
+	unsigned audio_math::bitrate_kbps(uint64_t fileSize, double duration) {
+		if (fileSize > 0 && duration > 0) return (unsigned)floor((double)fileSize * 8 / (duration * 1000) + 0.5);
+		return 0;
+	}
+}