在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币1019 
 
 
 
TA的每日心情  | 开心 2018-7-23 21:04 | 
|---|
 
  签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II 
金牌会员 
   
	- 积分
 - 17000
 
 
- 最后登录
 - 1970-1-1
  
 
 | 
 
 本帖最后由 lkl0305 于 2015-9-29 09:54 编辑  
 
一、问题提出: 
之前给大家分享了定义一个结构体来存储wav文件的信息,那如何编程实现呢? 
 
二、解决办法: 
1、有了前面的结构体变量,程序就容易实现了。 
2、今天调试了一个程序,给大家分享一下: 
这个函数返回值为0时,表示读取信息错误,为1时,表示读取正确 
参数时指向内存中的wav文件信息的片段,可以时数据缓冲区。wavPoint指向wav文件的开始。 
 
uint8_t ReadWAVInf(uint8_t * wavPoint) 
{ 
        if (0 == strcompare("RIFF", (uint8_t *)wavPoint, 4)) 
        { 
                return 0; 
        } 
        else 
        { 
                strncpy(wavFile.wavRiffChunk.szRiffID, (uint8_t *)wavPoint, 4); 
        } 
 
        if (0 == strcompare("WAVE", (uint8_t *)wavPoint + 8, 4)) 
        { 
                return 0; 
        } 
        else 
        { 
                strncpy(wavFile.wavRiffChunk.szRiffFormat, wavPoint + 8, 4); 
        } 
 
        wavFile.wavRiffChunk.dwRiffSize = ((uint32_t)*(wavPoint + 4)) + 
                                                                                (((uint32_t)*(wavPoint + 5)) << 8) + 
                                                                                (((uint32_t)*(wavPoint + 6)) << 16) + 
                                                                                (((uint32_t)*(wavPoint + 7)) << 24); 
 
        wavPoint += 12; 
 
        if (0 == strcompare("fmt ", (uint8_t *)wavPoint, 4)) 
        { 
                return 0; 
        } 
        else 
        { 
                strncpy(wavFile.wavFmtChunk.szFmtID, (uint8_t *)wavPoint, 4); 
        } 
 
        wavFile.wavFmtChunk.dwFmtSize = ((uint32_t)*(wavPoint + 4)) + 
                                                                        (((uint32_t)*(wavPoint + 5)) << 8) + 
                                                                        (((uint32_t)*(wavPoint + 6)) << 16) + 
                                                                        (((uint32_t)*(wavPoint + 7)) << 24); 
 
        wavFile.wavFmtChunk.wavFormat.wFormatTag = ((uint32_t)*(wavPoint + 8)) + 
                                                                                                 (((uint32_t)*(wavPoint + 9)) << 8); 
 
        wavFile.wavFmtChunk.wavFormat.wChannels = ((uint32_t)*(wavPoint + 10)) + 
                                                                                                (((uint32_t)*(wavPoint + 11)) << 8); 
 
        wavFile.wavFmtChunk.wavFormat.dwSamplesPerSec = ((uint32_t)*(wavPoint + 12)) + 
                                                                                                        (((uint32_t)*(wavPoint + 13)) << 8) + 
                                                                                                        (((uint32_t)*(wavPoint + 14)) << 16) + 
                                                                                                        (((uint32_t)*(wavPoint + 15)) << 24); 
 
        wavFile.wavFmtChunk.wavFormat.dwAvgBytesPerSec = ((uint32_t)*(wavPoint + 16)) + 
                                                                                                         (((uint32_t)*(wavPoint + 17)) << 8) + 
                                                                                                         (((uint32_t)*(wavPoint + 18)) << 16) + 
                                                                                                         (((uint32_t)*(wavPoint + 19)) << 24); 
 
 
        wavFile.wavFmtChunk.wavFormat.wBlockAlign = ((uint32_t)*(wavPoint + 20)) + 
                                                                                                (((uint32_t)*(wavPoint + 21)) << 8); 
 
        wavFile.wavFmtChunk.wavFormat.wBitsPerSample = ((uint32_t)*(wavPoint + 22)) + 
                                                                                                         (((uint32_t)*(wavPoint + 23)) << 8); 
 
        wavPoint += wavFile.wavFmtChunk.dwFmtSize + 8; 
 
        while (0 == strcompare("data", (uint8_t *)wavPoint, 4)) 
        { 
                wavPoint += ((uint32_t)*(wavPoint + 4)) + 
                                        (((uint32_t)*(wavPoint + 5)) << 8) + 
                                        (((uint32_t)*(wavPoint + 6)) << 16) + 
                                        (((uint32_t)*(wavPoint + 7)) << 24) + 8; 
        } 
 
        strncpy(wavFile.wavDataChunk.szDataID, (uint8_t *)wavPoint, 4); 
 
        wavFile.wavDataChunk.dwDataSize = ((uint32_t)*(wavPoint + 4)) + 
                                                                                (((uint32_t)*(wavPoint + 5)) << 8) + 
                                                                                (((uint32_t)*(wavPoint + 6)) << 16) + 
                                                                                (((uint32_t)*(wavPoint + 7)) << 24); 
        return 1; 
} 
 
三、感想与收获: 
1、有了这个程序,就可以实现wav信息读取了,为下一步wav的播放提供了基础。 
 
        
        
        
         |   
 
 
 
 |