1.定义解码一帧的接口 ILayer123
Layer1、Layer2和Layer3这三个类都实现了ILayer123的decodeFrame方法。
// ILayer123.java
package jmp123.decoder;
public interface ILayer123 {
public void decodeFrame(int intFirstChannel, int intLastChannel) throws Exception;
}
2.封装解码器 对帧头解码之后可以知道当前待解码的文件是采用MPEG Audio的哪一层压缩方式,根据压缩层的 不同,解码器自动初始化Layer1、Layer2和Layer3这三个类中的某一个实例。你也就明白了为什么我们把这三 个类的大部分初始化放在其构造方法内的道理了。class Decoder的decodeFrame方法完成解码和播放一帧的任务。
//Decoder.java
package jmp123.decoder;
import jmp123.output.Audio;
public final class Decoder {
public final static int CH_LEFT = 0;
public final static int CH_RIGHT = 1;
public final static int CH_BOTH = 2;
private static int intFirstChannel, intLastChannel;
private static int intChannels;
private static int intOutputChannel;
private static int intForwardMultiple;
private ILayer123 layer123;
public Decoder(BitStream objBS, Header objHeader) {
intChannels = objHeader.getChannels();
switch(objHeader.getLayer()) {
case 1:
layer123 = new Layer1(objBS, objHeader);
break;
case 2:
layer123 = new Layer2(objBS, objHeader);
break;
case 3:
layer123 = new Layer3(objBS, objHeader);
break;
}
// 设置参数缺省值
intForwardMultiple = 1;
setOutputChannel(CH_BOTH);
}
public void decodeFrame() throws Exception {
layer123.decodeFrame(intFirstChannel, intLastChannel);
if(intChannels == 1 && intOutputChannel == CH_BOTH) {
int i;
byte[] buf = Synthesis.bytePCMBuf;
for(i = 0; i < 4608; i += 4) {
buf[i+2] = buf[i];
buf[i+3] = buf[i+1];
}
}
if(intForwardMultiple == 1)
Audio.write(Synthesis.bytePCMB