UINT soundmng_create(UINT rate, UINT ms) { UINT samples; QSound_Playing = FALSE; if (rate < 11025) { rate = 11025; } else if (rate > 44100) { rate = 44100; } if (SoundChannel_Init()) { goto qsinit_err; } #if !defined(SOUND_CRITICAL) samples = rate * ms / (SOUNDBUFFERS * 1000); samples = (samples + 3) & (~3); #else samples = rate * ms / 1000; samples = (samples + 255) & (~255); #endif if (SoundBuffer_Init(rate, samples)) { goto qsinit_err; } #if defined(VERMOUTH_LIB) cmvermouth_load(rate); #endif return(samples); qsinit_err: soundmng_destroy(); return(0); }
UINT soundmng_create(UINT rate, UINT ms) { SDL_AudioSpec fmt; UINT s; UINT samples; SINT16 *tmp; if (soundmng.opened) { goto smcre_err1; } if (SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0) { fprintf(stderr, "Error: SDL_Init: %s\n", SDL_GetError()); goto smcre_err1; } s = rate * ms / (NSNDBUF * 1000); samples = 1; while(s > samples) { samples <<= 1; } soundmng.nsndbuf = 0; soundmng.samples = samples; for (s=0; s<NSNDBUF; s++) { tmp = (SINT16 *)_MALLOC(samples * 2 * sizeof(SINT16), "buf"); if (tmp == NULL) { goto smcre_err2; } soundmng.buf[s] = tmp; ZeroMemory(tmp, samples * 2 * sizeof(SINT16)); } ZeroMemory(&fmt, sizeof(fmt)); fmt.freq = rate; fmt.format = AUDIO_S16SYS; fmt.channels = 2; fmt.samples = samples; fmt.callback = sound_play_cb; if (SDL_OpenAudio(&fmt, NULL) < 0) { fprintf(stderr, "Error: SDL_OpenAudio: %s\n", SDL_GetError()); return(FAILURE); } #if defined(VERMOUTH_LIB) cmvermouth_load(rate); #endif soundmng.opened = TRUE; return(samples); smcre_err2: for (s=0; s<NSNDBUF; s++) { tmp = soundmng.buf[s]; soundmng.buf[s] = NULL; if (tmp) { _MFREE(tmp); } } smcre_err1: return(0); }