History

Fix XFade bug on 16-bit pingpong samples

This bug was accidentally ported over from the original FT2 code.

Olav Sørensen committed 6 years ago

Commit 4e1aaeb1 parent f8c0ccf4 files · +47 −37Browse files

Unified · Split

4 files
  1. src/ft2_header.h +1 −1
  2. src/ft2_sample_ed.c +41 −31
  3. src/ft2_sample_ed.h +2 −2
  4. src/ft2_sample_ed_features.c +3 −3
src/ft2_header.h+1−1
@@ -12,7 +12,7 @@ · 11 unmodified lines
1212 #endif
1313 #include "ft2_replayer.h"
1414
15−#define PROG_VER_STR "1.24"
15+#define PROG_VER_STR "1.25"
1616
1717 // do NOT change these! It will only mess things up...
1818
src/ft2_sample_ed.c+41−31
@@ -254,7 +254,7 @@ void restoreSample(sampleTyp *s) · 253 unmodified lines
254254 }
255255 }
256256
257−inline int16_t getSampleValueNr(int8_t *ptr, uint8_t typ, int32_t pos)
257+inline int16_t getSampleValue(int8_t *ptr, uint8_t typ, int32_t pos)
258258 {
259259 assert(pos >= 0);
260260 if (ptr == NULL)
@@ -271,7 +271,7 @@ inline int16_t getSampleValueNr(int8_t *ptr, uint8_t typ, int32_t pos) · 10 unmodified lines
271271 }
272272 }
273273
274−inline void putSampleValueNr(int8_t *ptr, uint8_t typ, int32_t pos, int16_t val)
274+inline void putSampleValue(int8_t *ptr, uint8_t typ, int32_t pos, int16_t val)
275275 {
276276 assert(pos >= 0);
277277 if (ptr == NULL)
@@ -2178,7 +2178,7 @@ void sampXFade(void) · 1900 unmodified lines
21782178
21792179 if (x2 <= y1 || x2 >= s->repS+s->repL)
21802180 {
2181− okBox(0, "System message", "Not enough sample data outside loop!");
2181+ okBox(0, "System message", "Invalid range!");
21822182 return;
21832183 }
21842184
@@ -2189,21 +2189,25 @@ void sampXFade(void) · 4 unmodified lines
21892189 d2 = y1 - x1;
21902190 d3 = x2 - y1;
21912191
2192− if (d1 < 1 || d2 < 1 || d3 < 1)
2192+ if (d1 < 2 || d2 < 2 || d3 < 2)
21932193 {
2194− okBox(0, "System message", "Not enough sample data outside loop!");
2194+ okBox(0, "System message", "Invalid range!");
21952195 return;
21962196 }
21972197
21982198 if (y1-d1 < 0 || y1+d1 >= s->len)
21992199 {
2200− okBox(0, "System message", "Invalid range!");
2200+ okBox(0, "System message", "Not enough sample data outside loop!");
22012201 return;
22022202 }
22032203
2204− dist = 1;
22052204 if (is16Bit)
2206− dist++;
2205+ {
2206+ y1 >>= 1;
2207+ d1 >>= 1;
2208+ d2 >>= 1;
2209+ d3 >>= 1;
2210+ }
22072211
22082212 pauseAudio();
22092213 restoreSample(s);
@@ -2211,8 +2215,8 @@ void sampXFade(void) · 1 unmodified line
22112215 i = 0;
22122216 while (i < d1)
22132217 {
2214− a = getSampleValueNr(s->pek, t, y1 + dist * (-i - 1));
2215− b = getSampleValueNr(s->pek, t, y1 + dist * i);
2218+ a = getSampleValue(s->pek, t, (y1 - i - 1) << is16Bit);
2219+ b = getSampleValue(s->pek, t, (y1 + i) << is16Bit);
22162220
22172221 dS1 = 1.0 - i / (double)d2; dS2 = 2.0 - dS1;
22182222 dS3 = 1.0 - i / (double)d3; dS4 = 2.0 - dS3;
@@ -2223,10 +2227,10 @@ void sampXFade(void) · 4 unmodified lines
22232227 tmp32 = (int32_t)round((b * dS4 + a * dS3) / (dS3 + dS4));
22242228 d = (int16_t)tmp32;
22252229
2226− if (i < d2) putSampleValueNr(s->pek, t, y1 + dist * (-i - 1), c);
2227− if (i < d3) putSampleValueNr(s->pek, t, y1 + dist * i, d);
2230+ if (i < d2) putSampleValue(s->pek, t, (y1 - i - 1) << is16Bit, c);
2231+ if (i < d3) putSampleValue(s->pek, t, (y1 + i) << is16Bit, d);
22282232
2229− i += dist;
2233+ i++;
22302234 }
22312235
22322236 fixSample(s);
@@ -2239,7 +2243,7 @@ void sampXFade(void) · 6 unmodified lines
22392243 y1 += s->repL;
22402244 if (x1 >= y1 || x2 <= y1 || x2 >= s->len)
22412245 {
2242− okBox(0, "System message", "Not enough sample data outside loop!");
2246+ okBox(0, "System message", "Invalid range!");
22432247 return;
22442248 }
22452249
@@ -2250,19 +2254,25 @@ void sampXFade(void) · 4 unmodified lines
22502254 d2 = y1 - x1;
22512255 d3 = x2 - y1;
22522256
2253− if (d1 < 1 || d2 < 1 || d3 < 1)
2257+ if (d1 < 2 || d2 < 2 || d3 < 2)
22542258 {
2255− okBox(0, "System message", "Not enough sample data outside loop!");
2259+ okBox(0, "System message", "Invalid range!");
22562260 return;
22572261 }
22582262
22592263 if (y1-d1 < 0 || y1+d1 >= s->len)
22602264 {
2261− okBox(0, "System message", "Invalid range!");
2265+ okBox(0, "System message", "Not enough sample data outside loop!");
22622266 return;
22632267 }
22642268
2265− dist = is16Bit ? 2 : 1;
2269+ if (is16Bit)
2270+ {
2271+ y1 >>= 1;
2272+ d1 >>= 1;
2273+ d2 >>= 1;
2274+ d3 >>= 1;
2275+ }
22662276
22672277 pauseAudio();
22682278 restoreSample(s);
@@ -2270,8 +2280,8 @@ void sampXFade(void) · 1 unmodified line
22702280 i = 0;
22712281 while (i < d1)
22722282 {
2273− a = getSampleValueNr(s->pek, t, y1 - i - dist);
2274− b = getSampleValueNr(s->pek, t, y1 + i);
2283+ a = getSampleValue(s->pek, t, (y1 - i - 1) << is16Bit);
2284+ b = getSampleValue(s->pek, t, (y1 + i) << is16Bit);
22752285
22762286 dS1 = 1.0 - i / (double)d2; dS2 = 2.0 - dS1;
22772287 dS3 = 1.0 - i / (double)d3; dS4 = 2.0 - dS3;
@@ -2282,10 +2292,10 @@ void sampXFade(void) · 4 unmodified lines
22822292 tmp32 = (int32_t)round((b * dS4 + a * dS3) / (dS3 + dS4));
22832293 d = (int16_t)tmp32;
22842294
2285− if (i < d2) putSampleValueNr(s->pek, t, y1 - i - dist, c);
2286− if (i < d3) putSampleValueNr(s->pek, t, y1 + i, d);
2295+ if (i < d2) putSampleValue(s->pek, t, (y1 - i - 1) << is16Bit, c);
2296+ if (i < d3) putSampleValue(s->pek, t, (y1 + i) << is16Bit, d);
22872297
2288− i += dist;
2298+ i++;
22892299 }
22902300
22912301 fixSample(s);
@@ -2304,11 +2314,11 @@ void sampXFade(void) · 12 unmodified lines
23042314
23052315 if (x1 < 0 || x2 <= x1 || x2 >= s->len)
23062316 {
2307− okBox(0, "System message", "Not enough sample data outside loop!");
2317+ okBox(0, "System message", "Invalid range!");
23082318 return;
23092319 }
23102320
2311− i = (x2 - x1 + 1) / 2;
2321+ i = (x2 - x1 + 1) >> 1;
23122322 y1 = s->repS - i;
23132323 y2 = s->repS + s->repL - i;
23142324
@@ -2320,7 +2330,7 @@ void sampXFade(void) · 5 unmodified lines
23202330
23212331 if (y1 < 0 || y2+(x2-x1) >= s->len)
23222332 {
2323− okBox(0, "System message", "Invalid range!");
2333+ okBox(0, "System message", "Not enough sample data outside loop!");
23242334 return;
23252335 }
23262336
@@ -2330,7 +2340,7 @@ void sampXFade(void) · 3 unmodified lines
23302340
23312341 if (y1+(x2-x1) <= s->repS || d1 == 0 || d3 == 0 || d1 > s->repL)
23322342 {
2333− okBox(0, "System message", "Not enough sample data outside loop!");
2343+ okBox(0, "System message", "Invalid range!");
23342344 return;
23352345 }
23362346
@@ -2343,8 +2353,8 @@ void sampXFade(void) · 6 unmodified lines
23432353 i = 0;
23442354 while (i < x2-x1)
23452355 {
2346− a = getSampleValueNr(s->pek, t, y1 + i);
2347− b = getSampleValueNr(s->pek, t, y2 + i);
2356+ a = getSampleValue(s->pek, t, y1 + i);
2357+ b = getSampleValue(s->pek, t, y2 + i);
23482358
23492359 dS2 = i / (double)d1;
23502360 dS1 = 1.0 - dS2;
@@ -2372,8 +2382,8 @@ void sampXFade(void) · 21 unmodified lines
23722382 d = (int16_t)tmp32;
23732383 }
23742384
2375− putSampleValueNr(s->pek, t, y1 + i, c);
2376− putSampleValueNr(s->pek, t, y2 + i, d);
2385+ putSampleValue(s->pek, t, y1 + i, c);
2386+ putSampleValue(s->pek, t, y2 + i, d);
23772387
23782388 i += dist;
23792389 }
src/ft2_sample_ed.h+2−2
@@ -48,8 +48,8 @@ void sampRepeatUp(void); · 47 unmodified lines
4848 void sampRepeatDown(void);
4949 void sampReplenUp(void);
5050 void sampReplenDown(void);
51−int16_t getSampleValueNr(int8_t *ptr, uint8_t typ, int32_t pos);
52−void putSampleValueNr(int8_t *ptr, uint8_t typ, int32_t pos, int16_t val);
51+int16_t getSampleValue(int8_t *ptr, uint8_t typ, int32_t pos);
52+void putSampleValue(int8_t *ptr, uint8_t typ, int32_t pos, int16_t val);
5353 void writeSample(bool forceSmpRedraw);
5454 void handleSampleDataMouseDown(bool mouseButtonHeld);
5555 void updateSampleEditorSample(void);
src/ft2_sample_ed_features.c+3−3
@@ -987,8 +987,8 @@ static int32_t SDLCALL mixThread(void *ptr) · 986 unmodified lines
987987 {
988988 int32_t index16 = i << 1;
989989
990− x1 = (i >= mix8Size) ? 0 : getSampleValueNr(mixPtr, mixTyp, src16Bits ? index16 : i);
991− x2 = (i >= dest8Size) ? 0 : getSampleValueNr(destPtr, destTyp, dst16Bits ? index16 : i);
990+ x1 = (i >= mix8Size) ? 0 : getSampleValue(mixPtr, mixTyp, src16Bits ? index16 : i);
991+ x2 = (i >= dest8Size) ? 0 : getSampleValue(destPtr, destTyp, dst16Bits ? index16 : i);
992992
993993 if (!src16Bits) x1 <<= 8;
994994 if (!dst16Bits) x2 <<= 8;
@@ -999,7 +999,7 @@ static int32_t SDLCALL mixThread(void *ptr) · 4 unmodified lines
999999 if (!dst16Bits)
10001000 smp32 >>= 8;
10011001
1002− putSampleValueNr(destPek, destTyp, dst16Bits ? index16 : i, (int16_t)smp32);
1002+ putSampleValue(destPek, destTyp, dst16Bits ? index16 : i, (int16_t)smp32);
10031003 }
10041004
10051005 if (instr[destIns]->samp[destSmp].origPek != NULL)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t