home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / CDX.ZIP / Src / Cds / Buffer.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-14  |  3.9 KB  |  145 lines

  1. //////////////////////////////////////////////////////////////////////////////////
  2. // CDS_Buffer Implementation
  3. //////////////////////////////////////////////////////////////////////////////////
  4. #include "CDS.h"
  5.  
  6. //////////////////////////////////////////////////////////////////////////////////
  7. // CDS_Buffer Constructor
  8. //////////////////////////////////////////////////////////////////////////////////
  9. CDS_Buffer::CDS_Buffer()
  10. {
  11.     m_WaveFile = NULL;
  12.     m_Buffer = NULL;
  13.     m_BufferCount = 1;
  14. }
  15.  
  16. //////////////////////////////////////////////////////////////////////////////////
  17. // CDS_Buffer Destructor
  18. //////////////////////////////////////////////////////////////////////////////////
  19. CDS_Buffer::~CDS_Buffer()
  20. {
  21.     if(m_WaveFile)
  22.     {
  23.         delete m_WaveFile;
  24.         m_WaveFile = NULL;
  25.     }
  26.  
  27.     for(int i = 0; i < m_BufferCount; i++)
  28.     {
  29.         m_Buffer[i]->Stop();
  30.         SAFE_RELEASE(m_Buffer[i]);
  31.     }
  32. }
  33.  
  34. //////////////////////////////////////////////////////////////////////////////////
  35. // CDS_Buffer Create
  36. //////////////////////////////////////////////////////////////////////////////////
  37. HRESULT CDS_Buffer::Create(CDS_Sound* sound, char* filename, int count)
  38. {
  39.     HRESULT rval;
  40.     LPVOID Audio;
  41.     DWORD Bytes;
  42.     UINT BytesRead;
  43.     DSBUFFERDESC desc;
  44.     int i;
  45.  
  46.     // Create enough space for the buffers
  47.     m_BufferCount = count;
  48.     m_Buffer = new LPDIRECTSOUNDBUFFER[((m_BufferCount-1) * sizeof(LPDIRECTSOUNDBUFFER))];
  49.     if(m_Buffer == NULL) return -1;
  50.  
  51.     // Open the file and get ready to read
  52.     m_WaveFile = new CDS_WaveFile;
  53.     m_WaveFile->Open(filename);
  54.  
  55.     memset(&desc, 0, sizeof(DSBUFFERDESC));
  56.     desc.dwSize = sizeof(DSBUFFERDESC);
  57.     desc.dwFlags = DSBCAPS_STATIC;
  58.     desc.dwBufferBytes = m_WaveFile->m_nDataSize;
  59.     desc.lpwfxFormat = m_WaveFile->m_pFormat;
  60.  
  61.     rval = sound->GetDS()->CreateSoundBuffer(&desc, &m_Buffer[0], NULL);
  62.     if(rval != DS_OK) goto CREATE_ERROR;
  63.  
  64.     rval = m_Buffer[0]->Lock(0, 0, &Audio, &Bytes, NULL, NULL, DSBLOCK_ENTIREBUFFER);
  65.     if(rval != DS_OK) goto CREATE_ERROR;
  66.  
  67.     // Read the data from the file into the buffer
  68.     BytesRead = m_WaveFile->Read((BYTE*)Audio, Bytes);
  69.  
  70.     rval = m_Buffer[0]->Unlock(Audio, Bytes, NULL, 0);
  71.     if(rval != DS_OK) goto CREATE_ERROR;
  72.  
  73.     for(i = 0; i < m_BufferCount; i++)
  74.         rval = sound->m_DirectSound->DuplicateSoundBuffer(m_Buffer[0], &m_Buffer[i]);
  75.  
  76. CREATE_ERROR:
  77.     return rval;
  78. }
  79.  
  80. //////////////////////////////////////////////////////////////////////////////////
  81. // CDS_Buffer GetFreeBuffer
  82. //////////////////////////////////////////////////////////////////////////////////
  83. LPDIRECTSOUNDBUFFER CDS_Buffer::GetFreeBuffer(void)
  84. {
  85.     LPDIRECTSOUNDBUFFER Buffer;
  86.     DWORD Status;
  87.     int Current = 0;
  88.  
  89.     while(Current < m_BufferCount)
  90.     {
  91.         Buffer = m_Buffer[Current];
  92.         if(Buffer->GetStatus(&Status) < 0) Status = 0;
  93.  
  94.         if((Status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING)
  95.         {
  96.             Buffer = NULL;
  97.             Current++;
  98.         }
  99.         else break;
  100.     }
  101.  
  102.     if(Buffer && (Status & DSBSTATUS_BUFFERLOST))
  103.     {
  104.         if((Buffer->Restore() < 0)) Buffer = NULL;
  105.     }
  106.  
  107.     return Buffer;
  108. }
  109.  
  110. //////////////////////////////////////////////////////////////////////////////////
  111. // CDS_Buffer Play
  112. //////////////////////////////////////////////////////////////////////////////////
  113. HRESULT CDS_Buffer::Play(DWORD flags)
  114. {
  115.     HRESULT rval;
  116.     LPDIRECTSOUNDBUFFER Buffer = NULL;
  117.  
  118.     Buffer = GetFreeBuffer();
  119.     if(Buffer == NULL) return -1;
  120.  
  121.     rval = Buffer->Play(0, 0, flags);
  122.     if(rval != DS_OK) return rval;
  123.  
  124.     return rval;
  125. }
  126.  
  127. //////////////////////////////////////////////////////////////////////////////////
  128. // CDS_Buffer Stop
  129. //////////////////////////////////////////////////////////////////////////////////
  130. HRESULT CDS_Buffer::Stop()
  131. {
  132.     HRESULT rval;
  133.  
  134.     for(int i = 0; i < m_BufferCount; i++)
  135.     {
  136.         rval = m_Buffer[i]->Stop();
  137.         if(rval != DS_OK) return rval;
  138.  
  139.         rval = m_Buffer[i]->SetCurrentPosition(0);
  140.         if(rval != DS_OK) return rval;
  141.     }
  142.  
  143.     return TRUE;
  144. }
  145.