package org.jaudiotagger.audio.mp4.atom;
import org.jaudiotagger.audio.generic.Utils;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import java.nio.ByteBuffer;
/**
* AlacBox ( Apple Lossless Codec information description box),
* <p/>
* Normally occurs twice, the first ALAC contaisn the default values, the second ALAC within contains the real
* values for this audio.
*/
public class Mp4AlacBox extends AbstractMp4Box {
public static final int OTHER_FLAG_LENGTH = 4;
private int maxSamplePerFrame; // 32bit
private int unknown1; // 8bit
private int sampleSize; // 8bit
private int historyMult; // 8bit
private int initialHistory; // 8bit
private int kModifier; // 8bit
private int channels; // 8bit
private int unknown2; // 16bit
private int maxCodedFrameSize; // 32bit
private int bitRate; // 32bit
private int sampleRate; // 32bit
/**
* DataBuffer must start from from the start of the body
*
* @param header header info
* @param dataBuffer data of box (doesnt include header data)
*/
public Mp4AlacBox(Mp4BoxHeader header, ByteBuffer dataBuffer) {
this.header = header;
this.dataBuffer = dataBuffer;
}
public void processData() throws CannotReadException {
//Skip version/other flags
dataBuffer.position(dataBuffer.position() + OTHER_FLAG_LENGTH);
maxSamplePerFrame = Utils.readUBEInt32(dataBuffer);
unknown1 = Utils.readUInt8(dataBuffer);
sampleSize = Utils.readUInt8(dataBuffer);
historyMult = Utils.readUInt8(dataBuffer);
initialHistory = Utils.readUInt8(dataBuffer);
kModifier = Utils.readUInt8(dataBuffer);
channels = Utils.readUInt8(dataBuffer);
unknown2 = Utils.readUBEInt16(dataBuffer);
maxCodedFrameSize = Utils.readUBEInt32(dataBuffer);
bitRate = Utils.readUBEInt32(dataBuffer);
sampleRate = Utils.readUBEInt32(dataBuffer);
}
public int getMaxSamplePerFrame() {
return maxSamplePerFrame;
}
public int getUnknown1() {
return unknown1;
}
public int getSampleSize() {
return sampleSize;
}
public int getHistoryMult() {
return historyMult;
}
public int getInitialHistory() {
return initialHistory;
}
public int getKModifier() {
return kModifier;
}
public int getChannels() {
return channels;
}
public int getUnknown2() {
return unknown2;
}
public int getMaxCodedFrameSize() {
return maxCodedFrameSize;
}
public int getBitRate() {
return bitRate;
}
public int getSampleRate() {
return sampleRate;
}
public String toString() {
String s = "maxSamplePerFrame:" + maxSamplePerFrame
+ "unknown1:" + unknown1
+ "sampleSize:" + sampleSize
+ "historyMult:" + historyMult
+ "initialHistory:" + initialHistory
+ "kModifier:" + kModifier
+ "channels:" + channels
+ "unknown2 :" + unknown2
+ "maxCodedFrameSize:" + maxCodedFrameSize
+ "bitRate:" + bitRate
+ "sampleRate:" + sampleRate;
return s;
}
}