2013-06-26 51 views
0

我正在使用DirectSound處理項目,並試圖使聲音文件的標頭信息傳遞給處理方法。 WAV文件在開始時有一個RIFF塊ID。在調用ProcessWaveFile方法時,我傳遞文件路徑以及標題信息。 'RIFF'chunkID存儲在char中。我需要能夠根據實際文件chunkID檢查chunkID的單個字符,以確保文件是正確的。這是我的代碼片段:c - 從字符中讀取單個字符

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; 
} 

是塊ID文件的實際ID,而爲塊ID通過函數傳遞給檢查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的數組值?

回答

0

如果您正在尋找一種方便的方式來檢查文件是否以'RIFF'開頭,那麼您可能會找到更方便的方法。由於ChunkID長度爲4個字節,因此您可能希望將'RIFF'存儲爲長度爲4個字節的數據類型(而不是長度爲4的字符數組),然後將前四個字節解析爲,例如,一個int。

我有一個以RIFF開頭的wav文件,這裏是你將前四個字節解釋爲int時得到的數字。

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

所以選項-ci第一打印每個字節作爲其對應的ASCII碼(RIFF),然後打印每組4個字節爲一個整數。所以真的,1179011410 ='RIFF'和整數可能會更容易讓您檢查。

但是,我不太確定爲什麼你需要將'RIFF'傳遞給ProcessWaveFile()函數。如果您只處理過RIFF文件,那麼您可能會將這些信息存儲在ProcessWaveFile()函數本身中。

+0

沒關係,我現在通過簡單地通過其他方法解釋字符串來找到解決方法,但是感謝您的傑出答案。我不確定我最終可以處理哪種頭部,因此需要使頭部需求更加可調整。 – Chrayfish