2016-07-31 30 views
0

我必須解析wav文件(純C)並驗證一些參數以傳遞下一個函數。其中之一是採樣速率是不那麼短,使用if語句的多個測試位的位置:C,簡單的方法來測試if語句中的多個值

#define  WAV_ALLOWED_SAMPLE_RATE   (48000) 

    if(wavFile.Header.SampleRate != WAV_ALLOWED_SAMPLE_RATE) /* Sample Rate */ 
         return WAV_HDR_CHUNK_FMT_INVALID_SAMPLE_RATE; 

有用於測試,我想在設計時預先定義多個值的簡單方法?像這樣:

#define  WAV_ALLOWED_SAMPLE_RATE   (11025 || 22050 || 44100 || 48000) 

也許2,3或4個值,取決於項目需要。

由於提前,

+3

將這些值放入一個數組並在其上運行循環以查找匹配項。 –

+0

你的問題是什麼?你是否使用特定的API來讀取WAV文件?以什麼格式從頭讀取採樣率? 「你是否認爲」採樣率不是很短**,以便在if語句中使用多位測試的位置「? – user3078414

+1

創建一個函數來驗證採樣率是否有效,並使其按照@SameerNaik建議的循環有效比率數組中的值。然後用您從文件中讀取的採樣率調用該函數以查看編號是否正確。 –

回答

0
#define  WAV_ALLOWED_SAMPLE_RATE   (11025 || 22050 || 44100 || 48000) 


    if(wavFile.Header.SampleRate != WAV_ALLOWED_SAMPLE_RATE) /* Sample Rate */ 
         return WAV_HDR_CHUNK_FMT_INVALID_SAMPLE_RATE; 

只要你想這個代碼不會去。值(11025 || 22050 || 44100 || 48000)將被解釋爲1,因而僞造if條件...

你可以寫一個簡單的函數,檢查所有4個值,或做你的代碼裏面因爲是

+1

編寫函數 - 不要內聯。 (您可以將函數變成「靜態內聯」函數;這是一個單獨的討論。) –

2

Wave Format Standard採樣率是一個32位整數。因此,如果您將其讀入int,則可以輕鬆使用if語句和整數相等比較。最簡單的陳述,根據您的輸入:

int R = wavFile.Header.SampleRate; 

if ((R != 48000) && (R != 44100) && (R != 22050) && (R != 11025)) 
    return WAV_HDR_CHUNK_FMT_INVALID_SAMPLE_RATE; 
+0

取決於採樣率,我必須在微控制器上使用多晶石英,所以這就是爲什麼我想在編譯時允許#define的原因。一些值允許(一起)多個採樣率,而另一些則不允許。無論如何,似乎陣列搜索將是最好的,非常感謝。 – user1797147

+1

感謝您的回覆,也許看看如何一些音頻文件API枚舉採樣率也可以是有益的[鏈接](http://maemo.org/api_refs/5.0/5.0-final/pulseaudio/sample_8h.html)...無論如何,如果你有硬件限制,這是一個很好的起點。 – user3078414