14static int gMultiVoiceNum = 0;
16static volatile int g_AutoDmaIntrCount = 0;
17static int g_AutoDmaInProcessing = 0;
22static char seq_table[3520];
25static char spu_malloc_rec[1032];
27static int gRpcArg[384];
28static char status[24];
32static u8 *g_AutoDmaBuf;
33static int g_AutoDmaBufSize;
37static void AutoDmaStatusCB(
void)
39 if ( g_AutoDmaIntrCount < 4 && g_AutoDmaIntrCount >= 0 )
40 g_AutoDmaIntrCount += 1;
44static void AutoDmaClearBuffer(
void)
46 SpuSetTransferStartAddr(0x4800u);
48 SpuIsTransferCompleted(1);
53void sce_spu2_loop(
void *userdata)
64 sceSifSetRpcQueue(&qd, GetThreadId());
65 sceSifRegisterRpc(&sd, sce_SPU_DEV, (SifRpcFunc_t)spuFunc, gRpcArg, 0, 0, &qd);
69int AutoDmaWaitForCompletion(
unsigned int played_size,
int start_wait_count)
71 for ( ; start_wait_count <= 949999; start_wait_count += 1 )
76 v3 = SpuAutoDMAGetStatus();
77 if ( (((v3 >> 24)) & 0xFF) == 1 )
78 v4 = (v3 & 0xFFFFFF) - (u32)g_AutoDmaBuf - g_AutoDmaBufSize / 2;
80 v4 = (v3 & 0xFFFFFF) - (u32)g_AutoDmaBuf;
81 if ( v4 >= played_size )
83 __asm__ __volatile__(
"" :
"+g"(start_wait_count) : :);
85 return start_wait_count;
88void *spuFunc(
unsigned int command,
void *data,
int size)
98 ret = SpuSetCore(*((u32 *)data + 1));
101 SpuSetKey(*((u32 *)data + 1), *((u32 *)data + 2));
104 ret = SpuSetReverb(*((u32 *)data + 1));
107 ret = SpuClearReverbWorkArea(*((u32 *)data + 1));
110 SpuSetReverbEndAddr(*((u32 *)data + 1));
113 SpuSetReverbModeDepth(*((u16 *)data + 2), *((u16 *)data + 4));
116 ret = SpuSetReverbVoice(*((u32 *)data + 1), *((u32 *)data + 2));
119 ret = SpuSetIRQ(*((u32 *)data + 1));
122 ret = SpuSetIRQAddr(*((u32 *)data + 1));
125 ret = SpuSetTransferMode(*((u32 *)data + 1));
128 ret = SpuSetTransferStartAddr(*((u32 *)data + 1));
131 ret = SpuWrite(*((u8 **)data + 1), *((u32 *)data + 2));
134 ret = SpuWrite0(*((u32 *)data + 1));
137 ret = SpuIsTransferCompleted(*((u32 *)data + 1));
140 ret = SpuGetReverbEndAddr();
143 ret = SpuWritePartly(*((u8 **)data + 1), *((u32 *)data + 2));
149 ret = SpuIsReverbWorkAreaReserved(*((u32 *)data + 1));
152 ret = SpuMallocWithStartAddr(*((u32 *)data + 1), *((u32 *)data + 2));
155 ret = SpuRead(*((u8 **)data + 1), *((u32 *)data + 2));
158 ret = SpuReadDecodedData(*((
SpuDecodedData **)data + 1), *((u32 *)data + 2));
161 ret = SpuReserveReverbWorkArea(*((u32 *)data + 1));
164 ret = SpuSetMute(*((u32 *)data + 1));
167 ret = SpuSetNoiseClock(*((u32 *)data + 1));
170 ret = SpuSetNoiseVoice(*((u32 *)data + 1), *((u32 *)data + 2));
173 ret = SpuSetPitchLFOVoice(*((u32 *)data + 1), *((u32 *)data + 2));
176 ret = SpuStGetStatus();
179 ret = SpuStGetVoiceStatus();
182 ret = SpuInitMalloc(*((u32 *)data + 1), spu_malloc_rec);
185 ret = SpuMalloc(*((u32 *)data + 1));
189 gStPtr = SpuStInit(*((u32 *)data + 1));
191 SpuStSetPreparationFinishedCallback(spustCB_preparation_finished);
192 SpuStSetTransferFinishedCallback(spustCB_transfer_finished);
193 SpuStSetStreamFinishedCallback(spustCB_stream_finished);
201 memcpy(gStPtr, &gStBuff,
sizeof(
SpuStEnv));
202 ret = SpuStTransfer(*((u32 *)data + 1), *((u32 *)data + 2));
206 ret = SpuStSetCore(*((u32 *)data + 1));
209 ret = SpuGetIRQAddr();
212 ret = SpuFlush(*((u32 *)data + 1));
215 SpuFree(*((u32 *)data + 1));
224 ret = SpuGetNoiseClock();
227 ret = SpuGetNoiseVoice();
230 ret = SpuGetPitchLFOVoice();
233 ret = SpuGetReverb();
236 ret = SpuGetReverbVoice();
239 ret = SpuGetTransferMode();
242 ret = SpuGetTransferStartAddr();
245 ret = SpuGetKeyStatus(*((u32 *)data + 1));
250 ret = SpuAutoDMAWrite(*((u8 **)data + 1), *((u32 *)data + 2), *((u32 *)data + 3));
252 if ( g_AutoDmaInProcessing )
264 AutoDmaClearBuffer();
266 SpuAutoDMASetCallback(AutoDmaStatusCB);
267 g_AutoDmaBuf = (u8 *)*((u32 *)data + 1);
268 g_AutoDmaBufSize = *((u32 *)data + 2);
269 v7 = (u32 *)(g_AutoDmaBuf + 0x3000);
270 memset((
void *)g_AutoDmaBuf, 0, 0x3000);
271 for ( ii = 0; ii < 512; ii += 128 )
273 for ( jj = 0; jj < 128; jj += 1 )
275 v7[jj] = v7[jj] / 512 * (jj + ii);
277 for ( kk = 0; kk < 128; kk += 1 )
279 v7[kk] = v7[kk] / 512 * (kk + ii);
282 g_AutoDmaIntrCount = 10;
283 ret = SpuAutoDMAWrite(*((u8 **)data + 1), *((u32 *)data + 2), *((u32 *)data + 3));
284 g_AutoDmaInProcessing = 1;
309 if ( g_AutoDmaInProcessing )
311 v11 = SpuAutoDMAGetStatus();
312 if ( v11 >> 24 == 1 )
313 v5 = (v11 & 0xFFFFFF) - (u32)g_AutoDmaBuf - g_AutoDmaBufSize / 2;
315 v5 = (v11 & 0xFFFFFF) - (u32)g_AutoDmaBuf;
322 while ( v5 <= 0xefff )
324 v5 = SpuAutoDMAGetStatus();
326 v5 = (v5 & 0xFFFFFF) - (u32)g_AutoDmaBuf - g_AutoDmaBufSize / 2;
328 v5 = (v5 & 0xFFFFFF) - (u32)g_AutoDmaBuf;
334 g_AutoDmaIntrCount = 0;
336 if ( v11 >> 24 == 1 )
338 v3 = (u32 *)g_AutoDmaBuf;
339 v4 = (
void *)(g_AutoDmaBufSize / 2 + g_AutoDmaBuf);
343 v3 = (u32 *)(g_AutoDmaBufSize / 2 + g_AutoDmaBuf);
344 v4 = (
void *)g_AutoDmaBuf;
350 v19 = ((v5 + 1023) / 1024) << 10;
351 v20 = 0x2000 - ((v19 + ((((v5 + 1023) / 1024) & 0x200000) != 0 ? 0x3FF : 0)) >> 10 << 7);
353 g_AutoDmaIntrCount = 0;
355 if ( v11 >> 24 == 1 )
357 v3 = (u32 *)(g_AutoDmaBufSize / 2 + g_AutoDmaBuf);
358 v4 = (
void *)g_AutoDmaBuf;
362 v3 = (u32 *)g_AutoDmaBuf;
363 v4 = (
void *)(g_AutoDmaBufSize / 2 + g_AutoDmaBuf);
367 for ( j = 0; j < 0x2000; j += 128 )
369 for ( k = 0; k < 128; k += 1 )
371 v3[k] = v3[k] / 0x2000 * (0x2000 - j - k);
373 for ( m = 0; m < 128; m += 1 )
375 v3[m] = v3[m] / 0x2000 * (0x2000 - j - m);
378 memset(v4, 0, g_AutoDmaBufSize / 2);
379 g_AutoDmaIntrCount = 0;
380 for ( n = 0; g_AutoDmaIntrCount < 2 && n <= 949999; n += 1 )
382 __asm__ __volatile__(
"" :
"+g"(n) : :);
386 for ( j = 0; j < v20; j += 128 )
388 for ( k = 0; k < 128; k += 1 )
392 if ( v20 == -1 && *v12 == 0x80000000 )
394 v12[k] = v12[k] / v20 * (v20 - k - j);
396 for ( m = 0; m < 128; m += 1 )
400 if ( v20 == -1 && *v12 == 0x80000000 )
402 v12[m] = v12[m] / v20 * (v20 - m - j);
406 memset(v12, 0, sizea);
410 for ( ; g_AutoDmaIntrCount <= 0 && n <= 949999; n += 1 )
412 __asm__ __volatile__(
"" :
"+g"(n) : :);
414 memset(v4, 0, g_AutoDmaBufSize / 2);
415 for ( ; g_AutoDmaIntrCount < 2 && n <= 949999; n += 1 )
417 __asm__ __volatile__(
"" :
"+g"(n) : :);
422 n = AutoDmaWaitForCompletion(0xF000u, 0);
423 memset(v4, 0, g_AutoDmaBufSize / 2);
424 for ( ; g_AutoDmaIntrCount <= 0 && n <= 949999; n += 1 )
426 __asm__ __volatile__(
"" :
"+g"(n) : :);
429 memset(v3, 0, g_AutoDmaBufSize / 2);
430 AutoDmaWaitForCompletion(0x4001 - sizea, n);
434 AutoDmaClearBuffer();
436 g_AutoDmaInProcessing = 0;
442 ret = SpuAutoDMAGetStatus();
445 SpuSetAutoDMAAttr(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6), *((u16 *)data + 8));
448 SpuSetSerialInAttr(*((u16 *)data + 2), *((u16 *)data + 4));
451 gMultiVoiceNum = *((u32 *)data + 1);
454 SpuSetDigitalOut(*((u32 *)data + 1));
457 ret = SsBlockVoiceAllocation();
463 SsChannelMute(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3));
466 ret = SsGetActualProgFromProg(*((u16 *)data + 2), *((u16 *)data + 4));
469 ret = SsGetChannelMute(*((u16 *)data + 2), *((u16 *)data + 4));
472 ret = (int)SsGetCurrentPoint(*((u16 *)data + 2), *((u16 *)data + 4));
475 ret = SsGetVoiceMask();
481 ret = SsIsEos(*((u16 *)data + 2), *((u16 *)data + 4));
484 SsAllocateVoices(*((u8 *)data + 4), *((u8 *)data + 8));
487 SsPitchCorrect(*((u16 *)data + 2));
490 ret = (u16)SsPitchFromNote(*((u16 *)data + 2), *((u16 *)data + 4), *((u8 *)data + 12), *((u8 *)data + 16));
493 SsPlayBack(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
496 SsQueueKeyOn(*((u32 *)data + 1));
499 SsQueueReverb(*((u32 *)data + 1), *((u32 *)data + 2));
505 SsSetTableSize(seq_table, *((u16 *)data + 4), *((u16 *)data + 6));
508 SsSetTickMode(*((u32 *)data + 1));
511 SsSepClose(*((u16 *)data + 2));
514 ret = SsSepOpen((
unsigned int *)data + 1, *((u16 *)data + 4), *((u16 *)data + 6));
517 SsSepPause(*((u16 *)data + 2), *((u16 *)data + 4));
520 SsSepPlay(*((u16 *)data + 2), *((u16 *)data + 4), *((u8 *)data + 12), *((u16 *)data + 8));
523 SsSepReplay(*((u16 *)data + 2), *((u16 *)data + 4));
526 SsSepSetAccelerando(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3), *((u32 *)data + 4));
529 SsSepSetCrescendo(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6), *((u32 *)data + 4));
532 SsSepSetDecrescendo(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6), *((u32 *)data + 4));
535 SsSepSetRitardando(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3), *((u32 *)data + 4));
538 SsSepSetVol(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6), *((u16 *)data + 8));
541 SsSepStop(*((u16 *)data + 2), *((u16 *)data + 4));
544 SsSeqGetVol(*((u16 *)data + 2), *((u16 *)data + 4), (s16 *)data + 6, (s16 *)data + 8);
547 ret = SsSeqOpen(*((
unsigned int **)data + 1), *((u16 *)data + 4));
550 SsSeqPause(*((u16 *)data + 2));
559 *((u16 *)data + 12));
562 SsSeqReplay(*((u16 *)data + 2));
565 SsSeqSetAccelerando(*((u16 *)data + 2), *((u32 *)data + 2), *((u32 *)data + 3));
568 SsSeqSetCrescendo(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3));
571 SsSeqSetDecrescendo(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3));
574 SsSeqSetRitardando(*((u16 *)data + 2), *((u32 *)data + 2), *((u32 *)data + 3));
577 SsSeqSetNext(*((u16 *)data + 2), *((u16 *)data + 4));
583 SsSeqClose(*((u16 *)data + 2));
586 SsSeqPlay(*((u16 *)data + 2), *((u8 *)data + 8), *((u16 *)data + 6));
589 SsSeqSetVol(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
592 SsSeqSkip(*((u16 *)data + 2), *((u16 *)data + 4), *((u8 *)data + 12), *((u16 *)data + 8));
595 SsSeqStop(*((u16 *)data + 2));
598 SsSetAutoKeyOffMode(*((u16 *)data + 2));
601 SsSetCurrentPoint(*((u16 *)data + 2), *((u16 *)data + 4), *((u8 **)data + 3));
604 SsSetLoop(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
610 SsSetMVol(*((u16 *)data + 2), *((u16 *)data + 4));
613 SsSetNext(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6), *((u16 *)data + 8));
616 ret = SsSetReservedVoice(*((u8 *)data + 4));
622 SsSetTempo(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
625 SsSetVoiceMask(*((u32 *)data + 1));
634 ret = SsUnBlockVoiceAllocation();
640 ret = SsUtGetVagAddr(*((u16 *)data + 2), *((u16 *)data + 4));
643 ret = SsUtGetVagAddrFromTone(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
646 ret = SsUtGetVBaddrInSB(*((u16 *)data + 2));
649 SsVabClose(*((u16 *)data + 2));
652 ret = SsVabOpenHead(*((u8 **)data + 1), *((u16 *)data + 4));
655 ret = SsVabTransBodyPartly(*((u8 **)data + 1), *((u32 *)data + 2), *((u16 *)data + 6));
658 ret = SsVabTransCompleted(*((u16 *)data + 2));
661 SsVabTransBody(*((u8 **)data + 1), *((u16 *)data + 4));
664 ret = SsVoiceCheck(*((u32 *)data + 1), *((u32 *)data + 2), *((u16 *)data + 6));
667 ret = SsVoKeyOff(*((u32 *)data + 1), *((u32 *)data + 2));
670 ret = SsVoKeyOn(*((u32 *)data + 1), *((u32 *)data + 2), *((u16 *)data + 6), *((u16 *)data + 8));
673 ret = SsVabOpenHeadSticky(*((u8 **)data + 1), *((u16 *)data + 4), *((u32 *)data + 3));
686 ret = (s16)StVabOpen(*((s16 **)data + 1), *((u32 *)data + 2), *((u32 *)data + 3));
689 ret = (s16)StVabOpenFakeBody(*((u32 *)data + 1), *((u32 *)data + 2));
692 StVabOpenCompleted();
695 ret = (s16)StVabClose(*((u16 *)data + 2));
698 ret = (s16)StBgmOpen(*((u16 *)data + 2), *((u32 *)data + 2));
701 StSetTickMode(*((u16 *)data + 2));
704 ret = (s16)StBgmClose(*((u16 *)data + 2));
707 StSetReverbType(*((u16 *)data + 2), *((u16 *)data + 4));
710 StSetReverbDepth(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
713 StSetReverbDelaytime(*((u16 *)data + 2), *((u16 *)data + 4));
716 StSetReverbFeedback(*((u16 *)data + 2), *((u16 *)data + 4));
719 ret = StGetSlotStatus(*((u16 *)data + 2));
722 StSetSbClear(*((u32 *)data + 1));
725 StSetMasterVol(*((u16 *)data + 2), *((u16 *)data + 4), *((u16 *)data + 6));
728 ret = (s16)StSetBgmVol(*((u16 *)data + 2), *((u16 *)data + 4));
731 StBgmPlay(*((u16 *)data + 2));
734 StBgmStop(*((u16 *)data + 2), *((u16 *)data + 4), *((u32 *)data + 3));
737 StSetBgmTempo(*((u16 *)data + 2), *((u16 *)data + 4));
740 ret = (s16)StGetBgmTempo(*((u16 *)data + 2));
743 ret = (s16)StGetBgmStatus();
746 ret = (s16)StGetBgmChStatus();
749 ret = (s16)StDmaWrite(*((s16 **)data + 1), *((u32 *)data + 2), *((u32 *)data + 3));
752 ret = (s16)StDmaRead(*((u32 *)data + 1), *((u8 **)data + 2), *((u32 *)data + 3));
755 ret = SetTimer(&common);
758 ret = ReleaseTimer();
761 ret = StSePlay(*((u16 *)data + 2), *((u16 *)data + 4));
764 ret = StSetSeVol(*((u16 *)data + 2), *((u16 *)data + 4));
769 SpuGetCommonAttr(&c_attr);
774 s_attr.voice = *((u32 *)data + 2);
775 SpuGetVoiceAttr(&s_attr);
780 SpuGetReverbModeParam(&r_attr);
785 SpuGetAllKeysStatus(status);
801 SpuSetEnv((
const SpuEnv *)data);
807 for ( i = 0; i < gMultiVoiceNum; i += 1 )
812 SpuSetTransferCallback(DMA1CallBackProc);
815 SpuSetIRQCallback(IRQCallBackProc);
818 SpuAutoDMASetCallback(DMA0CallBackProc);
825 param.thread = sce_spust_loop;
828 param.stacksize = 2048;
830 param.stacksize = 4096;
833 gStThid = CreateThread(¶m);
834 StartThread(gStThid, 0);