在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币722
TA的每日心情 | 开心 2018-7-23 21:04 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 16703
- 最后登录
- 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的播放提供了基础。
|
|