X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=platform%2Fwin32%2FGenaDrive%2FDSound.cpp;h=98fe4a06274d91872ae590cc2de6864ff848bba8;hb=efcba75f8a730340df6c1b679a207723f98d1ee6;hp=9884972af0ba52a4e2a8749b46535b7992422857;hpb=cc68a136aa179a5f32fe40208371eb9c2b0aadae;p=picodrive.git diff --git a/platform/win32/GenaDrive/DSound.cpp b/platform/win32/GenaDrive/DSound.cpp index 9884972..98fe4a0 100644 --- a/platform/win32/GenaDrive/DSound.cpp +++ b/platform/win32/GenaDrive/DSound.cpp @@ -12,14 +12,13 @@ static IDirectSoundBuffer *LoopBuffer=NULL; static int LoopLen=0,LoopWrite=0; // Next position in loop to write short *DSoundNext=NULL; // Buffer for next sound data to put in loop -//int DSoundSeg=0; // Seg length in samples static int LoopBlank() { void *mema=NULL,*memb=NULL; DWORD sizea=0,sizeb=0; - LoopBuffer->Lock(0,LoopLen<<2, &mema,&sizea, &memb,&sizeb, 0); + LoopBuffer->Lock(0,LoopLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0); if (mema) memset(mema,0,sizea); @@ -46,8 +45,9 @@ int DSoundInit() wfx.nAvgBytesPerSec=wfx.nBlockAlign*wfx.nSamplesPerSec; // Make buffer for the next seg to put into the loop: - DSoundNext=(short *)malloc(PsndLen<<2); if (DSoundNext==NULL) return 1; + DSoundNext=(short *)malloc((PsndLen<<2)+64); if (DSoundNext==NULL) return 1; memset(DSoundNext,0,PsndLen<<2); +// lprintf("p %p\n", DSoundNext); // Create the DirectSound interface: DirectSoundCreate(NULL,&DSound,NULL); @@ -79,30 +79,57 @@ void DSoundExit() if (LoopBuffer) LoopBuffer->Stop(); RELEASE(LoopBuffer) RELEASE(DSound) - free(DSoundNext); DSoundNext=NULL; + DSound=0; + if (DSoundNext) free(DSoundNext); DSoundNext=NULL; } static int WriteSeg() { void *mema=NULL,*memb=NULL; DWORD sizea=0,sizeb=0; + int ret; // Lock the segment at 'LoopWrite' and copy the next segment in - LoopBuffer->Lock(LoopWrite<<((PicoOpt&8) ? 2 : 1),PsndLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0); - + ret = LoopBuffer->Lock(LoopWrite<<((PicoOpt&8) ? 2 : 1),PsndLen<<((PicoOpt&8) ? 2 : 1), &mema,&sizea, &memb,&sizeb, 0); + if (ret) lprintf("LoopBuffer->Lock() failed: %i\n", ret); + if (mema) memcpy(mema,DSoundNext,sizea); +// if (memb) memcpy(memb,DSoundNext+sizea,sizeb); + if (sizeb != 0) lprintf("sizeb is not 0! (%i)\n", sizeb); - LoopBuffer->Unlock(mema,sizea, memb,0); + ret = LoopBuffer->Unlock(mema,sizea, memb,0); + if (ret) lprintf("LoopBuffer->Unlock() failed: %i\n", ret); return 0; } +static int DSoundFake() +{ + static int ticks_old = 0; + int ticks = GetTickCount() * 1000; + int diff; + + diff = ticks - ticks_old; + if (diff >= 0 && diff < 1000000/60*4) + { + while (diff >= 0 && diff < 1000000/60) + { + Sleep(1); + diff = GetTickCount()*1000 - ticks_old; + } + ticks_old += 1000000/60; + } + else + ticks_old = ticks; + return 0; +} + int DSoundUpdate() { DWORD play=0; int pos=0; - if (LoopBuffer==NULL) return 1; + if (LoopBuffer==NULL) return DSoundFake(); LoopBuffer->GetCurrentPosition(&play,NULL); pos=play>>((PicoOpt&8) ? 2 : 1); @@ -119,12 +146,3 @@ int DSoundUpdate() return 0; } -void DSoundMute() -{ - LoopBuffer->Stop(); -} - -void DSoundUnMute() -{ - LoopBuffer->Play(0,0,DSBPLAY_LOOPING); -}