00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "GT2005SoundControl.h"
00011 #include "Tools/Debugging/Debugging.h"
00012
00013
00014 GT2005SoundControl::GT2005SoundControl(const SoundControlInterfaces& interfaces)
00015 : SoundControl(interfaces)
00016 {
00017 playingWave = false;
00018 actWavePosition = 0;
00019 lastSound = SoundRequest::none;
00020
00021 for (int i = 0; i < SoundRequest::numOfSoundIDs; i++)
00022 {
00023 waveData[i] = 0;
00024 waveLength[i] = 0;
00025 if (i != (int) SoundRequest::none)
00026 {
00027 char file[20];
00028 strcpy(file,"Sounds/");
00029 strcat(file,(const char*)soundRequest.getSoundIDName((SoundRequest::SoundID)i));
00030 strcat(file,".wav");
00031 loadWavefile(file, i);
00032 }
00033 }
00034 }
00035
00036
00037 GT2005SoundControl::~GT2005SoundControl()
00038 {
00039 for (int i = 0; i < SoundRequest::numOfSoundIDs; i++)
00040 if (waveData[i]) delete (waveData[i]);
00041 }
00042
00043
00044 void GT2005SoundControl::execute()
00045 {
00046 if(playingWave)
00047 {
00048 fillWaveBuffer(&soundData, lastSound);
00049 }
00050 else
00051 {
00052 if ((soundRequest.soundID != SoundRequest::none) &&
00053 (soundRequest.soundID < SoundRequest::numOfSoundIDs) &&
00054 (soundRequest.soundID != lastSound))
00055 {
00056 playWave(&soundData, (int)soundRequest.soundID);
00057 }
00058 lastSound = soundRequest.soundID;
00059 }
00060 }
00061
00062
00063 void GT2005SoundControl::playWave(SoundData* soundData, int index)
00064 {
00065 if (waveData[index])
00066 {
00067 playingWave = true;
00068 soundData->isInUse = true;
00069 actWavePosition = startWavePosition[index];
00070 fillWaveBuffer(soundData, index);
00071 }
00072 }
00073
00074
00075 bool GT2005SoundControl::loadWavefile(const char* filename, int index)
00076 {
00077 InBinaryFile fin(filename);
00078 if (!fin.exists())
00079 {
00080 OUTPUT(idText,text,"GT2005SoundControl : Error, " << filename << " not found.");
00081 return false;
00082 }
00083 else
00084 {
00085 if (checkWaveHeader(filename, index))
00086 {
00087 waveData[index] = new char[waveLength[index]+startWavePosition[index]];
00088 fin.read(waveData[index],waveLength[index]+startWavePosition[index]);
00089 return true;
00090 }
00091 }
00092 return false;
00093 }
00094
00095
00096 bool GT2005SoundControl::checkWaveHeader(const char* filename, int index)
00097 {
00098 InBinaryFile fin(filename);
00099 int headerPos = 0;
00100 unsigned short format;
00101 unsigned long sampleRate;
00102 unsigned long bytesPerSecond;
00103
00104
00105 fin.read(waveHeader, 100);
00106
00107
00108 if(strncmp(waveHeader,"RIFF",4)!=0)
00109 {
00110 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << " is no RIFF file!");
00111 return false;
00112 }
00113 headerPos += 8;
00114 if(strncmp(waveHeader+headerPos,"WAVE",4)!=0)
00115 {
00116 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << " is no WAVE file!");
00117 return false;
00118 }
00119 headerPos += 4;
00120 if(strncmp(waveHeader+headerPos,"fmt ",4)!=0)
00121 {
00122 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << " has wrong subchunk fmt!");
00123 return false;
00124 }
00125 headerPos += 10;
00126 memcpy(&format,waveHeader+headerPos,2);
00127 if(format != 1)
00128 {
00129 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << " is not mono!");
00130 return false;
00131 }
00132 headerPos += 2;
00133 memcpy(&sampleRate,waveHeader+headerPos,4);
00134 if(sampleRate != 8000)
00135 {
00136 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << ": sample rate not 8000Hz!");
00137 return false;
00138 }
00139 headerPos += 4;
00140 memcpy(&bytesPerSecond,waveHeader+headerPos,4);
00141 if(bytesPerSecond != 8000)
00142 {
00143 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << ": not 8000 bytes per second!");
00144 return false;
00145 }
00146
00147
00148 while ((headerPos < 97) && (strncmp(waveHeader+headerPos,"data",4)!=0))
00149 {
00150 headerPos+=2;
00151 }
00152 if (strncmp(waveHeader+headerPos,"data",4)!=0)
00153 {
00154 OUTPUT(idText,text, "GT2005SoundControl : Error: " << filename << ": 'data' not found!");
00155 return false;
00156 }
00157 memcpy(&waveLength[index],waveHeader+headerPos+4,4);
00158 startWavePosition[index] = headerPos + 8;
00159
00160 return true;
00161 }
00162
00163
00164 void GT2005SoundControl::fillWaveBuffer(SoundData *soundData,int index)
00165 {
00166 if(actWavePosition < waveLength[index] - 256)
00167 {
00168 memcpy(soundData->pcmBuffer, waveData[index] + actWavePosition, 256);
00169
00170 for (int i=0; i < 256; i++)
00171 {
00172 soundData->pcmBuffer[i] = soundData->pcmBuffer[i] ^ 0x80;
00173 }
00174 actWavePosition += 256;
00175 }
00176 else
00177 {
00178 memset(soundData->pcmBuffer, 0, 256);
00179 playingWave = false;
00180 soundData->isInUse = false;
00181 }
00182 }