| 126 | 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 }; |