0

DirectSound を使ったプロジェクトに取り組んでおり、サウンド ファイルのヘッダー情報が処理メソッドに渡されるようにしようとしています。WAV ファイルには、先頭に RIFF チャンク ID があります。ProcessWaveFile メソッドの呼び出しでは、ファイルパスとヘッダー情報を渡します。「RIFF」チャンク ID は char に格納されます。ファイルが正しいことを確認するために、実際のファイルのチャンク ID に対してチャンク ID の個々の文字をチェックできる必要があります。これは私のコードのスニペットです:

    if((waveFileHeader.chunkId[0] != chunkID[0]) || (waveFileHeader.chunkId[1] != chunkID[1]) ||
    (waveFileHeader.chunkId[2] != chunkID[2]) || (waveFileHeader.chunkId[3] != chunkID[3]))
{
    MessageBox(hwnd, L"ChunkID not in the right Format.", L"Error", MB_OK);
    return false;
}

chunkId はファイルの実際の ID であり、chunkID はチェックする関数を介して渡される ID です。ご覧のとおり、ここでは配列のように処理しようとしています。chunkId は char[] に格納されます。チャンクIDも配列に保存する必要がありますか? どのように指定しますか?

    bool ProcessWaveFile(char*, IDirectSoundBuffer8**, HWND, int, char, char, char, char, std::string, int, int);

上記は、ProcessWaveFile メソッドのヘッダー ファイル行です。チャンク ID は文字の 1 つとして指定されます。char[] に変更することもできますが、実際にメソッドを呼び出すときに問題が発生します。呼び出しの例を次に示します。

    result1 = ProcessWaveFile("../terrain_sky/data/sound01.wav", &m_secondaryBuffer1, hwnd,
    44100, 'RIFF', 'fmt ', 'WAVE', 'data', "WAVE_PCM_FORMAT", 16, 2);

変数のチェーンを中断することなく、この呼び出しで RIFF を含む配列値を宣言するにはどうすればよいですか?

4

1 に答える 1

0

ファイルが「RIFF」で始まることを確認する便利な方法を探している場合は、もっと便利な方法があるかもしれません。ChunkID の長さは 4 バイトであるため、(長さ 4 の char 配列ではなく) 長さ 4 バイトのデータ型に期待される 'RIFF' を格納し、最初の 4 バイトを次のように解析することをお勧めします。 int.

ここに RIFF で始まる wav ファイルがあります。最初の 4 バイトを int として解釈すると、次のようになります。

od -ci -N4 ./test.wav
0000000  R   I   F   F
            1179011410

そのため、このオプションは、-ci最初に各バイトを対応する ASCII (RIFF) として出力し、次に 4 バイトの各セットを整数として出力します。つまり、実際には 1179011410 = 'RIFF' であり、整数の方がチェックしやすいかもしれません。

しかし、余談ですが、「RIFF」を ProcessWaveFile() 関数に渡す必要がある理由がよくわかりません。RIFF ファイルしか扱っていない場合は、その情報を ProcessWaveFile() 関数自体に保存することで問題が解決する可能性があります。

于 2013-06-27T13:41:42.053 に答える