package org.jaudiotagger.tag.mp4.field; import org.jaudiotagger.audio.mp4.atom.Mp4BoxHeader; import org.jaudiotagger.tag.FieldDataInvalidException; import org.jaudiotagger.tag.mp4.Mp4FieldKey; import org.jaudiotagger.tag.mp4.atom.Mp4DataBox; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; /** * Represents the Disc No field * <p/> * <p>Contains some reserved fields that we currently ignore * <p/> * Reserved:2 bytes * Disc Number:2 bytes * Total no of Discs:2 bytes * </p> */ public class Mp4DiscNoField extends Mp4TagTextNumberField { private static final int NONE_VALUE_INDEX = 0; private static final int DISC_NO_INDEX = 1; private static final int DISC_TOTAL_INDEX = 2; /** * Create new Disc Field parsing the String for the discno/total * * @param discValue * @throws org.jaudiotagger.tag.FieldDataInvalidException * */ public Mp4DiscNoField(String discValue) throws FieldDataInvalidException { super(Mp4FieldKey.DISCNUMBER.getFieldName(), discValue); numbers = new ArrayList<Short>(); numbers.add(new Short("0")); String values[] = discValue.split("/"); switch (values.length) { case 1: try { numbers.add(Short.parseShort(values[0])); } catch (NumberFormatException nfe) { throw new FieldDataInvalidException("Value of:" + values[0] + " is invalid for field:" + id); } numbers.add(new Short("0")); break; case 2: try { numbers.add(Short.parseShort(values[0])); } catch (NumberFormatException nfe) { throw new FieldDataInvalidException("Value of:" + values[0] + " is invalid for field:" + id); } try { numbers.add(Short.parseShort(values[1])); } catch (NumberFormatException nfe) { throw new FieldDataInvalidException("Value of:" + values[1] + " is invalid for field:" + id); } break; default: throw new FieldDataInvalidException("Value is invalid for field:" + id); } } /** * Create new Disc No field with only discNo * * @param discNo */ public Mp4DiscNoField(int discNo) { super(Mp4FieldKey.DISCNUMBER.getFieldName(), String.valueOf(discNo)); numbers = new ArrayList<Short>(); numbers.add(new Short("0")); numbers.add((short) discNo); numbers.add(new Short("0")); } /** * Create new Disc No Field with Disc No and total number of discs * * @param discNo * @param total */ public Mp4DiscNoField(int discNo, int total) { super(Mp4FieldKey.DISCNUMBER.getFieldName(), String.valueOf(discNo)); numbers = new ArrayList<Short>(); numbers.add(new Short("0")); numbers.add((short) discNo); numbers.add((short) total); } public Mp4DiscNoField(String id, ByteBuffer data) throws UnsupportedEncodingException { super(id, data); } protected void build(ByteBuffer data) throws UnsupportedEncodingException { //Data actually contains a 'Data' Box so process data using this Mp4BoxHeader header = new Mp4BoxHeader(data); Mp4DataBox databox = new Mp4DataBox(header, data); dataSize = header.getDataLength(); numbers = databox.getNumbers(); //Disc number always hold four values, we can discard the first one and last one, the second one is the disc no //and the third is the total no of discs so only use if not zero StringBuffer sb = new StringBuffer(); sb.append(numbers.get(DISC_NO_INDEX)); if (numbers.get(DISC_TOTAL_INDEX) > 0) { sb.append("/").append(numbers.get(DISC_TOTAL_INDEX)); } content = sb.toString(); } /** * @return */ public Short getDiscNo() { return numbers.get(DISC_NO_INDEX); } /** * Set Disc No * * @param discNo */ public void setDiscNo(int discNo) { numbers.set(DISC_NO_INDEX, (short) discNo); } /** * @return */ public Short getDiscTotal() { return numbers.get(DISC_TOTAL_INDEX); } /** * Set total number of discs * * @param discTotal */ public void setDiscTotal(int discTotal) { numbers.set(DISC_TOTAL_INDEX, (short) discTotal); } }