アプリ版:「スタンプのみでお礼する」機能のリリースについて

今DirectSoundの初期化でわからないことがあります。カレントディレクトリにもsoundファイルにもwavファイルがあるのにうまく読み込まれません。また、mmioRead関数でなぜか失敗時の処理が出てしまいます。下に一部省略したソースを書きます。

if(FAILED(hr = OpenWaveFile(aWaveFileName, aSound)))
{

TCHAR strWavFile[MAX_PATH];
TCHAR kSoundsPath[6]={'s','o','u','n','d','/'};
int kSoundsPathLength=6;
lstrcpyn(strWavFile, kSoundsPath, MAX_PATH);
lstrcpyn(strWavFile + kSoundsPathLength, aWaveFileName,
MAX_PATH - kSoundsPathLength);

if(FAILED(hr = OpenWaveFile((LPSTR)strWavFile, aSound)))
{
sprintf(tmpString, "wavファイル『%s』が見つかりませんでした", strWavFile);
goto FAIL_RETURN;
}

HRESULT Sound::OpenWaveFile(LPSTR aWaveFileName, theSounds *aSound)
{
mmioOpen→mmioDescend
→aChunkInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if(MMSYSERR_NOERROR != mmioDescend(aSound->sndHmmio, &aChunkInfo,
&(aSound->sndChunkRiff), MMIO_FINDCHUNK))
{
MessageBox(NULL, "FAIL:mmioDescend2","エラー", MB_OK | MB_ICONHAND);
CloseWaveFile(aSound);
return(E_FAIL);
}

→if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat,
sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat))
{
MessageBox(NULL, "FAIL:mmioRead","エラー", MB_OK | MB_ICONHAND);
CloseWaveFile(aSound);
return (E_FAIL);
}
}

ソースは以上です。誰か原因に心当たりがある方がいましたら回答お願いします。

A 回答 (1件)

mmioRead関数の仕様をよく読みましょう。


mmioReadは、関数が成功すると、実際に読み取られたバイト数が返ります。
ファイルの終わりに到達し、それ以上バイトが読み取られない場合は、0 が返ります。
ファイルの読み取りエラーが発生した場合は?1 が返ります。
とあります。

つまり、読み込み途中の場合は読み込んだバイト数が、
読み込みが終了した場合は0が、読み込みに失敗した場合は-1が
それぞれ返却されるということです。

以下の条件式では何バイト読み込んでも、
aPCMWaveFormat型のサイズと同じに成らない限り、
読み込みが失敗したことになります。

if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat,
sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat))
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!