static int LoopLen=0,LoopWrite=0; // Next position in loop to write\r
\r
short *DSoundNext=NULL; // Buffer for next sound data to put in loop\r
-//int DSoundSeg=0; // Seg length in samples\r
\r
static int LoopBlank()\r
{\r
void *mema=NULL,*memb=NULL;\r
DWORD sizea=0,sizeb=0;\r
\r
- LoopBuffer->Lock(0,LoopLen<<2, &mema,&sizea, &memb,&sizeb, 0);\r
+ LoopBuffer->Lock(0,LoopLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0);\r
\r
if (mema) memset(mema,0,sizea);\r
\r
wfx.nAvgBytesPerSec=wfx.nBlockAlign*wfx.nSamplesPerSec;\r
\r
// Make buffer for the next seg to put into the loop:\r
- DSoundNext=(short *)malloc(PsndLen<<2); if (DSoundNext==NULL) return 1;\r
+ DSoundNext=(short *)malloc((PsndLen<<2)+64); if (DSoundNext==NULL) return 1;\r
memset(DSoundNext,0,PsndLen<<2);\r
+// lprintf("p %p\n", DSoundNext);\r
\r
// Create the DirectSound interface:\r
DirectSoundCreate(NULL,&DSound,NULL);\r
if (LoopBuffer) LoopBuffer->Stop();\r
RELEASE(LoopBuffer)\r
RELEASE(DSound)\r
- free(DSoundNext); DSoundNext=NULL;\r
+ DSound=0;\r
+ if (DSoundNext) free(DSoundNext); DSoundNext=NULL;\r
}\r
\r
static int WriteSeg()\r
{\r
void *mema=NULL,*memb=NULL;\r
DWORD sizea=0,sizeb=0;\r
+ int ret;\r
\r
// Lock the segment at 'LoopWrite' and copy the next segment in\r
- LoopBuffer->Lock(LoopWrite<<((PicoOpt&8) ? 2 : 1),PsndLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0);\r
- \r
+ ret = LoopBuffer->Lock(LoopWrite<<((PicoOpt&8) ? 2 : 1),PsndLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0);\r
+ if (ret) lprintf("LoopBuffer->Lock() failed: %i\n", ret);\r
+\r
if (mema) memcpy(mema,DSoundNext,sizea);\r
+// if (memb) memcpy(memb,DSoundNext+sizea,sizeb);\r
+ if (sizeb != 0) lprintf("sizeb is not 0! (%i)\n", sizeb);\r
\r
- LoopBuffer->Unlock(mema,sizea, memb,0);\r
+ ret = LoopBuffer->Unlock(mema,sizea, memb,0);\r
+ if (ret) lprintf("LoopBuffer->Unlock() failed: %i\n", ret);\r
\r
return 0;\r
}\r
\r
+static int DSoundFake()\r
+{\r
+ static int ticks_old = 0;\r
+ int ticks = GetTickCount() * 1000;\r
+ int diff;\r
+\r
+ diff = ticks - ticks_old;\r
+ if (diff >= 0 && diff < 1000000/60*4)\r
+ {\r
+ while (diff >= 0 && diff < 1000000/60)\r
+ {\r
+ Sleep(1);\r
+ diff = GetTickCount()*1000 - ticks_old;\r
+ }\r
+ ticks_old += 1000000/60;\r
+ }\r
+ else\r
+ ticks_old = ticks;\r
+ return 0;\r
+}\r
+\r
int DSoundUpdate()\r
{\r
DWORD play=0;\r
int pos=0;\r
\r
- if (LoopBuffer==NULL) return 1;\r
+ if (LoopBuffer==NULL) return DSoundFake();\r
\r
LoopBuffer->GetCurrentPosition(&play,NULL);\r
pos=play>>((PicoOpt&8) ? 2 : 1);\r
return 0;\r
}\r
\r
-void DSoundMute()\r
-{\r
- LoopBuffer->Stop();\r
-}\r
-\r
-void DSoundUnMute()\r
-{\r
- LoopBuffer->Play(0,0,DSBPLAY_LOOPING);\r
-}\r