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

soundbuffer_playback_dx.cpp

Go to the documentation of this file.
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 }

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