2016-07-31 50 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