0

我正在使用 DirectSound 开发一个项目,并试图将声音文件的标头信息传递给处理方法。WAV 文件在开始时有一个 RIFF chunkID。在对 ProcessWaveFile 方法的调用中,我传递了文件路径以及标头信息。'RIFF' chunkID 存储在一个字符中。我需要能够根据实际文件 chunkID 检查 chunkID 的各个字符,以确保文件正确。这是我的代码片段:

    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[] 中。我也应该将 chunkID 存储在数组中吗?我将如何指定它?

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

以上是 ProcessWaveFile 方法的头文件行。chunkID 被指定为字符之一。我可以将其更改为 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 个字节长,您可能希望将您期望的“RIFF”存储在一个也是 4 个字节长的数据类型中(而不是长度为 4 的 char 数组),然后将前四个字节解析为,例如,一个整数。

我在这里有一个以 RIFF 开头的 wav 文件,这是将前四个字节解释为 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 回答