diff win95kggui/dep/ft2play/snd_masm.h @ 126:8e4ee43d3b81

remove submodules
author Paper <mrpapersonic@gmail.com>
date Sun, 01 Oct 2023 03:48:43 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win95kggui/dep/ft2play/snd_masm.h	Sun Oct 01 03:48:43 2023 -0400
@@ -0,0 +1,227 @@
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "pmp_mix.h"
+
+#define GET_VOL \
+	const int32_t CDA_LVol = v->SLVol1; \
+	const int32_t CDA_RVol = v->SRVol1; \
+
+#define GET_VOL_CENTER \
+	const int32_t CDA_LVol = v->SLVol1; \
+
+#define GET_VOL_RAMP \
+	int32_t CDA_LVol = v->SLVol2; \
+	int32_t CDA_RVol = v->SRVol2; \
+
+#define SET_VOL_BACK \
+	v->SLVol2 = CDA_LVol; \
+	v->SRVol2 = CDA_RVol; \
+
+#define GET_MIXER_VARS \
+	int32_t *audioMix = CDA_MixBuffer + (bufferPos << 1); \
+	int32_t realPos = v->SPos; \
+	uint32_t pos = v->SPosDec; \
+	uint16_t CDA_MixBuffPos = (32768+96)-8; /* address of FT2 mix buffer minus mix sample size (used for quirky LERP) */ \
+
+#define GET_RAMP_VARS \
+	int32_t CDA_LVolIP = v->SLVolIP; \
+	int32_t CDA_RVolIP = v->SRVolIP; \
+
+#define SET_BASE8 \
+	const int8_t *CDA_LinearAdr = (int8_t *)v->SBase; \
+	const int8_t *CDA_LinAdrRev = (int8_t *)v->SRevBase; \
+	const int8_t *smpPtr = CDA_LinearAdr + realPos; \
+
+#define SET_BASE16 \
+	const int16_t *CDA_LinearAdr = (int16_t *)v->SBase; \
+	const int16_t *CDA_LinAdrRev = (int16_t *)v->SRevBase; \
+	const int16_t *smpPtr = CDA_LinearAdr + realPos; \
+
+#define INC_POS \
+	smpPtr += CDA_IPValH; \
+	smpPtr += (CDA_IPValL > (uint32_t)~pos); /* if pos would 32-bit overflow after CDA_IPValL add, add one to smpPtr (branchless) */ \
+	pos += CDA_IPValL; \
+
+#define SET_BACK_MIXER_POS \
+	v->SPosDec = pos & 0xFFFF0000; \
+	v->SPos = realPos; \
+
+#define VOL_RAMP \
+	CDA_LVol += CDA_LVolIP; \
+	CDA_RVol += CDA_RVolIP; \
+
+// stereo mixing without interpolation
+
+#define MIX_8BIT \
+	sample = (*smpPtr) << (28-8); \
+	*audioMix++ += ((int64_t)sample * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += ((int64_t)sample * (int32_t)CDA_RVol) >> 32; \
+	INC_POS \
+
+#define MIX_16BIT \
+	sample = (*smpPtr) << (28-16); \
+	*audioMix++ += ((int64_t)sample * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += ((int64_t)sample * (int32_t)CDA_RVol) >> 32; \
+	INC_POS \
+
+// center mixing without interpolation
+
+#define MIX_8BIT_M \
+	sample = (*smpPtr) << (28-8); \
+	sample = ((int64_t)sample * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += sample; \
+	*audioMix++ += sample; \
+	INC_POS \
+
+#define MIX_16BIT_M \
+	sample = (*smpPtr) << (28-16); \
+	sample = ((int64_t)sample * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += sample; \
+	*audioMix++ += sample; \
+	INC_POS \
+
+// linear interpolation with bit-accurate results to FT2.08/FT2.09
+#define LERP(s1, s2, f) \
+{ \
+	s2 -= s1; \
+	f >>= 1; \
+	s2 = ((int64_t)s2 * (int32_t)f) >> 32; \
+	f += f; \
+	s2 += s2; \
+	s2 += s1; \
+} \
+
+// stereo mixing w/ linear interpolation
+
+#define MIX_8BIT_INTRP \
+	sample = smpPtr[0] << 8; \
+	sample2 = smpPtr[1] << 8; \
+	LERP(sample, sample2, pos) \
+	sample2 <<= (28-16); \
+	*audioMix++ += ((int64_t)sample2 * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += ((int64_t)sample2 * (int32_t)CDA_RVol) >> 32; \
+	INC_POS \
+
+#define MIX_16BIT_INTRP \
+	sample = smpPtr[0]; \
+	sample2 = smpPtr[1]; \
+	LERP(sample, sample2, pos) \
+	sample2 <<= (28-16); \
+	*audioMix++ += ((int64_t)sample2 * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += ((int64_t)sample2 * (int32_t)CDA_RVol) >> 32; \
+	INC_POS \
+
+// center mixing w/ linear interpolation
+
+#define MIX_8BIT_INTRP_M \
+	sample = smpPtr[0] << 8; \
+	sample2 = smpPtr[1] << 8; \
+	LERP(sample, sample2, pos) \
+	sample2 <<= (28-16); \
+	sample = ((int64_t)sample2 * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += sample; \
+	*audioMix++ += sample; \
+	INC_POS \
+
+#define MIX_16BIT_INTRP_M \
+	sample = smpPtr[0]; \
+	sample2 = smpPtr[1]; \
+	LERP(sample, sample2, pos) \
+	sample2 <<= (28-16); \
+	sample = ((int64_t)sample2 * (int32_t)CDA_LVol) >> 32; \
+	*audioMix++ += sample; \
+	*audioMix++ += sample; \
+	INC_POS \
+
+// ------------------------
+
+#define LIMIT_MIX_NUM \
+	int32_t samplesToMix; \
+	int32_t SFrq = v->SFrq; \
+	int32_t i = (v->SLen-1) - realPos; \
+	if (i > UINT16_MAX) i = UINT16_MAX; /* 8bb: added this to prevent 64-bit div (still bit-accurate mixing results) */ \
+	if (SFrq != 0) \
+	{ \
+		const uint32_t tmp32 = (i << 16) | ((0xFFFF0000 - pos) >> 16); \
+		samplesToMix = (tmp32 / (uint32_t)SFrq) + 1; \
+	} \
+	else \
+	{ \
+		samplesToMix = 65535; \
+	} \
+	\
+	if (samplesToMix > CDA_BytesLeft) \
+		samplesToMix = CDA_BytesLeft; \
+
+#define LIMIT_MIX_NUM_RAMP \
+	if (v->SVolIPLen == 0) \
+	{ \
+		CDA_LVolIP = 0; \
+		CDA_RVolIP = 0; \
+	} \
+	else \
+	{ \
+		if (samplesToMix > v->SVolIPLen) \
+			samplesToMix = v->SVolIPLen; \
+		\
+		v->SVolIPLen -= samplesToMix; \
+	} \
+
+#define HANDLE_POS_START \
+	const bool backwards = (v->SType & (SType_Rev+SType_RevDir)) == SType_Rev+SType_RevDir; \
+	if (backwards) \
+	{ \
+		SFrq = 0 - SFrq; \
+		realPos = ~realPos; \
+		smpPtr = CDA_LinAdrRev + realPos; \
+		pos ^= 0xFFFF0000; \
+	} \
+	else \
+	{ \
+		smpPtr = CDA_LinearAdr + realPos; \
+	} \
+	\
+	pos += CDA_MixBuffPos; \
+	const int32_t CDA_IPValH = (int32_t)SFrq >> 16; \
+	const uint32_t CDA_IPValL = ((uint32_t)(SFrq & 0xFFFF) << 16) + 8; /* 8 = mixer buffer increase (for LERP to be bit-accurate to FT2) */ \
+
+#define HANDLE_POS_END \
+	if (backwards) \
+	{ \
+		pos ^= 0xFFFF0000; \
+		realPos = ~(int32_t)(smpPtr - CDA_LinAdrRev); \
+	} \
+	else \
+	{ \
+		realPos = (int32_t)(smpPtr - CDA_LinearAdr); \
+	} \
+	CDA_MixBuffPos = pos & 0xFFFF; \
+	pos &= 0xFFFF0000; \
+	\
+	if (realPos >= v->SLen) \
+	{ \
+		uint8_t SType = v->SType; \
+		if (SType & (SType_Fwd+SType_Rev)) \
+		{ \
+			do \
+			{ \
+				realPos -= v->SRepL; \
+				SType ^= SType_RevDir; \
+			} \
+			while (realPos >= v->SLen); \
+			v->SType = SType; \
+		} \
+		else \
+		{ \
+			v->SType = SType_Off; \
+			return; \
+		} \
+	} \
+
+typedef void (*mixRoutine)(void *, int32_t, int32_t);
+
+extern mixRoutine mixRoutineTable[16];
+
+void PMPMix32Proc(CIType *v, int32_t numSamples, int32_t bufferPos);