shithub: ft2-clone

Download patch

ref: 01075c7508d8356a7fe77110daa76d0e87264c38
parent: c8ca07133c9fcb92cc2d9242538764f0f4bbc386
author: Olav Sørensen <olav.sorensen@live.no>
date: Sun Nov 1 14:38:01 EST 2020

Pushed v1.38 code

- Fixed two possible pattern length bugs while switching to a new, shorter pattern while the song is playing
- Mixer code cleanup (generates smaller code now)

--- a/src/ft2_audio.c
+++ b/src/ft2_audio.c
@@ -324,16 +324,18 @@
 	{
 		v->base16 = (const int16_t *)s->pek;
 		v->revBase16 = &v->base16[loopStart + loopEnd]; // for pingpong loops
+
+		v->leftEdgeTaps16 = s->leftEdgeTapSamples16 + 3;
 	}
 	else
 	{
 		v->base8 = s->pek;
 		v->revBase8 = &v->base8[loopStart + loopEnd]; // for pingpong loops
+		v->leftEdgeTaps8 = s->leftEdgeTapSamples8 + 3;
+
 	}
 
-	v->dLeftEdgeTaps = s->dLeftEdgeTapSamples + 3;
 	v->hasLooped = false; // for sinc interpolation special case
-
 	v->backwards = false;
 	v->loopType = loopType;
 	v->end = (loopType > 0) ? loopEnd : length;
@@ -801,7 +803,7 @@
 	audio.locked = false;
 }
 
-static void resetSyncQueues(void)
+void resetSyncQueues(void)
 {
 	pattSync.data[0].timestamp = 0;
 	pattSync.readPos = 0;
--- a/src/ft2_audio.h
+++ b/src/ft2_audio.h
@@ -50,8 +50,12 @@
 	int32_t pos, end, loopStart, loopLength;
 	uint32_t volRampSamples, revDelta, oldRevDelta;
 	uint64_t posFrac, delta, oldDelta;
+
+	// if (loopStart > 0 && pos <= loopStart+3) useTheseTaps();
+	const int8_t *leftEdgeTaps8;
+	const int16_t *leftEdgeTaps16;
+
 	const double *dSincLUT;
-	double *dLeftEdgeTaps; // if (loopStart > 0 && pos <= loopStart+3) useTheseTaps();
 	double dVol, dDestVolL, dDestVolR, dVolL, dVolR, dVolDeltaL, dVolDeltaR;
 } voice_t;
 
@@ -94,6 +98,7 @@
 bool chQueuePop(void);
 chSyncData_t *chQueuePeek(void);
 uint64_t getChQueueTimestamp(void);
+void resetSyncQueues(void);
 
 void calcPanningTable(void);
 void setAudioAmp(int16_t amp, int16_t masterVol, bool bitDepth32Flag);
--- a/src/ft2_header.h
+++ b/src/ft2_header.h
@@ -12,7 +12,7 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "1.37"
+#define PROG_VER_STR "1.38"
 
 // do NOT change these! It will only mess things up...
 
--- a/src/ft2_pattern_ed.c
+++ b/src/ft2_pattern_ed.c
@@ -1614,11 +1614,22 @@
 	{
 		song.songTab[song.songPos]++;
 		song.pattNr = song.songTab[song.songPos];
-		editor.editPattern = (uint8_t)song.pattNr;
-		song.pattLen = pattLens[editor.editPattern];
 
+		song.pattLen = pattLens[song.pattNr];
+		if (song.pattPos >= song.pattLen)
+		{
+			song.pattPos = song.pattLen-1;
+			if (!songPlaying)
+				editor.pattPos = song.pattPos;
+		}
+
+		if (!songPlaying)
+			editor.editPattern = (uint8_t)song.pattNr;
+
+		checkMarkLimits();
 		ui.updatePatternEditor = true;
 		ui.updatePosSections = true;
+
 		setSongModifiedFlag();
 	}
 	unlockMixerCallback();
@@ -1634,11 +1645,22 @@
 	{
 		song.songTab[song.songPos]--;
 		song.pattNr = song.songTab[song.songPos];
-		editor.editPattern = (uint8_t)song.pattNr;
-		song.pattLen = pattLens[editor.editPattern];
 
+		song.pattLen = pattLens[song.pattNr];
+		if (song.pattPos >= song.pattLen)
+		{
+			song.pattPos = song.pattLen-1;
+			if (!songPlaying)
+				editor.pattPos = song.pattPos;
+		}
+
+		if (!songPlaying)
+			editor.editPattern = (uint8_t)song.pattNr;
+
+		checkMarkLimits();
 		ui.updatePatternEditor = true;
 		ui.updatePosSections = true;
+
 		setSongModifiedFlag();
 	}
 	unlockMixerCallback();
@@ -1888,20 +1910,6 @@
 	unlockMixerCallback();
 }
 
-static void updatePtnLen(void)
-{
-	uint16_t len = pattLens[editor.editPattern];
-
-	song.pattLen = len;
-	if (song.pattPos >= len)
-	{
-		song.pattPos = len - 1;
-		editor.pattPos = song.pattPos;
-	}
-
-	checkMarkLimits();
-}
-
 void pbEditPattUp(void)
 {
 	const bool audioWasntLocked = !audio.locked;
@@ -1908,29 +1916,24 @@
 	if (audioWasntLocked)
 		lockAudio();
 
-	if (songPlaying)
+	if (song.pattNr < 255)
 	{
-		if (song.pattNr < 255)
-		{
-			song.pattNr++;
-			updatePtnLen();
+		song.pattNr++;
 
-			ui.updatePatternEditor = true;
-			ui.updatePosSections = true;
-		}
-	}
-	else
-	{
-		if (editor.editPattern < 255)
+		song.pattLen = pattLens[song.pattNr];
+		if (song.pattPos >= song.pattLen)
 		{
-			editor.editPattern++;
+			song.pattPos = song.pattLen-1;
+			if (!songPlaying)
+				editor.pattPos = song.pattPos;
+		}
 
-			song.pattNr = editor.editPattern;
-			updatePtnLen();
+		if (!songPlaying)
+			editor.editPattern = (uint8_t)song.pattNr;
 
-			ui.updatePatternEditor = true;
-			ui.updatePosSections = true;
-		}
+		checkMarkLimits();
+		ui.updatePatternEditor = true;
+		ui.updatePosSections = true;
 	}
 
 	if (audioWasntLocked)
@@ -1943,29 +1946,24 @@
 	if (audioWasntLocked)
 		lockAudio();
 
-	if (songPlaying)
+	if (song.pattNr > 0)
 	{
-		if (song.pattNr > 0)
-		{
-			song.pattNr--;
-			updatePtnLen();
+		song.pattNr--;
 
-			ui.updatePatternEditor = true;
-			ui.updatePosSections = true;
-		}
-	}
-	else
-	{
-		if (editor.editPattern > 0)
+		song.pattLen = pattLens[song.pattNr];
+		if (song.pattPos >= song.pattLen)
 		{
-			editor.editPattern--;
+			song.pattPos = song.pattLen-1;
+			if (!songPlaying)
+				editor.pattPos = song.pattPos;
+		}
 
-			song.pattNr = editor.editPattern;
-			updatePtnLen();
+		if (!songPlaying)
+			editor.editPattern = (uint8_t)song.pattNr;
 
-			ui.updatePatternEditor = true;
-			ui.updatePosSections = true;
-		}
+		checkMarkLimits();
+		ui.updatePatternEditor = true;
+		ui.updatePosSections = true;
 	}
 
 	if (audioWasntLocked)
--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -2294,7 +2294,7 @@
 	{
 		song.pattPos = pattPos;
 		if (song.pattPos >= song.pattLen)
-			song.pattPos = song.pattLen - 1;
+			song.pattPos = song.pattLen-1;
 	}
 
 	// if not playing, update local position variables
--- a/src/ft2_replayer.h
+++ b/src/ft2_replayer.h
@@ -173,9 +173,13 @@
 	bool fixed;
 	int8_t fine, relTon, *pek, *origPek;
 	uint8_t vol, typ, pan;
-	double dLeftEdgeTapSamples[8+3];
+	int32_t len, repS, repL;
+
+	// fix for resampling interpolation taps
+	int8_t leftEdgeTapSamples8[SINC_TAPS+SINC_LEFT_TAPS];
+	int16_t leftEdgeTapSamples16[SINC_TAPS+SINC_LEFT_TAPS];
 	int16_t fixedSmp[SINC_RIGHT_TAPS];
-	int32_t fixedPos, len, repS, repL;
+	int32_t fixedPos;
 } sampleTyp;
 
 typedef struct instrTyp_t
--- a/src/ft2_sample_ed.c
+++ b/src/ft2_sample_ed.c
@@ -148,7 +148,7 @@
 		if (sample16Bit)
 		{
 			for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
-				s->dLeftEdgeTapSamples[i] = ptr16[loopStart];
+				s->leftEdgeTapSamples16[i] = ptr16[loopStart];
 
 			for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
 			{
@@ -159,7 +159,7 @@
 		else
 		{
 			for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
-				s->dLeftEdgeTapSamples[i] = s->pek[loopStart];
+				s->leftEdgeTapSamples8[i] = s->pek[loopStart];
 
 			for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
 			{
@@ -190,7 +190,7 @@
 					pos = loopStart + ((i-SINC_LEFT_TAPS) % loopLen);
 				}
 
-				s->dLeftEdgeTapSamples[i] = ptr16[pos];
+				s->leftEdgeTapSamples16[i] = ptr16[pos];
 			}
 
 			// right edge (change actual sample data since data after loop is never used)
@@ -216,7 +216,7 @@
 					pos = loopStart + ((i-SINC_LEFT_TAPS) % loopLen);
 				}
 
-				s->dLeftEdgeTapSamples[i] = s->pek[pos];
+				s->leftEdgeTapSamples8[i] = s->pek[pos];
 			}
 
 			// right edge (change actual sample data since data after loop is never used)
@@ -254,7 +254,7 @@
 					}
 				}
 
-				s->dLeftEdgeTapSamples[3-i] = ptr16[pos];
+				s->leftEdgeTapSamples16[3-i] = ptr16[pos];
 			}
 
 			pos = loopStart;
@@ -278,7 +278,7 @@
 					}
 				}
 				
-				s->dLeftEdgeTapSamples[i] = ptr16[pos];
+				s->leftEdgeTapSamples16[i] = ptr16[pos];
 			}
 
 			// right edge (change actual sample data since data after loop is never used)
@@ -331,7 +331,7 @@
 					}
 				}
 
-				s->dLeftEdgeTapSamples[3-i] = s->pek[pos];
+				s->leftEdgeTapSamples8[3-i] = s->pek[pos];
 			}
 
 			pos = loopStart;
@@ -355,7 +355,7 @@
 					}
 				}
 				
-				s->dLeftEdgeTapSamples[i] = s->pek[pos];
+				s->leftEdgeTapSamples8[i] = s->pek[pos];
 			}
 
 			// right edge (change actual sample data since data after loop is never used)
--- a/src/mixer/ft2_center_mix.c
+++ b/src/mixer/ft2_center_mix.c
@@ -183,6 +183,7 @@
 void centerMix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -249,6 +250,7 @@
 void centerMix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *revBase, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -648,6 +650,7 @@
 void centerMix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolL;
@@ -727,6 +730,7 @@
 void centerMix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *revBase, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolL;
@@ -1134,6 +1138,7 @@
 void centerMix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -1200,6 +1205,7 @@
 void centerMix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *revBase, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -1599,6 +1605,7 @@
 void centerMix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolL;
@@ -1678,6 +1685,7 @@
 void centerMix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *revBase, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolL;
--- a/src/mixer/ft2_mix.c
+++ b/src/mixer/ft2_mix.c
@@ -203,6 +203,7 @@
 static void mix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -269,6 +270,7 @@
 static void mix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *revBase, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -667,6 +669,7 @@
 static void mix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolRDelta, dVolL, dVolR;
@@ -746,6 +749,7 @@
 static void mix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int8_t *base, *revBase, *smpPtr;
+	int8_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolRDelta, dVolL, dVolR;
@@ -1153,6 +1157,7 @@
 static void mix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -1219,6 +1224,7 @@
 static void mix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *revBase, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	uint32_t i, samplesToMix, samplesLeft;
@@ -1617,6 +1623,7 @@
 static void mix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolRDelta, dVolL, dVolR;
@@ -1696,6 +1703,7 @@
 static void mix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
 {
 	const int16_t *base, *revBase, *smpPtr;
+	int16_t *smpTapPtr;
 	double dSample, *dMixBufferL, *dMixBufferR;
 	int32_t pos;
 	double dVolLDelta, dVolRDelta, dVolL, dVolR;
--- a/src/mixer/ft2_mix_macros.h
+++ b/src/mixer/ft2_mix_macros.h
@@ -235,29 +235,15 @@
 
 #define RENDER_8BIT_SMP_SINTRP_TAP_FIX  \
 	assert(smpPtr >= base && smpPtr < base+v->end); \
-	if (smpPtr <= leftEdgePtr) \
-	{ \
-		const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
-		WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
-	} \
-	else \
-	{ \
-		WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
-	} \
+	smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
+	WINDOWED_SINC_INTERPOLATION8(smpTapPtr, posFrac) \
 	*dMixBufferL++ += dSample * dVolL; \
 	*dMixBufferR++ += dSample * dVolR; \
 
 #define RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX \
 	assert(smpPtr >= base && smpPtr < base+v->end); \
-	if (smpPtr <= leftEdgePtr) \
-	{ \
-		const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
-		WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
-	} \
-	else \
-	{ \
-		WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
-	} \
+	smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
+	WINDOWED_SINC_INTERPOLATION8(smpTapPtr, posFrac) \
 	dSample *= dVolL; \
 	*dMixBufferL++ += dSample; \
 	*dMixBufferR++ += dSample; \
@@ -264,29 +250,15 @@
 
 #define RENDER_16BIT_SMP_SINTRP_TAP_FIX \
 	assert(smpPtr >= base && smpPtr < base+v->end); \
-	if (smpPtr <= leftEdgePtr) \
-	{ \
-		const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
-		WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
-	} \
-	else \
-	{ \
-		WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
-	} \
+	smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
+	WINDOWED_SINC_INTERPOLATION16(smpTapPtr, posFrac) \
 	*dMixBufferL++ += dSample * dVolL; \
 	*dMixBufferR++ += dSample * dVolR; \
 
 #define RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX \
 	assert(smpPtr >= base && smpPtr < base+v->end); \
-	if (smpPtr <= leftEdgePtr) \
-	{ \
-		const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
-		WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
-	} \
-	else \
-	{ \
-		WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
-	} \
+	smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
+	WINDOWED_SINC_INTERPOLATION16(smpTapPtr, posFrac) \
 	dSample *= dVolL; \
 	*dMixBufferL++ += dSample; \
 	*dMixBufferR++ += dSample; \