易码技术论坛

 找回密码
 加入易码
搜索
查看: 1576|回复: 10

[源码] TC808声音函数“研究”结果

[复制链接]
发表于 2008-11-5 09:03:22 | 显示全部楼层 |阅读模式
之所以给研究加引号,完全是因为时间问题(一晚上啊~)。
在这之前我搜索了有关播放的问题,可竟然没有一个人问到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虽然也不能跨平台,可是在切换不同机器的播放函数还是方便的)。
发表于 2008-11-5 09:24:11 | 显示全部楼层
这个以前有人研究过,想要播放文件的制定位置必须用汇编,还有,不管是3k还是808,lav提供的那些播放函数都没法后台播放。
发表于 2008-11-5 12:02:01 | 显示全部楼层
Tc808的lava播放vnt你就别用了。原因如下:
lava在执行PlayFile这个函数时会直接调用系统播放vnt的中断。而那个中断功能太弱了,在中断执行的时候也就是播放过程中,只要有按键,中断就会立即返回,播放停止。根本不能实现后台播放。
只有系统的响铃那种音乐可以在后台播放,不过lava是没有对应的函数的。
至于LAVA版的播放缓冲,那可能是yan自己规定的,其实从中断内部是可以看到播放时的最小缓冲的,Tc808是24字节,Nc3000是12字节。
明年有时间的话我可能会把Tc808的那个VNT播放中断给拆开来重新制作一下LAVA的函数库,争取能支持简单的后台播放,比如同步歌词,当然这个在QPlayer里已经实现了。

用汇编的方法……LZ你懂汇编吗?不然的话我可能真的没办法跟你讲。
发表于 2008-11-5 13:05:53 | 显示全部楼层
808和3K的vnt播放中断应该差不多,变化的是IO口。
后台播放+同步歌词用lava不太可能实现。
发表于 2008-11-5 13:28:25 | 显示全部楼层
3K的vnt播放中断也会按键就返回?
其实我也觉得后台不太可能。 但是改一下用起来会方便很多。
发表于 2008-11-5 14:26:07 | 显示全部楼层

我试过在星星影院上加同步歌词,结果速度不行。
发表于 2008-11-5 15:57:47 | 显示全部楼层
808 1k 3k的播放函数都一样……
我估计,这些函数完全是为双语OK服务的……

[ 本帖最后由 POTO 于 2008-11-5 16:01 编辑 ]
发表于 2008-11-5 15:59:16 | 显示全部楼层
另外问一下,yan知不知道tc800的是怎么实现后台播放的?
发表于 2008-11-5 16:30:37 | 显示全部楼层
我没看过,TC800的CPU应该有硬件支持的。
 楼主| 发表于 2008-11-5 18:35:29 | 显示全部楼层
谢谢前辈指点啦。我确实不知道那么多,水平有限啊。
发表于 2009-2-27 02:37:50 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 00:43 , Processed in 0.009026 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表