3646|7

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请问大侠们S3C44b0x 音频代码中wav文件下载的问题 [复制链接]

各位好!
在S3C44b0x中IIS音频代码模块中下载wav文件源码中有几个语句小弟我不明白怎么回事,请帮忙解答,谢谢!

如下:
//中断入口内容不可确定,不要用中断
void LoadFromUart(void)
{
int i, size;
unsigned short dnCS, CheckSum;
unsigned char *buf;
unsigned char RxTmp[8];
void (*fun)();

download_addr = DFT_DOWNLOAD_ADDR;

buf = (unsigned char *)download_addr;

printf("Now download file from uart0 to 0x%x...\n", download_addr);

i = 0;
while(i<4)
  RxTmp[i++] = getch();                                // 这里得到的是RIFF?  
                                                                     //我查看wav文件格式,前4字节为RIFF,后4字节才是文件长度,是怎么回事呢?
i = 0;
    size = *(unsigned long *)RxTmp - 4;         //这里我没搞明白怎么回事,是想得到文件大小吗,跟下面的download_len区别在哪里呢?
while(i<size)
  buf[i++] = getch();                                      //我的问题出在这里,size值非常大(1179011406),i++循环总不能大于它,所以一直死在这

//里了.....

download_len = size-2;                                //为什么size-2呢?

dnCS = (buf[size-1]<<8)|buf[size-2];
CheckSum = 0;
for(size -= 3; size>=0; size--)
  CheckSum += buf[size];
if(dnCS!=CheckSum) {
  puts("\nCheckSum error!\n");
  download_len = 0;
} else {
  printf("\nReceived %x bytes success\n", download_len);
  puts("Do you want to run it?");
  if(getyorn()) {
   fun = (void(*)(void))download_addr;  
   CacheDisable();
   CacheFlush();
   (*fun)();
  }
}

return;
}
此帖出自ARM技术论坛

最新回复

给你下载了点资料参考一下 [attach]75236[/attach]  你可以先看看协议,然后在调试  详情 回复 发表于 2011-10-30 10:19
点赞 关注
 

回复
举报

19

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
各位帮帮忙,帮我看看。。。谢谢大家啦!
此帖出自ARM技术论坛
 
 
 

回复

2131

帖子

0

TA的资源

至上芯片

板凳
 
问题你知道在 size = *(unsigned long *)RxTmp - 4;  这里为什么 不修改一下呢?
这个肯定 有问题
此帖出自ARM技术论坛
 
个人签名处处留心皆学问!
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 daicheng 的帖子

谢谢您的提示,是不是修改成:
size = *(unsigned char*)RxTmp - 4;
可是我的疑问是,RxTmp数组前四元素总是RIFF,表示一种格式,不是文件的长度,这里为什么要这么用呢?而且这样子的话,不管文件大小,size 的值总是固定的,即使RxTmp数组的首元素R值(82-4),还是我的理解有误呢?
此帖出自ARM技术论坛
 
 
 

回复

2131

帖子

0

TA的资源

至上芯片

5
 

给你下载了点资料参考一下

wav.pdf (540.24 KB, 下载次数: 23)

 你可以先看看协议,然后在调试

此帖出自ARM技术论坛
 
个人签名处处留心皆学问!
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
恩,谢谢,我看了资料,同时也在百度百科上搜了下,关于wav中有这么说道,“以'RIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID 和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE' ”。按照这样子的解释,那么size = *(unsigned long *)RxTmp - 4; 是不是要改成:size = (*(unsiged long *)RxTmp+4)+(*(unsiged long *)RxTmp+5)+(*(unsiged long *)RxTmp+6)+(*(unsiged long *)RxTmp+7)-8呢,即是接收到第5、6、7、8字节文件长度-ID和Size占字节数8?
此帖出自ARM技术论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 
今天把Flasher全部擦出掉,到现在还是没能正常调试,网上查看可能是flash锁住了,之前RAM地址是0x0c000000,擦出后地址是0x10000000,改过后还是不能正确写入,我的开发板是公版S3C44b0x,Flash是SST39VF160,请问版主以及论坛里前辈们这个情况碰到过吗?是什么原因呢?怎么解决呢最后?谢谢各位啦。。。
此帖出自ARM技术论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

8
 
今天把size = *(unsigned long*)RxTmp - 4;改成:size = *(unsigned long *)(RxTmp + 4) -8;主要是wav格式决定的,然后前面的while(i<4)RxTmp[i++] = getch();相应改成i<8,'RIFF'后的4个字节是文件的长度, 仿真查看各字节内容是对的,不过后面的download_len=size-2;不知道为什么要减2呢?还有后面的校验部分,我看wav格式中没有说到校验的,所以这里暂时也不理解。。。希望理解知道的指点一下,谢谢!
另外,Flash烧写的问题很奇怪,我还没有找到问题的根源,不过可以烧录了,ADX也可以用,呃。。。慢慢领悟了。。。
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表