--- np2/win9x/soundmng.cpp 2005/03/02 04:28:08 1.11 +++ np2/win9x/soundmng.cpp 2007/10/28 16:01:35 1.15 @@ -14,7 +14,13 @@ #include "mt32snd.h" #endif +#if defined(_M_IA64) || defined(_M_AMD64) +#define SOUNDBUFFERALIGN (1 << 3) +#else +#define SOUNDBUFFERALIGN (1 << 2) +#endif +#if !defined(_WIN64) #ifdef __cplusplus extern "C" { #endif @@ -22,6 +28,7 @@ void __fastcall satuation_s16mmx(SINT16 #ifdef __cplusplus } #endif +#endif #if 1 @@ -79,11 +86,13 @@ UINT soundmng_create(UINT rate, UINT ms) UINT samples; DSBUFFERDESC dsbdesc; PCMWAVEFORMAT pcmwf; + int i; if ((pDSound == NULL) || (rate != 11025) && (rate != 22050) && (rate != 44100)) { goto stcre_err1; } + if (ms < 40) { ms = 40; } @@ -95,7 +104,7 @@ UINT soundmng_create(UINT rate, UINT ms) // keydispr_delayinit((UINT8)((ms * 10 + 563) / 564)); samples = (rate * ms) / 2000; - samples = (samples + 3) & (~3); + samples = (samples + SOUNDBUFFERALIGN - 1) & (~(SOUNDBUFFERALIGN - 1)); dsstreambytes = samples * 2 * sizeof(SINT16); soundmng_setreverse(FALSE); @@ -107,14 +116,19 @@ UINT soundmng_create(UINT rate, UINT ms) pcmwf.wf.nBlockAlign = 2 * sizeof(SINT16); pcmwf.wf.nAvgBytesPerSec = rate * 2 * sizeof(SINT16); - ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); - dsbdesc.dwSize = DSBUFFERDESC_SIZE; - dsbdesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | + for (i=0; i<2; i++) { + ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); + dsbdesc.dwSize = i ? sizeof(dsbdesc) : DSBUFFERDESC_SIZE; + dsbdesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2; - dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; - dsbdesc.dwBufferBytes = dsstreambytes * 2; - if (FAILED(pDSound->CreateSoundBuffer(&dsbdesc, &pDSData3, NULL))) { + dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; + dsbdesc.dwBufferBytes = dsstreambytes * 2; + if (SUCCEEDED(pDSound->CreateSoundBuffer(&dsbdesc, &pDSData3, NULL))) { + break; + } + } + if (i >= 2) { goto stcre_err2; } @@ -122,11 +136,12 @@ UINT soundmng_create(UINT rate, UINT ms) vermouth_module = midimod_create(rate); midimod_loadall(vermouth_module); #endif + #if defined(MT32SOUND_DLL) mt32sound_setrate(rate); #endif + dsstreamevent = (UINT8)-1; - soundmng_reset(); return(samples); stcre_err2: @@ -257,12 +272,16 @@ void soundmng_sync(void) { void soundmng_setreverse(BOOL reverse) { if (!reverse) { +#if !defined(_WIN64) if (mmxflag) { fnmix = satuation_s16; } else { fnmix = satuation_s16mmx; } +#else + fnmix = satuation_s16; +#endif } else { fnmix = satuation_s16x;