Subversion Repositories Kolibri OS

Rev

Rev 298 | Blame | Last modification | View Log | Download | RSS feed

  1. // Emacs style mode select   -*- C++ -*-
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. //      System interface for sound.
  21. //
  22. //-----------------------------------------------------------------------------
  23.  
  24. static const char
  25. rcsid[] = "$Id: i_unix.c,v 1.5 1997/02/03 22:45:10 b1 Exp $";
  26.  
  27. #include "sounds.h"
  28.  
  29. char MsgText[256];
  30. void WriteDebug(char *);
  31.  
  32. #define NUM_SOUND_FX 128
  33. #define SB_SIZE      20480
  34.  
  35. void CreateSoundBuffer(int Channel, int length, unsigned char *data);
  36. void I_PlaySoundEffect(int sfxid, int Channel, int volume, int pan);
  37. void DS_Error( HRESULT hresult, char *msg );
  38.  
  39. LPDIRECTSOUND8       lpDS;
  40. LPDIRECTSOUNDBUFFER  lpMix[2];
  41. extern int gametic;
  42. int swap_stereo;
  43.  
  44. static int mixbuff=0;
  45.  
  46. // Needed for calling the actual sound output.
  47. #define SAMPLECOUNT   512
  48. #define NUM_CHANNELS  16
  49. // It is 2 for 16bit, and 2 for two channels.
  50. #define BUFMUL        4
  51. #define MIXBUFFERSIZE (SAMPLECOUNT*BUFMUL)
  52.  
  53. #define SAMPLERATE        11025 // Hz
  54. #define SAMPLESIZE        2     // 16bit
  55.  
  56. extern HWND win;
  57.  
  58. void I_CreateSound(void)
  59. {
  60.   HRESULT        hret;
  61.   int            buff;
  62.   DSBUFFERDESC   dsbd;
  63.   WAVEFORMATEX   wfx;
  64.  
  65.   hret = DirectSoundCreate8(NULL, &lpDS, NULL);
  66.   if (hret != DS_OK)
  67.   {
  68.      //printf("failed DirectSoundCreate");
  69.      return;
  70.   }
  71.  
  72.   hret = lpDS->lpVtbl->SetCooperativeLevel(lpDS, win, DSSCL_PRIORITY);
  73.   if (hret != DS_OK)
  74.        //printf("failled DirectSound.SetCooperativeLevel");
  75.  
  76.   memset( &wfx,0, sizeof(WAVEFORMATEX) );
  77.   wfx.wFormatTag      = WAVE_FORMAT_PCM;
  78.   wfx.nChannels       = 2;
  79.   wfx.nSamplesPerSec  = 11025;
  80.   wfx.wBitsPerSample  = 16;
  81.   wfx.nBlockAlign     = 4;
  82.   wfx.nAvgBytesPerSec = 44100;
  83.  
  84.   memset(&dsbd,0,sizeof(DSBUFFERDESC));
  85.   dsbd.dwSize        = sizeof(DSBUFFERDESC);
  86.   dsbd.dwFlags       = 0;
  87.   dsbd.dwBufferBytes = MIXBUFFERSIZE;
  88.   dsbd.lpwfxFormat   = &wfx;
  89.  
  90.   hret=lpDS->lpVtbl->CreateSoundBuffer(lpDS,&dsbd, &lpMix[0], NULL);
  91.   hret=lpDS->lpVtbl->CreateSoundBuffer(lpDS,&dsbd, &lpMix[1], NULL);
  92.  
  93.  
  94.   return;
  95. };
  96.  
  97. void ShutdownDirectSound(void)
  98. {
  99.   int buff;
  100.   DWORD BufferStatus;
  101.  
  102.   if (lpMix[0] !=NULL)
  103.      lpMix[0]->lpVtbl->Release(lpMix[0]);
  104.   if(lpDS != NULL)
  105.      lpDS->lpVtbl->Release(lpDS);
  106. }
  107.  
  108. void I_SubmitSound(signed short *mixbuffer)
  109. {
  110.   DWORD hret;
  111.   void* pPtr1=NULL,*pPtr2=NULL;
  112.   DWORD dwSize1=0,dwSize2=0;
  113.  
  114.   hret = lpMix[mixbuff]->lpVtbl->Stop(lpMix[mixbuff]);
  115.   hret = lpMix[mixbuff]->lpVtbl->SetCurrentPosition(lpMix[mixbuff],0);
  116.  
  117.   hret=lpMix[mixbuff]->lpVtbl->Lock(lpMix[mixbuff],0,MIXBUFFERSIZE,&pPtr1,
  118.                            &dwSize1,&pPtr2,&dwSize2,0);
  119.   if (hret!=DS_OK)
  120.   {     //printf("Error locking on play start");
  121.         return ;
  122.   }
  123.   memcpy(pPtr1, (void*)mixbuffer, MIXBUFFERSIZE);
  124.   hret-lpMix[mixbuff]->lpVtbl->Unlock(lpMix[mixbuff],pPtr1, dwSize1, pPtr2, dwSize2);
  125.   hret = lpMix[mixbuff]->lpVtbl->Play(lpMix[mixbuff],0,0,0);
  126.   mixbuff= (mixbuff+1)&1;
  127.  
  128. };
  129.