/* * Created on 26-Nov-2003 * * Copyright (C)2003,2004 Paul Grebenc * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: ID3DataOutputStream.java,v 1.3 2005/02/06 18:11:25 paul Exp $ */ package org.blinkenlights.jid3.io; import java.io.*; import org.blinkenlights.jid3.*; /** * @author paul * * Custom DataOutputStream containing convenience methods for writing ID3 tags. * */ public class ID3DataOutputStream extends DataOutputStream { public ID3DataOutputStream(OutputStream oOS) { super(oOS); } /** Write an unsigned byte value. * * @param iValue the unsigned byte value to be written * @throws IOException */ public void writeUnsignedByte(int iValue) throws IOException { writeByte(iValue); } /** Writes an unsigned big-endian 16-bit value. (Truncates any higher bits.) * * @param iValue the 16-bit unsigned integer value to be written * @throws IOException */ public void writeBEUnsigned16(int iValue) throws IOException { int iLo = iValue & 0xff; int iHi = iValue >> 8; write(iHi); write(iLo); } /** Writes an unsigned big-endian 24-bit value. (Truncates any higher bits.) * * @param iValue the 24-bit unsigned integer value to be written * @throws IOException */ public void writeBE24(int iValue) throws IOException { int iOne = iValue & 0xff; int iTwo = (iValue >> 8) & 0xff; int iThree = (iValue >> 16) & 0xff; write(iThree); write(iTwo); write(iOne); } /** Writes a signed big-endian 32-bit value. * * @param iValue the 32-bit signed integer value to be written * @throws IOException */ public void writeBE32(int iValue) throws IOException { int iOne = iValue & 0xff; int iTwo = (iValue >> 8) & 0xff; int iThree = (iValue >> 16) & 0xff; int iFour = (iValue >> 24) & 0xff; write(iFour); write(iThree); write(iTwo); write(iOne); } /** Writes an unsigned big-endian 32-bit value. * * @param lValue the 32-bit unsigned integer value to be written * @throws IOException */ public void writeUnsignedBE32(long lValue) throws IOException { int iOne = (int)(lValue & 0xff); int iTwo = (int)((lValue >> 8) & 0xff); int iThree = (int)((lValue >> 16) & 0xff); int iFour = (int)((lValue >> 24) & 0xff); write(iFour); write(iThree); write(iTwo); write(iOne); } /** Write an encoded four byte value. * The encoding method uses only the lowest seven bits of each byte, to prevent synchronization * errors in the MP3 data stream. */ public void writeID3Four(int iValue) throws IOException, ID3Exception { // we're only using the lower seven bits of each byte, so we can't write a value that // is greater than 28 bits can hold if (iValue >= (1 << 28)) { throw new ID3Exception("Cannot write an encoded value greater than 28-bit unsigned."); } int iOne = ((iValue >> (3*7)) & 0x7f); int iTwo = ((iValue >> (2*7)) & 0x7f); int iThree = ((iValue >> (1*7)) & 0x7f); int iFour = (iValue & 0x7f); write(iOne); write(iTwo); write(iThree); write(iFour); } }