00001 00002 #include "Core/precomp.h" 00003 00004 #include <iostream> 00005 00006 #include "API/Core/System/cl_assert.h" 00007 #include "API/Core/Sound/static_soundprovider.h" 00008 00009 #include "soundbuffer_playback_dx.h" 00010 #include "soundbuffer_static_dx.h" 00011 00012 CL_CardSoundBuffer_Playback_DX::CL_CardSoundBuffer_Playback_DX(CL_CardSoundBufferStatic_DX *_parent_buffer) 00013 { 00014 parent_buffer = _parent_buffer; 00015 looping = false; 00016 00017 if (parent_buffer->parent_card->soundcard != NULL) 00018 { 00019 HRESULT err = parent_buffer->parent_card->soundcard->DuplicateSoundBuffer(parent_buffer->soundbuffer, &buffer); 00020 if (err != DS_OK) 00021 { 00022 buffer = NULL; 00023 } 00024 } 00025 else 00026 { 00027 buffer = NULL; 00028 } 00029 } 00030 00031 CL_CardSoundBuffer_Playback_DX::~CL_CardSoundBuffer_Playback_DX() 00032 { 00033 if (buffer != NULL) 00034 { 00035 std::cout << "Released duplicate soundbuffer..." << std::endl; 00036 buffer->Release(); 00037 buffer = NULL; 00038 } 00039 } 00040 00041 void CL_CardSoundBuffer_Playback_DX::check_for_lost() 00042 { 00043 if (buffer == NULL) return; 00044 00045 DWORD status; 00046 buffer->GetStatus(&status); 00047 if (status == DSBSTATUS_BUFFERLOST) 00048 { 00049 std::cout << "Soundbuffer lost" << std::endl; 00050 parent_buffer->reload_data(true); 00051 } 00052 } 00053 00054 int CL_CardSoundBuffer_Playback_DX::get_position() 00055 { 00056 if (buffer == NULL) return -1; 00057 00058 DWORD res, dummy; 00059 00060 buffer->GetCurrentPosition(&res, &dummy); 00061 00062 return res; 00063 } 00064 00065 float CL_CardSoundBuffer_Playback_DX::get_position_relative() 00066 { 00067 if (buffer == NULL) return (float) -1; 00068 00069 DWORD res, dummy; 00070 00071 HRESULT err = buffer->GetCurrentPosition(&res, &dummy); 00072 00073 return float(res) / get_length(); 00074 } 00075 00076 bool CL_CardSoundBuffer_Playback_DX::set_position(int new_pos) 00077 { 00078 if (buffer == NULL) return false; 00079 00080 HRESULT err = buffer->SetCurrentPosition(new_pos); 00081 if (err != DS_OK) return false; 00082 return true; 00083 } 00084 00085 bool CL_CardSoundBuffer_Playback_DX::set_position_relative(float new_pos) 00086 { 00087 if (buffer == NULL) return false; 00088 00089 HRESULT err = buffer->SetCurrentPosition(int(new_pos*get_length())); 00090 if (err != DS_OK) return false; 00091 return true; 00092 } 00093 00094 int CL_CardSoundBuffer_Playback_DX::get_length() 00095 { 00096 if (buffer == NULL) return -1; 00097 00098 return parent_buffer->provider->data_size(); 00099 } 00100 00101 CL_SoundBuffer_Generic *CL_CardSoundBuffer_Playback_DX::get_owner() 00102 { 00103 //This should be inline 00104 return parent_buffer->buffer; 00105 } 00106 00107 int CL_CardSoundBuffer_Playback_DX::get_frequency() 00108 { 00109 if (buffer == NULL) return -1; 00110 00111 DWORD ret; 00112 buffer->GetFrequency(&ret); 00113 return ret; 00114 } 00115 00116 bool CL_CardSoundBuffer_Playback_DX::set_frequency(int new_freq) 00117 { 00118 if (buffer == NULL) return false; 00119 00120 HRESULT err = buffer->SetFrequency(new_freq); 00121 if (err != DS_OK) { std::cout << "SetFreq failed" << std::endl; return false; } 00122 00123 return true; 00124 } 00125 00126 float CL_CardSoundBuffer_Playback_DX::get_volume() 00127 { 00128 if (buffer == NULL) return -1; 00129 00130 long temp; 00131 buffer->GetVolume(&temp); 00132 00133 return pow(10, temp/20); 00134 } 00135 00136 bool CL_CardSoundBuffer_Playback_DX::set_volume(float new_volume) 00137 { 00138 if (buffer == NULL) return false; 00139 00140 if (new_volume == 0) buffer->SetVolume(DSBVOLUME_MIN); 00141 else buffer->SetVolume(100*20*log10(new_volume)); 00142 00143 return true; 00144 } 00145 00146 float CL_CardSoundBuffer_Playback_DX::get_pan() 00147 { 00148 if (buffer == NULL) return -1; 00149 00150 long ret; 00151 buffer->GetPan(&ret); 00152 00153 return ret; 00154 } 00155 00156 bool CL_CardSoundBuffer_Playback_DX::set_pan(float new_pan) 00157 { 00158 if (buffer == NULL) return false; 00159 00160 if (new_pan < 0) 00161 buffer->SetPan(DSBPAN_CENTER-DSBPAN_LEFT*new_pan); 00162 else 00163 buffer->SetPan(DSBPAN_CENTER+DSBPAN_RIGHT*new_pan); 00164 00165 return true; 00166 } 00167 00168 void CL_CardSoundBuffer_Playback_DX::play() 00169 { 00170 if (buffer == NULL) return; 00171 00172 check_for_lost(); 00173 HRESULT err; 00174 00175 int flags = 0; 00176 if (looping) flags = DSBPLAY_LOOPING; 00177 err = buffer->Play(0, 0, flags); 00178 00179 cl_assert(err == DS_OK); 00180 } 00181 00182 void CL_CardSoundBuffer_Playback_DX::stop() 00183 { 00184 if (buffer == NULL) return; 00185 00186 buffer->Stop(); 00187 } 00188 00189 bool CL_CardSoundBuffer_Playback_DX::is_playing() 00190 { 00191 if (buffer == NULL) return false; 00192 00193 DWORD status; 00194 buffer->GetStatus(&status); 00195 00196 return (status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING; 00197 } 00198 00199 void CL_CardSoundBuffer_Playback_DX::set_looping(bool loop) 00200 { 00201 if (buffer == NULL) return; 00202 00203 looping = loop; 00204 }
1.2.6 written by Dimitri van Heesch,
© 1997-2001