X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 240 (tree) |
|---|---|
| Time | 2020-05-03 13:20:33 |
| Author | |
DirectSoundにて特定のWaveフォーマットが正しく読み込めない不具合の修正
| @@ -165,6 +165,11 @@ | ||
| 165 | 165 | } |
| 166 | 166 | pwfex->cbSize = 0; |
| 167 | 167 | |
| 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 | + | |
| 168 | 173 | //もしステレオデータなら |
| 169 | 174 | if( pwfex->nChannels == 2 ){ |
| 170 | 175 | d2channels = true; //フラグを設定 |
| @@ -224,20 +229,43 @@ | ||
| 224 | 229 | if( d2channels == false ){ |
| 225 | 230 | //モノラルデータなら1バイトづつコピーする |
| 226 | 231 | for(int i=0; i<dwSize; i++){ |
| 227 | - *((BYTE*)pBuffer+i) = *((BYTE*) pWavData+i); | |
| 232 | + ((BYTE*)pBuffer)[i] = pWavData[i]; | |
| 228 | 233 | } |
| 229 | 234 | } |
| 230 | 235 | else{ |
| 231 | 236 | //サンプリングバイト数を取得 |
| 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 | + } | |
| 240 | 251 | } |
| 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 | + } | |
| 241 | 269 | } |
| 242 | 270 | |
| 243 | 271 | //ロック解除 |