• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision240 (tree)
Time2020-05-03 13:20:33
Authorxops-mikan

Log Message

DirectSoundにて特定のWaveフォーマットが正しく読み込めない不具合の修正

Change Summary

Incremental Difference

--- trunk/sound-directsound.cpp (revision 239)
+++ trunk/sound-directsound.cpp (revision 240)
@@ -165,6 +165,11 @@
165165 }
166166 pwfex->cbSize = 0;
167167
168+ //非対応フォーマットなら失敗
169+ if( pwfex->wFormatTag != WAVE_FORMAT_PCM ){ return -1; }
170+ if( (pwfex->nChannels != 1)&&(pwfex->nChannels != 2) ){ return -1; }
171+ if( (pwfex->wBitsPerSample != 8)&&(pwfex->wBitsPerSample != 16) ){ return -1; }
172+
168173 //もしステレオデータなら
169174 if( pwfex->nChannels == 2 ){
170175 d2channels = true; //フラグを設定
@@ -224,20 +229,43 @@
224229 if( d2channels == false ){
225230 //モノラルデータなら1バイトづつコピーする
226231 for(int i=0; i<dwSize; i++){
227- *((BYTE*)pBuffer+i) = *((BYTE*) pWavData+i);
232+ ((BYTE*)pBuffer)[i] = pWavData[i];
228233 }
229234 }
230235 else{
231236 //サンプリングバイト数を取得
232- int samplingbytes = pwfex->wBitsPerSample/2;
233-
234- //ステレオデータなら、右側のデータだけ格納
235- int byte = 0;
236- for(int i=0; i<dwSize; i++){
237- *((BYTE*)pBuffer+byte) = *((BYTE*) pWavData+i);
238- byte += 1;
239- if( i%samplingbytes == samplingbytes-1 ){ i += samplingbytes; } //左側のデータはスキップ
237+ int samplingbits = pwfex->wBitsPerSample;
238+
239+ if( samplingbits == 8 ){
240+ int byte = 0;
241+ for(int i=0; i<dwSize; i+=2){
242+ /*
243+ int mix = (pWavData[i] + pWavData[i + 1])/2;
244+ ((BYTE*)pBuffer)[byte] = (BYTE)mix;
245+ */
246+
247+ //ステレオデータなら、左側のデータだけ格納
248+ ((BYTE*)pBuffer)[byte] = (BYTE)pWavData[i];
249+ byte += 1;
250+ }
240251 }
252+ if( samplingbits == 16 ){
253+ int byte = 0;
254+ for(int i=0; i<dwSize; i+=4){
255+ /*
256+ //int mix = (((pWavData[i + 0]<<8)&0xFF00) + ((pWavData[i + 1])&0x00FF) + ((pWavData[i + 2]<<8)&0xFF00) + ((pWavData[i + 3])&0x00FF))/2;
257+ int mix = ((pWavData[i + 0]<<8)&0xFF00) + ((pWavData[i + 1])&0x00FF);
258+ ((BYTE*)pBuffer)[byte+0] = (BYTE)((mix>>8)&0x00FF);
259+ ((BYTE*)pBuffer)[byte+1] = (BYTE)(mix)&0x00FF;
260+ byte += 2;
261+ */
262+
263+ //ステレオデータなら、左側のデータだけ格納
264+ ((BYTE*)pBuffer)[byte+0] = (BYTE)pWavData[i + 0];
265+ ((BYTE*)pBuffer)[byte+1] = (BYTE)pWavData[i + 1];
266+ byte += 2;
267+ }
268+ }
241269 }
242270
243271 //ロック解除