// Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // // $Id:$ // // Copyright (C) 1993-1996 by id Software, Inc. // // This source is available for distribution and/or modification // only under the terms of the DOOM Source Code License as // published by id Software. All rights reserved. // // The source is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License // for more details. // // $Log:$ // // DESCRIPTION: // System interface for sound. // //----------------------------------------------------------------------------- static const char rcsid[] = "$Id: i_unix.c,v 1.5 1997/02/03 22:45:10 b1 Exp $"; #include #include #include "sounds.h" char MsgText[256]; void WriteDebug(char *); #define NUM_SOUND_FX 128 #define SB_SIZE 20480 void CreateSoundBuffer(int Channel, int length, unsigned char *data); void I_PlaySoundEffect(int sfxid, int Channel, int volume, int pan); void DS_Error( HRESULT hresult, char *msg ); LPDIRECTSOUND8 lpDS; LPDIRECTSOUNDBUFFER lpMix[2]; extern int gametic; int swap_stereo; static int mixbuff=0; // Needed for calling the actual sound output. #define SAMPLECOUNT 512 #define NUM_CHANNELS 16 // It is 2 for 16bit, and 2 for two channels. #define BUFMUL 4 #define MIXBUFFERSIZE (SAMPLECOUNT*BUFMUL) #define SAMPLERATE 11025 // Hz #define SAMPLESIZE 2 // 16bit extern HWND win; void I_CreateSound(void) { HRESULT hret; int buff; DSBUFFERDESC dsbd; WAVEFORMATEX wfx; hret = DirectSoundCreate8(NULL, &lpDS, NULL); if (hret != DS_OK) { printf("failed DirectSoundCreate"); return; } hret = lpDS->lpVtbl->SetCooperativeLevel(lpDS, win, DSSCL_PRIORITY); if (hret != DS_OK) printf("failled DirectSound.SetCooperativeLevel"); memset( &wfx,0, sizeof(WAVEFORMATEX) ); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 2; wfx.nSamplesPerSec = 11025; wfx.wBitsPerSample = 16; wfx.nBlockAlign = 4; wfx.nAvgBytesPerSec = 44100; memset(&dsbd,0,sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = 0; dsbd.dwBufferBytes = MIXBUFFERSIZE; dsbd.lpwfxFormat = &wfx; hret=lpDS->lpVtbl->CreateSoundBuffer(lpDS,&dsbd, &lpMix[0], NULL); hret=lpDS->lpVtbl->CreateSoundBuffer(lpDS,&dsbd, &lpMix[1], NULL); return; }; void ShutdownDirectSound(void) { int buff; DWORD BufferStatus; if (lpMix[0] !=NULL) lpMix[0]->lpVtbl->Release(lpMix[0]); if(lpDS != NULL) lpDS->lpVtbl->Release(lpDS); } void I_SubmitSound(signed short *mixbuffer) { DWORD hret; void* pPtr1=NULL,*pPtr2=NULL; DWORD dwSize1=0,dwSize2=0; hret = lpMix[mixbuff]->lpVtbl->Stop(lpMix[mixbuff]); hret = lpMix[mixbuff]->lpVtbl->SetCurrentPosition(lpMix[mixbuff],0); hret=lpMix[mixbuff]->lpVtbl->Lock(lpMix[mixbuff],0,MIXBUFFERSIZE,&pPtr1, &dwSize1,&pPtr2,&dwSize2,0); if (hret!=DS_OK) { printf("Error locking on play start"); return ; } memcpy(pPtr1, (void*)mixbuffer, MIXBUFFERSIZE); hret-lpMix[mixbuff]->lpVtbl->Unlock(lpMix[mixbuff],pPtr1, dwSize1, pPtr2, dwSize2); hret = lpMix[mixbuff]->lpVtbl->Play(lpMix[mixbuff],0,0,0); mixbuff= (mixbuff+1)&1; };