- 注册时间
- 2008-2-21
- 最后登录
- 1970-1-1
|
之所以给研究加引号,完全是因为时间问题(一晚上啊~)。
在这之前我搜索了有关播放的问题,可竟然没有一个人问到808,所以就写了这个帖子。当然,也可能有人知道这问题是怎么回事。可如果不讲出来,LAVA初学者就会有疑问(我就是,问了没几个人理)。
先说一下,经测试,NC3000的播放和808的真的不一样。
以下是个简单的808播放声音的代码:
char sndbuf[1500];
void main()
{char fp;
long filelen;
fp=fopen("/双语声音/1.vnt","r");
filelen=fseek(fp,0,2)-2;//求播放长度
PlayInit(2);
SetVolum(1);
PlayFile(fp,0,filelen,2);
playStops();
PlaySleep();
fclose(fp);
}
和3000的很像吧?
首先,和3000一样,要播放声音要先空出一部分内存。DspSnd.y里说1500只大不小,而在808里,我试了sndbuf[2]居然也能播放(只能到2了,不能再小了)。这一点是必须,少了这一步音乐就没法播放。
下面是PlayInit(),比较奇怪。编译器的引索里说TC808的mhead=0,可事实上,取0是无效的。只有1和2有效。1我不知是干什么的,因为使用1为参数,喇叭有明显的“待命声音”,然而并不播放数据。参数2可以让你播放。
还有最后PlayFile(),最奇怪的。编译器的引索里说参数为(fp,ps,pe,time)(ps为播放起始点,pe为播放结束点,time为显示的时间),可ps好像只能取0、1、2,如果取别的值,会发出怪声(仔细听后,发现很像是把播放文件快进了),根本就不是播放起点(我以为可以从文件的某一部分开始播放);time只能取2或255,如果取别的值,时间会错误显示(注意,这里的“显示的时间”并不是由你控制的,函数自身会计算播放时间,这个参数仅仅是显示用的),因为播放开始后,屏幕的下方会出现现在的播放进度(时间),和双语OK的那个一模一样。
讲完了,该讲我解释不了的疑问了(上文的疑问在下面就不说了)。
1.和NC3000很不一样,文件指针对于PlayFile()根本无效!也就是说在PlayFile()之前企图通过移动文件指针以达到播放位置设定的目的是无用功。该函数在内部好像先是将文件指针恢复到某一位置了。
2.和NC3000太不一样了!808居然无法后台播放!你一旦使用PlayFile(),当程序运行到这一点时会暂停往下运行,直到文件播放完!当然跳出播放是可以的,按任意键(是“任意”),之后程序才能恢复工作。与此相对,我发现了一件很奇怪的事,系统自己的“双语OK”在播放过程中可以点"P"键暂停播放!这是为什么?
汇编我只看过一点,并不是很熟,不过也欢迎汇编的解决方法。不过最好是LAVA的,因为汇编不能跨平台(PlayFile虽然也不能跨平台,可是在切换不同机器的播放函数还是方便的)。 |
|