Mercurial > codedump
comparison win95kggui/dep/ft2play/snd_masm.c @ 126:8e4ee43d3b81
remove submodules
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 01 Oct 2023 03:48:43 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
125:5cc85ef3a675 | 126:8e4ee43d3b81 |
---|---|
1 #include <stdint.h> | |
2 #include <stdbool.h> | |
3 #include "snd_masm.h" | |
4 #include "pmplay.h" | |
5 | |
6 /* 8bb: This is done in a slightly different way, but the result | |
7 ** is the same (bit-accurate to FT2.08/FT2.09 w/ SB16, and WAV-writer). | |
8 ** | |
9 ** Mixer macros are stored in snd_masm.h | |
10 */ | |
11 | |
12 void PMPMix32Proc(CIType *v, int32_t numSamples, int32_t bufferPos) | |
13 { | |
14 if (v->SType & SType_Off) | |
15 return; // voice is not active | |
16 | |
17 uint32_t volStatus = v->SLVol1 | v->SRVol1; | |
18 if (volumeRampingFlag) | |
19 volStatus |= v->SLVol2 | v->SRVol2; | |
20 | |
21 if (volStatus == 0) // silence mix | |
22 { | |
23 const uint64_t samplesToMix = (uint64_t)v->SFrq * (uint32_t)numSamples; // 16.16fp | |
24 | |
25 const int32_t samples = (int32_t)(samplesToMix >> 16); | |
26 const int32_t samplesFrac = (samplesToMix & 0xFFFF) + (v->SPosDec >> 16); | |
27 | |
28 int32_t realPos = v->SPos + samples + (samplesFrac >> 16); | |
29 int32_t posFrac = samplesFrac & 0xFFFF; | |
30 | |
31 if (realPos >= v->SLen) | |
32 { | |
33 uint8_t SType = v->SType; | |
34 if (SType & (SType_Fwd+SType_Rev)) | |
35 { | |
36 do | |
37 { | |
38 SType ^= SType_RevDir; | |
39 realPos -= v->SRepL; | |
40 } | |
41 while (realPos >= v->SLen); | |
42 v->SType = SType; | |
43 } | |
44 else | |
45 { | |
46 v->SType = SType_Off; | |
47 return; | |
48 } | |
49 } | |
50 | |
51 v->SPosDec = posFrac << 16; | |
52 v->SPos = realPos; | |
53 } | |
54 else // normal mixing | |
55 { | |
56 bool mixInCenter; | |
57 if (volumeRampingFlag) | |
58 mixInCenter = (v->SLVol2 == v->SRVol2) && (v->SLVolIP == v->SRVolIP); | |
59 else | |
60 mixInCenter = v->SLVol1 == v->SRVol1; | |
61 | |
62 mixRoutineTable[(mixInCenter * 8) + v->SMixType](v, numSamples, bufferPos); | |
63 } | |
64 } | |
65 | |
66 static void mix8b(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
67 { | |
68 int32_t sample; | |
69 | |
70 GET_VOL | |
71 GET_MIXER_VARS | |
72 SET_BASE8 | |
73 | |
74 int32_t CDA_BytesLeft = numSamples; | |
75 while (CDA_BytesLeft > 0) | |
76 { | |
77 LIMIT_MIX_NUM | |
78 CDA_BytesLeft -= samplesToMix; | |
79 | |
80 HANDLE_POS_START | |
81 for (i = 0; i < (samplesToMix & 3); i++) | |
82 { | |
83 MIX_8BIT | |
84 } | |
85 samplesToMix >>= 2; | |
86 for (i = 0; i < samplesToMix; i++) | |
87 { | |
88 MIX_8BIT | |
89 MIX_8BIT | |
90 MIX_8BIT | |
91 MIX_8BIT | |
92 } | |
93 HANDLE_POS_END | |
94 } | |
95 | |
96 SET_BACK_MIXER_POS | |
97 } | |
98 | |
99 static void mix8bIntrp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
100 { | |
101 int32_t sample, sample2; | |
102 | |
103 GET_VOL | |
104 GET_MIXER_VARS | |
105 SET_BASE8 | |
106 | |
107 int32_t CDA_BytesLeft = numSamples; | |
108 while (CDA_BytesLeft > 0) | |
109 { | |
110 LIMIT_MIX_NUM | |
111 CDA_BytesLeft -= samplesToMix; | |
112 | |
113 HANDLE_POS_START | |
114 for (i = 0; i < (samplesToMix & 3); i++) | |
115 { | |
116 MIX_8BIT_INTRP | |
117 } | |
118 samplesToMix >>= 2; | |
119 for (i = 0; i < samplesToMix; i++) | |
120 { | |
121 MIX_8BIT_INTRP | |
122 MIX_8BIT_INTRP | |
123 MIX_8BIT_INTRP | |
124 MIX_8BIT_INTRP | |
125 } | |
126 HANDLE_POS_END | |
127 } | |
128 | |
129 SET_BACK_MIXER_POS | |
130 } | |
131 | |
132 static void mix8bRamp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
133 { | |
134 int32_t sample; | |
135 | |
136 GET_MIXER_VARS | |
137 GET_RAMP_VARS | |
138 SET_BASE8 | |
139 | |
140 int32_t CDA_BytesLeft = numSamples; | |
141 while (CDA_BytesLeft > 0) | |
142 { | |
143 LIMIT_MIX_NUM | |
144 LIMIT_MIX_NUM_RAMP | |
145 CDA_BytesLeft -= samplesToMix; | |
146 | |
147 GET_VOL_RAMP | |
148 HANDLE_POS_START | |
149 for (i = 0; i < (samplesToMix & 3); i++) | |
150 { | |
151 MIX_8BIT | |
152 VOL_RAMP | |
153 } | |
154 samplesToMix >>= 2; | |
155 for (i = 0; i < samplesToMix; i++) | |
156 { | |
157 MIX_8BIT | |
158 VOL_RAMP | |
159 MIX_8BIT | |
160 VOL_RAMP | |
161 MIX_8BIT | |
162 VOL_RAMP | |
163 MIX_8BIT | |
164 VOL_RAMP | |
165 } | |
166 HANDLE_POS_END | |
167 SET_VOL_BACK | |
168 } | |
169 | |
170 SET_BACK_MIXER_POS | |
171 } | |
172 | |
173 static void mix8bRampIntrp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
174 { | |
175 int32_t sample, sample2; | |
176 | |
177 GET_MIXER_VARS | |
178 GET_RAMP_VARS | |
179 SET_BASE8 | |
180 | |
181 int32_t CDA_BytesLeft = numSamples; | |
182 while (CDA_BytesLeft > 0) | |
183 { | |
184 LIMIT_MIX_NUM | |
185 LIMIT_MIX_NUM_RAMP | |
186 CDA_BytesLeft -= samplesToMix; | |
187 | |
188 GET_VOL_RAMP | |
189 HANDLE_POS_START | |
190 for (i = 0; i < (samplesToMix & 3); i++) | |
191 { | |
192 MIX_8BIT_INTRP | |
193 VOL_RAMP | |
194 } | |
195 samplesToMix >>= 2; | |
196 for (i = 0; i < samplesToMix; i++) | |
197 { | |
198 MIX_8BIT_INTRP | |
199 VOL_RAMP | |
200 MIX_8BIT_INTRP | |
201 VOL_RAMP | |
202 MIX_8BIT_INTRP | |
203 VOL_RAMP | |
204 MIX_8BIT_INTRP | |
205 VOL_RAMP | |
206 } | |
207 HANDLE_POS_END | |
208 SET_VOL_BACK | |
209 } | |
210 | |
211 SET_BACK_MIXER_POS | |
212 } | |
213 | |
214 static void mix16b(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
215 { | |
216 int32_t sample; | |
217 | |
218 GET_VOL | |
219 GET_MIXER_VARS | |
220 SET_BASE16 | |
221 | |
222 int32_t CDA_BytesLeft = numSamples; | |
223 while (CDA_BytesLeft > 0) | |
224 { | |
225 LIMIT_MIX_NUM | |
226 CDA_BytesLeft -= samplesToMix; | |
227 | |
228 HANDLE_POS_START | |
229 for (i = 0; i < (samplesToMix & 3); i++) | |
230 { | |
231 MIX_16BIT | |
232 } | |
233 samplesToMix >>= 2; | |
234 for (i = 0; i < samplesToMix; i++) | |
235 { | |
236 MIX_16BIT | |
237 MIX_16BIT | |
238 MIX_16BIT | |
239 MIX_16BIT | |
240 } | |
241 HANDLE_POS_END | |
242 } | |
243 | |
244 SET_BACK_MIXER_POS | |
245 } | |
246 | |
247 static void mix16bIntrp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
248 { | |
249 int32_t sample, sample2; | |
250 | |
251 GET_VOL | |
252 GET_MIXER_VARS | |
253 SET_BASE16 | |
254 | |
255 int32_t CDA_BytesLeft = numSamples; | |
256 while (CDA_BytesLeft > 0) | |
257 { | |
258 LIMIT_MIX_NUM | |
259 CDA_BytesLeft -= samplesToMix; | |
260 | |
261 HANDLE_POS_START | |
262 for (i = 0; i < (samplesToMix & 3); i++) | |
263 { | |
264 MIX_16BIT_INTRP | |
265 } | |
266 samplesToMix >>= 2; | |
267 for (i = 0; i < samplesToMix; i++) | |
268 { | |
269 MIX_16BIT_INTRP | |
270 MIX_16BIT_INTRP | |
271 MIX_16BIT_INTRP | |
272 MIX_16BIT_INTRP | |
273 } | |
274 HANDLE_POS_END | |
275 } | |
276 | |
277 SET_BACK_MIXER_POS | |
278 } | |
279 | |
280 static void mix16bRamp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
281 { | |
282 int32_t sample; | |
283 | |
284 GET_MIXER_VARS | |
285 GET_RAMP_VARS | |
286 SET_BASE16 | |
287 | |
288 int32_t CDA_BytesLeft = numSamples; | |
289 while (CDA_BytesLeft > 0) | |
290 { | |
291 LIMIT_MIX_NUM | |
292 LIMIT_MIX_NUM_RAMP | |
293 CDA_BytesLeft -= samplesToMix; | |
294 | |
295 GET_VOL_RAMP | |
296 HANDLE_POS_START | |
297 for (i = 0; i < (samplesToMix & 3); i++) | |
298 { | |
299 MIX_16BIT | |
300 VOL_RAMP | |
301 } | |
302 samplesToMix >>= 2; | |
303 for (i = 0; i < samplesToMix; i++) | |
304 { | |
305 MIX_16BIT | |
306 VOL_RAMP | |
307 MIX_16BIT | |
308 VOL_RAMP | |
309 MIX_16BIT | |
310 VOL_RAMP | |
311 MIX_16BIT | |
312 VOL_RAMP | |
313 } | |
314 HANDLE_POS_END | |
315 SET_VOL_BACK | |
316 } | |
317 | |
318 SET_BACK_MIXER_POS | |
319 } | |
320 | |
321 static void mix16bRampIntrp(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
322 { | |
323 int32_t sample, sample2; | |
324 | |
325 GET_MIXER_VARS | |
326 GET_RAMP_VARS | |
327 SET_BASE16 | |
328 | |
329 int32_t CDA_BytesLeft = numSamples; | |
330 while (CDA_BytesLeft > 0) | |
331 { | |
332 LIMIT_MIX_NUM | |
333 LIMIT_MIX_NUM_RAMP | |
334 CDA_BytesLeft -= samplesToMix; | |
335 | |
336 GET_VOL_RAMP | |
337 HANDLE_POS_START | |
338 for (i = 0; i < (samplesToMix & 3); i++) | |
339 { | |
340 MIX_16BIT_INTRP | |
341 VOL_RAMP | |
342 } | |
343 samplesToMix >>= 2; | |
344 for (i = 0; i < samplesToMix; i++) | |
345 { | |
346 MIX_16BIT_INTRP | |
347 VOL_RAMP | |
348 MIX_16BIT_INTRP | |
349 VOL_RAMP | |
350 MIX_16BIT_INTRP | |
351 VOL_RAMP | |
352 MIX_16BIT_INTRP | |
353 VOL_RAMP | |
354 } | |
355 HANDLE_POS_END | |
356 SET_VOL_BACK | |
357 } | |
358 | |
359 SET_BACK_MIXER_POS | |
360 } | |
361 | |
362 static void mix8bCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
363 { | |
364 int32_t sample; | |
365 | |
366 GET_VOL_CENTER | |
367 GET_MIXER_VARS | |
368 SET_BASE8 | |
369 | |
370 int32_t CDA_BytesLeft = numSamples; | |
371 while (CDA_BytesLeft > 0) | |
372 { | |
373 LIMIT_MIX_NUM | |
374 CDA_BytesLeft -= samplesToMix; | |
375 | |
376 HANDLE_POS_START | |
377 for (i = 0; i < (samplesToMix & 3); i++) | |
378 { | |
379 MIX_8BIT_M | |
380 } | |
381 samplesToMix >>= 2; | |
382 for (i = 0; i < samplesToMix; i++) | |
383 { | |
384 MIX_8BIT_M | |
385 MIX_8BIT_M | |
386 MIX_8BIT_M | |
387 MIX_8BIT_M | |
388 } | |
389 HANDLE_POS_END | |
390 } | |
391 | |
392 SET_BACK_MIXER_POS | |
393 } | |
394 | |
395 static void mix8bIntrpCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
396 { | |
397 int32_t sample, sample2; | |
398 | |
399 GET_VOL_CENTER | |
400 GET_MIXER_VARS | |
401 SET_BASE8 | |
402 | |
403 int32_t CDA_BytesLeft = numSamples; | |
404 while (CDA_BytesLeft > 0) | |
405 { | |
406 LIMIT_MIX_NUM | |
407 CDA_BytesLeft -= samplesToMix; | |
408 | |
409 HANDLE_POS_START | |
410 for (i = 0; i < (samplesToMix & 3); i++) | |
411 { | |
412 MIX_8BIT_INTRP_M | |
413 } | |
414 samplesToMix >>= 2; | |
415 for (i = 0; i < samplesToMix; i++) | |
416 { | |
417 MIX_8BIT_INTRP_M | |
418 MIX_8BIT_INTRP_M | |
419 MIX_8BIT_INTRP_M | |
420 MIX_8BIT_INTRP_M | |
421 } | |
422 HANDLE_POS_END | |
423 } | |
424 | |
425 SET_BACK_MIXER_POS | |
426 } | |
427 | |
428 static void mix8bRampCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
429 { | |
430 int32_t sample; | |
431 | |
432 GET_MIXER_VARS | |
433 GET_RAMP_VARS | |
434 SET_BASE8 | |
435 | |
436 int32_t CDA_BytesLeft = numSamples; | |
437 while (CDA_BytesLeft > 0) | |
438 { | |
439 LIMIT_MIX_NUM | |
440 LIMIT_MIX_NUM_RAMP | |
441 CDA_BytesLeft -= samplesToMix; | |
442 | |
443 GET_VOL_RAMP | |
444 HANDLE_POS_START | |
445 for (i = 0; i < (samplesToMix & 3); i++) | |
446 { | |
447 MIX_8BIT_M | |
448 VOL_RAMP | |
449 } | |
450 samplesToMix >>= 2; | |
451 for (i = 0; i < samplesToMix; i++) | |
452 { | |
453 MIX_8BIT_M | |
454 VOL_RAMP | |
455 MIX_8BIT_M | |
456 VOL_RAMP | |
457 MIX_8BIT_M | |
458 VOL_RAMP | |
459 MIX_8BIT_M | |
460 VOL_RAMP | |
461 } | |
462 HANDLE_POS_END | |
463 SET_VOL_BACK | |
464 } | |
465 | |
466 SET_BACK_MIXER_POS | |
467 } | |
468 | |
469 static void mix8bRampIntrpCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
470 { | |
471 int32_t sample, sample2; | |
472 | |
473 GET_MIXER_VARS | |
474 GET_RAMP_VARS | |
475 SET_BASE8 | |
476 | |
477 int32_t CDA_BytesLeft = numSamples; | |
478 while (CDA_BytesLeft > 0) | |
479 { | |
480 LIMIT_MIX_NUM | |
481 LIMIT_MIX_NUM_RAMP | |
482 CDA_BytesLeft -= samplesToMix; | |
483 | |
484 GET_VOL_RAMP | |
485 HANDLE_POS_START | |
486 for (i = 0; i < (samplesToMix & 3); i++) | |
487 { | |
488 MIX_8BIT_INTRP_M | |
489 VOL_RAMP | |
490 } | |
491 samplesToMix >>= 2; | |
492 for (i = 0; i < samplesToMix; i++) | |
493 { | |
494 MIX_8BIT_INTRP_M | |
495 VOL_RAMP | |
496 MIX_8BIT_INTRP_M | |
497 VOL_RAMP | |
498 MIX_8BIT_INTRP_M | |
499 VOL_RAMP | |
500 MIX_8BIT_INTRP_M | |
501 VOL_RAMP | |
502 } | |
503 HANDLE_POS_END | |
504 SET_VOL_BACK | |
505 } | |
506 | |
507 SET_BACK_MIXER_POS | |
508 } | |
509 | |
510 static void mix16bCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
511 { | |
512 int32_t sample; | |
513 | |
514 GET_VOL_CENTER | |
515 GET_MIXER_VARS | |
516 SET_BASE16 | |
517 | |
518 int32_t CDA_BytesLeft = numSamples; | |
519 while (CDA_BytesLeft > 0) | |
520 { | |
521 LIMIT_MIX_NUM | |
522 CDA_BytesLeft -= samplesToMix; | |
523 | |
524 HANDLE_POS_START | |
525 for (i = 0; i < (samplesToMix & 3); i++) | |
526 { | |
527 MIX_16BIT_M | |
528 } | |
529 samplesToMix >>= 2; | |
530 for (i = 0; i < samplesToMix; i++) | |
531 { | |
532 MIX_16BIT_M | |
533 MIX_16BIT_M | |
534 MIX_16BIT_M | |
535 MIX_16BIT_M | |
536 } | |
537 HANDLE_POS_END | |
538 } | |
539 | |
540 SET_BACK_MIXER_POS | |
541 } | |
542 | |
543 static void mix16bIntrpCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
544 { | |
545 int32_t sample, sample2; | |
546 | |
547 GET_VOL_CENTER | |
548 GET_MIXER_VARS | |
549 SET_BASE16 | |
550 | |
551 int32_t CDA_BytesLeft = numSamples; | |
552 while (CDA_BytesLeft > 0) | |
553 { | |
554 LIMIT_MIX_NUM | |
555 CDA_BytesLeft -= samplesToMix; | |
556 | |
557 HANDLE_POS_START | |
558 for (i = 0; i < (samplesToMix & 3); i++) | |
559 { | |
560 MIX_16BIT_INTRP_M | |
561 } | |
562 samplesToMix >>= 2; | |
563 for (i = 0; i < samplesToMix; i++) | |
564 { | |
565 MIX_16BIT_INTRP_M | |
566 MIX_16BIT_INTRP_M | |
567 MIX_16BIT_INTRP_M | |
568 MIX_16BIT_INTRP_M | |
569 } | |
570 HANDLE_POS_END | |
571 } | |
572 | |
573 SET_BACK_MIXER_POS | |
574 } | |
575 | |
576 static void mix16bRampCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
577 { | |
578 int32_t sample; | |
579 | |
580 GET_MIXER_VARS | |
581 GET_RAMP_VARS | |
582 SET_BASE16 | |
583 | |
584 int32_t CDA_BytesLeft = numSamples; | |
585 while (CDA_BytesLeft > 0) | |
586 { | |
587 LIMIT_MIX_NUM | |
588 LIMIT_MIX_NUM_RAMP | |
589 CDA_BytesLeft -= samplesToMix; | |
590 | |
591 GET_VOL_RAMP | |
592 HANDLE_POS_START | |
593 for (i = 0; i < (samplesToMix & 3); i++) | |
594 { | |
595 MIX_16BIT_M | |
596 VOL_RAMP | |
597 } | |
598 samplesToMix >>= 2; | |
599 for (i = 0; i < samplesToMix; i++) | |
600 { | |
601 MIX_16BIT_M | |
602 VOL_RAMP | |
603 MIX_16BIT_M | |
604 VOL_RAMP | |
605 MIX_16BIT_M | |
606 VOL_RAMP | |
607 MIX_16BIT_M | |
608 VOL_RAMP | |
609 } | |
610 HANDLE_POS_END | |
611 SET_VOL_BACK | |
612 } | |
613 | |
614 SET_BACK_MIXER_POS | |
615 } | |
616 | |
617 static void mix16bRampIntrpCenter(CIType *v, uint32_t numSamples, uint32_t bufferPos) | |
618 { | |
619 int32_t sample, sample2; | |
620 | |
621 GET_MIXER_VARS | |
622 GET_RAMP_VARS | |
623 SET_BASE16 | |
624 | |
625 int32_t CDA_BytesLeft = numSamples; | |
626 while (CDA_BytesLeft > 0) | |
627 { | |
628 LIMIT_MIX_NUM | |
629 LIMIT_MIX_NUM_RAMP | |
630 CDA_BytesLeft -= samplesToMix; | |
631 | |
632 GET_VOL_RAMP | |
633 HANDLE_POS_START | |
634 for (i = 0; i < (samplesToMix & 3); i++) | |
635 { | |
636 MIX_16BIT_INTRP_M | |
637 VOL_RAMP | |
638 } | |
639 samplesToMix >>= 2; | |
640 for (i = 0; i < samplesToMix; i++) | |
641 { | |
642 MIX_16BIT_INTRP_M | |
643 VOL_RAMP | |
644 MIX_16BIT_INTRP_M | |
645 VOL_RAMP | |
646 MIX_16BIT_INTRP_M | |
647 VOL_RAMP | |
648 MIX_16BIT_INTRP_M | |
649 VOL_RAMP | |
650 } | |
651 HANDLE_POS_END | |
652 SET_VOL_BACK | |
653 } | |
654 | |
655 SET_BACK_MIXER_POS | |
656 } | |
657 | |
658 mixRoutine mixRoutineTable[16] = | |
659 { | |
660 (mixRoutine)mix8b, | |
661 (mixRoutine)mix8bIntrp, | |
662 (mixRoutine)mix8bRamp, | |
663 (mixRoutine)mix8bRampIntrp, | |
664 (mixRoutine)mix16b, | |
665 (mixRoutine)mix16bIntrp, | |
666 (mixRoutine)mix16bRamp, | |
667 (mixRoutine)mix16bRampIntrp, | |
668 (mixRoutine)mix8bCenter, | |
669 (mixRoutine)mix8bIntrpCenter, | |
670 (mixRoutine)mix8bRampCenter, | |
671 (mixRoutine)mix8bRampIntrpCenter, | |
672 (mixRoutine)mix16bCenter, | |
673 (mixRoutine)mix16bIntrpCenter, | |
674 (mixRoutine)mix16bRampCenter, | |
675 (mixRoutine)mix16bRampIntrpCenter | |
676 }; |