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
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 }