00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Sound/Stereo/StereoSound.h"
00027
00028 namespace Lamp{
00029
00030
00031
00032 StereoSound::StereoSound(DirectSoundBuffer* soundBuffer) :
00033 SoundBuffer(soundBuffer), pan_(0.f){
00034
00035 long decibelPan;
00036 if(DirectXFailed(soundBuffer->GetPan(&decibelPan))){
00037 ErrorOut("StereoSound::StereoSound() パンの取得に失敗しました。");
00038 }
00039 int absDecibelPan = Math::abs(decibelPan);
00040 pan_ = 1.f - decibelToVolume(-absDecibelPan);
00041 if(decibelPan < 0.f){ pan_ = -pan_; }
00042 }
00043
00044
00045 StereoSound::~StereoSound(){
00046 }
00047
00048
00049 void StereoSound::copyStereoSoundData(StereoSound* destination){
00050 copySoundBufferData(destination);
00051 }
00052
00053
00054 void StereoSound::setPan(float pan){
00055 if(pan_ == pan){ return; }
00056 Assert(pan >= -1.f);
00057 Assert(pan <= 1.f);
00058 float absPan = Math::abs(pan);
00059 if(absPan <= 0.002f){
00060 if(DirectXFailed(getSoundBuffer()->SetPan(DSBPAN_CENTER))){
00061 ErrorOut("StereoSound::setPan() パンの設定に失敗しました。");
00062 }
00063 }else{
00064
00065 int db = volumeToDecibel(1.f - absPan);
00066 if(db == 0){ db = DSBPAN_LEFT; }
00067 Assert((db <= DSBPAN_CENTER) && (db >= DSBPAN_LEFT));
00068 if(pan > 0.f){ db = -db; }
00069 if(DirectXFailed(getSoundBuffer()->SetPan(db))){
00070 ErrorOut("StereoSound::setPan() パンの設定に失敗しました。");
00071 }
00072 }
00073 pan_ = pan;
00074 }
00075
00076
00077 void StereoSound::reset(Reset flags){
00078 SoundBuffer::reset(flags);
00079 if((flags & resetPan) != 0){ setPan(0.f); }
00080 }
00081
00082
00083 String StereoSound::toString() const{
00084 String result, temp;
00085 result = SoundBuffer::toString();
00086 temp.format("Pan(%.2f) BufferSize(%7dbyte)\n",
00087 getPan(), getBufferSize());
00088 result += temp;
00089 return result;
00090 }
00091
00092 }
00093