Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

soundbuffer_static_dx.cpp

Go to the documentation of this file.
00001 
00002 #include "Core/precomp.h"
00003 
00004 #include <iostream>
00005 #include "API/Core/Sound/static_soundprovider.h"
00006 
00007 #include "soundbuffer_playback_dx.h"
00008 #include "soundbuffer_static_dx.h"
00009 
00010 CL_CardSoundBufferStatic_DX::CL_CardSoundBufferStatic_DX(
00011         CL_SoundCard_DX *_parent_card,
00012         CL_SoundBuffer_Generic *buffer,
00013         CL_StaticSoundProvider *provider)
00014 : CL_CardSoundBuffer_Static(provider)
00015 {
00016         this->buffer = buffer;
00017         parent_card = _parent_card;
00018 
00019         int num_channels;
00020         int bps;
00021         HRESULT err;
00022 
00023         switch (provider->get_format())
00024         {
00025         case sf_8bit_signed:
00026                 num_channels = 1;
00027                 bps = 8;
00028                 break;
00029         case sf_8bit_signed_stereo:
00030                 num_channels = 2;
00031                 bps = 8;
00032                 break;
00033         case sf_16bit_signed:
00034                 num_channels = 1;
00035                 bps = 16;
00036                 break;
00037         case sf_16bit_signed_stereo:
00038                 num_channels = 2;
00039                 bps = 16;
00040                 break;
00041         }
00042 
00043         WAVEFORMATEX format;
00044         format.wFormatTag = WAVE_FORMAT_PCM; 
00045         format.nChannels = num_channels; 
00046         format.nSamplesPerSec = provider->get_frequency(); 
00047         format.wBitsPerSample = bps; 
00048         format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8; 
00049         format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; 
00050         format.cbSize = 0; 
00051  
00052         DSBUFFERDESC desc;
00053         desc.dwSize = sizeof(DSBUFFERDESC); 
00054         desc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; 
00055         // DSBCAPS_CTRLDEFAULT has been removed in DirectX7
00056 
00057         desc.dwBufferBytes = provider->data_size(); 
00058         desc.dwReserved = 0; 
00059         desc.lpwfxFormat = &format; 
00060 
00061         soundbuffer = NULL;
00062 
00063         if (parent_card->soundcard != NULL)
00064         {
00065                 err = parent_card->soundcard->CreateSoundBuffer(&desc, &soundbuffer, NULL);
00066                 if (err != DS_OK) std::cout << "ERROR! " << __FILE__ << ": " << __LINE__ << std::endl;
00067                 reload_data(false);
00068         }
00069 }
00070 
00071 CL_CardSoundBufferStatic_DX::~CL_CardSoundBufferStatic_DX()
00072 {
00073         if (soundbuffer != NULL) soundbuffer->Release();
00074 }
00075 
00076 void CL_CardSoundBufferStatic_DX::reload_data(bool lock_provider)
00077 {
00078         if (soundbuffer == NULL) return;
00079 
00080         if (lock_provider) provider->lock();
00081 
00082         char *buffer1;
00083         DWORD num_bytes1;
00084         HRESULT err = soundbuffer->Lock(0, provider->data_size(), (void**) &buffer1, &num_bytes1, NULL, 0, 0);
00085         if (err != DS_OK) std::cout << "ERROR! " << __FILE__ << ": " << __LINE__ << std::endl;
00086 
00087         if (provider->get_format() == sf_8bit_signed)
00088         {
00089                 char *pdata = (char *) provider->get_data();
00090                 char *bpos = buffer1;
00091                 for (int i=0;i<provider->data_size();i++)
00092                 {
00093                         *(bpos++) = (unsigned char) (short(*(pdata++))+128);
00094                 }
00095         }
00096         else
00097         {
00098                 memcpy(buffer1, provider->get_data(), provider->data_size());
00099         }
00100 
00101         err = soundbuffer->Unlock(buffer1, num_bytes1, NULL, 0);
00102         if (err != DS_OK) std::cout << "ERROR! " << __FILE__ << ": " << __LINE__ << std::endl;
00103 
00104         if (lock_provider) provider->unlock();
00105 }
00106 
00107 CL_CardSoundBuffer_Playback *CL_CardSoundBufferStatic_DX::prepare()
00108 {
00109         return new CL_CardSoundBuffer_Playback_DX(this);
00110 }

Generated at Wed Apr 4 19:54:03 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001