NDS中如何使用复杂的音频处理



掌叔
2009-05-05 08:45:58

摘自:[url]www.fw211.com[/url]

PALib中MP3的解码处理放在了ARM7端,由于helix代码运行的速度快,33M的主频完全能处理的过来。如果要是再加上EQ处理或者频谱显示呢?恐怕ARM7就吃不消了。这时我们能用到的就只能是66M的ARM9了。ARM9端不但有紧耦合的指令数据ram还有cache系统,这样能确保音频处理的实时性了。
那么怎样才能使ARM9处理完的音频数据交给ARM7去播放呢?这还真得感谢NDS的FIFO系统,它提供了一个有效的ARM7与ARM9的同步与互斥机制。首先ARM9在主存中设置一个用来存放音频数据的共享内存区域,这个内存区域应该是一个双缓冲的ping-pang buffer,通过FIFO机制将这个区域的地址通知给ARM7,同时设置主存的访问优先级为ARM7优先,这样能确保音频播放时不产生因为ARM9端使用主存而带来的噪音。刚开始播放时,ARM9首先要处理好两帧数据,当ARM7播放完一帧数据后通过FIFO通知给ARM9,这时ARM9再处理第三帧数据,由于ping-pang buffer机制以及ARM9的处理速度远大于ARM7的播放速度,所以在ARM7端永远都能看到准备好的一帧音频数据,播放也就自然流畅了。通过这种方法我实验了MP3播放,MP3加上EQ处理播放,WMA播放,WMA加上EQ处理播放,效果都是令人满意的。