www.codeworx.org/directx_tuts/Einführung in DirectSound Teil 4

Einführung in DirectSound Teil 4
Datum: 31.8.00
Autor: Tim-Oliver Husser

LoadWave ()
Mit der Funktion LoadWave wird - wie der Name schon sagt - eine Wave-Datei (*.Wav) geladen.
Dieser Teil ist etwas komplizierter und ich werde auf eine Erklärung verzichten.
Der erste Teil der Funktion lädt die Datei in den Speicher:

bool LoadWave (char *filename)
{
   HMMIO wavefile;
   wavefile = mmioOpen (filename, 0, MMIO_READ | MMIO_ALLOCBUF);

   if (wavefile == NULL)
   {
      return (false);
   }
   MMCKINFO parent;
   memset (&parent, 0, sizeof(MMCKINFO));
   parent.fccType = mmioFOURCC ('W', 'A', 'V', 'E');
   mmioDescend (wavefile, &parent, 0, MMIO_FINDRIFF);
   MMCKINFO child;
   memset (&child, 0, sizeof(MMCKINFO));
   child.fccType = mmioFOURCC ('f', 'm', 't', ' ');
   mmioDescend (wavefile, &child, &parent, 0);
   WAVEFORMATEX wavefmt;
   mmioRead (wavefile, (char*)&wavefmt, sizeof(wavefmt));

   if(wavefmt.wFormatTag != WAVE_FORMAT_PCM)
   {
      return (false);
   }
   mmioAscend (wavefile, &child, 0);
   child.ckid = mmioFOURCC ('d', 'a', 't', 'a');
   mmioDescend (wavefile, &child, &parent, MMIO_FINDCHUNK);

Dann wird ein DirectSoundBuffer erstellt (die Variable dsbSound). Er nimmt den Sound in einem DirectSound-Format auf:

   DSBUFFERDESC bufdesc;
   memset (&bufdesc, 0, sizeof(DSBUFFERDESC));
   bufdesc.dwSize = sizeof(DSBUFFERDESC);
   bufdesc.dwFlags = 0;
   bufdesc.dwBufferBytes = child.cksize;
   bufdesc.lpwfxFormat = &wavefmt;

   if((lpDirectSound->CreateSoundBuffer (&bufdesc, &dsbSound, NULL))    != DS_OK)
   {
      return (false);
   }

Zum Schluß wird der Buffer mit den Daten gefüllt:

   void *write1 = 0, *write2 = 0;
   unsigned long length1,length2;
   dsbSound->Lock (0, child.cksize, &write1, &length1, &write2, &length2, 0);
   if(write1 > 0)
   mmioRead (wavefile, (char*)write1, length1);
   if (write2 > 0)
   mmioRead (wavefile, (char*)write2, length2);
   dsbSound->Unlock (write1, length1, write2, length2);
   mmioClose (wavefile, 0);
   return (true);
}

So, das wars erst einmal wieder. Im nächsten Teil des Tutorials geht es darum, wie man den eben erstellten Sound abspielt.