/** * Copyright (c) 2009-2011 SKRATCHDOT.COM * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * JEFF |:at:| SKRATCHDOT |:dot:| COM * * $Id$ */ package com.skratchdot.riff.wav.util; import java.io.IOException; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.CharBuffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; import java.nio.ShortBuffer; /** * A wrapper class for ByteBuffer that extends functionality to allow for * reading and putting unsigned data types. * @see java.nio.ByteBuffer */ public class ExtendedByteBuffer { private ByteBuffer buf = null; /** * Allocates an ExtendedByteBuffer by calling {@link java.nio.ByteBuffer#allocate(int)} internally * @see java.nio.ByteBuffer#allocate(int) * @param capacity */ public ExtendedByteBuffer(int capacity) { buf = ByteBuffer.allocate(capacity); } /** * Allocates an ExtendedByteBuffer by calling {@link java.nio.ByteBuffer#allocate(int)} internally * @see java.nio.ByteBuffer#allocate(int) * @param capacity * @param isDirect whether or not to internally call {@link java.nio.ByteBuffer#allocate(int)} or {@link java.nio.ByteBuffer#allocateDirect(int)} */ public ExtendedByteBuffer(int capacity, boolean isDirect) { if(isDirect) { buf = ByteBuffer.allocateDirect(capacity); } else { buf = ByteBuffer.allocate(capacity); } } /** * Allocates an ExtendedByteBuffer by calling {@link java.nio.ByteBuffer#wrap(byte[])} internally * @param array */ public ExtendedByteBuffer(byte[] array) { buf = ByteBuffer.wrap(array); } /** * Allocates an ExtendedByteBuffer by calling {@link java.nio.ByteBuffer#wrap(byte[], int, int)} internally * @param array * @param offset * @param length */ public ExtendedByteBuffer(byte[] array, int offset, int length) { buf = ByteBuffer.wrap(array, offset, length); } /** * @return * @see java.nio.ByteBuffer#array() */ public final byte[] array() { return buf.array(); } /** * @return * @see java.nio.ByteBuffer#arrayOffset() */ public final int arrayOffset() { return buf.arrayOffset(); } /** * @return returns the ByteBuffer that is being wrapped by the ExtendedByteBuffer class */ public ByteBuffer asByteBuffer() { return buf; } /** * @return * @see java.nio.ByteBuffer#asCharBuffer() */ public CharBuffer asCharBuffer() { return buf.asCharBuffer(); } /** * @return * @see java.nio.ByteBuffer#asDoubleBuffer() */ public DoubleBuffer asDoubleBuffer() { return buf.asDoubleBuffer(); } /** * @return * @see java.nio.ByteBuffer#asFloatBuffer() */ public FloatBuffer asFloatBuffer() { return buf.asFloatBuffer(); } /** * @return * @see java.nio.ByteBuffer#asIntBuffer() */ public IntBuffer asIntBuffer() { return buf.asIntBuffer(); } /** * @return * @see java.nio.ByteBuffer#asLongBuffer() */ public LongBuffer asLongBuffer() { return buf.asLongBuffer(); } /** * @return * @see java.nio.ByteBuffer#asReadOnlyBuffer() */ public ByteBuffer asReadOnlyBuffer() { return buf.asReadOnlyBuffer(); } /** * @return * @see java.nio.ByteBuffer#asShortBuffer() */ public ShortBuffer asShortBuffer() { return buf.asShortBuffer(); } /** * If the buffer is currently at an odd position, it will advance * to an even position. * @throws IOException */ public void blockAlign() { if(buf.position()%2==1) { buf.position(buf.position()+1); } } /** * @return * @see java.nio.Buffer#capacity() */ public final int capacity() { return buf.capacity(); } /** * @return * @see java.nio.Buffer#clear() */ public final Buffer clear() { return buf.clear(); } /** * @return * @see java.nio.ByteBuffer#compact() */ public ByteBuffer compact() { return buf.compact(); } /** * @param that * @return * @see java.nio.ByteBuffer#compareTo(java.nio.ByteBuffer) */ public int compareTo(ByteBuffer that) { return buf.compareTo(that); } /** * @return * @see java.nio.ByteBuffer#duplicate() */ public ByteBuffer duplicate() { return buf.duplicate(); } /** * @param ob * @return * @see java.nio.ByteBuffer#equals(java.lang.Object) */ public boolean equals(Object ob) { return buf.equals(ob); } /** * @return * @see java.nio.Buffer#flip() */ public final Buffer flip() { return buf.flip(); } /** * @return * @see java.nio.ByteBuffer#get() */ public byte getByte() { return buf.get(); } /** * @param index * @return * @see java.nio.ByteBuffer#get(int) */ public byte getByte(int index) { return buf.get(index); } /** * @param dst * @return * @see java.nio.ByteBuffer#get(byte[]) */ public ByteBuffer getBytes(byte[] dst) { return buf.get(dst); } /** * @param dst * @param offset * @param length * @return * @see java.nio.ByteBuffer#get(byte[], int, int) */ public ByteBuffer getBytes(byte[] dst, int offset, int length) { return buf.get(dst, offset, length); } /** * @param position The position in which to start getting bytes. Must be non-negative and no larger than the current limit * @param length The number of bytes to get. Must be non-negative, and position+length should be no larger than the current limit. * @return Returns a byte array from the ExtendedByteBuffer starting at the given position with the given length. New newPostion of the EsxByteBuffer will be postion+length. */ public byte[] getBytes(int position, int length) { byte[] returnBytes = new byte[length]; buf.position(position); buf.get(returnBytes); return returnBytes; } /** * @return * @see java.nio.ByteBuffer#getChar() */ public char getChar() { return buf.getChar(); } /** * @param index * @return * @see java.nio.ByteBuffer#getChar(int) */ public char getChar(int index) { return buf.getChar(index); } /** * @return * @see java.nio.ByteBuffer#getDouble() */ public double getDouble() { return buf.getDouble(); } /** * @param index * @return * @see java.nio.ByteBuffer#getDouble(int) */ public double getDouble(int index) { return buf.getDouble(index); } /** * @return * @see java.nio.ByteBuffer#getFloat() */ public float getFloat() { return buf.getFloat(); } /** * @param index * @return * @see java.nio.ByteBuffer#getFloat(int) */ public float getFloat(int index) { return buf.getFloat(index); } /** * @return * @see java.nio.ByteBuffer#getInt() */ public int getInt() { return buf.getInt(); } /** * @param index * @return * @see java.nio.ByteBuffer#getInt(int) */ public int getInt(int index) { return buf.getInt(index); } /** * @return * @see java.nio.ByteBuffer#getLong() */ public long getLong() { return buf.getLong(); } /** * @param index * @return * @see java.nio.ByteBuffer#getLong(int) */ public long getLong(int index) { return buf.getLong(index); } /** * @return * @see java.nio.ByteBuffer#getShort() */ public short getShort() { return buf.getShort(); } /** * @param index * @return * @see java.nio.ByteBuffer#getShort(int) */ public short getShort(int index) { return buf.getShort(index); } /** * @return */ public int getUnsignedByte() { return (buf.get() & 0xFF); } /** * @param index * @return */ public int getUnsignedByte(int index) { return (buf.get(index) & 0xFF); } /** * @return */ public long getUnsignedInt() { return ((long) buf.getInt() & 0xFFFFFFFFL); } /** * @param index * @return */ public long getUnsignedInt(int index) { return ((long) buf.getInt(index) & 0xFFFFFFFFL); } /** * @return */ public int getUnsignedShort() { return (buf.getShort() & 0xFFFF); } /** * @param index * @return */ public int getUnsignedShort(int index) { return (buf.getShort(index) & 0xFFFF); } /** * @return * @see java.nio.ByteBuffer#hasArray() */ public final boolean hasArray() { return buf.hasArray(); } /** * @return * @see java.nio.ByteBuffer#hashCode() */ public int hashCode() { return buf.hashCode(); } /** * @return * @see java.nio.Buffer#hasRemaining() */ public final boolean hasRemaining() { return buf.hasRemaining(); } /** * @return * @see java.nio.ByteBuffer#isDirect() */ public boolean isDirect() { return buf.isDirect(); } /** * @return * @see java.nio.Buffer#isReadOnly() */ public boolean isReadOnly() { return buf.isReadOnly(); } /** * @return * @see java.nio.Buffer#limit() */ public final int limit() { return buf.limit(); } /** * @param newLimit * @return * @see java.nio.Buffer#limit(int) */ public final Buffer limit(int newLimit) { return buf.limit(newLimit); } /** * @return * @see java.nio.Buffer#mark() */ public final Buffer mark() { return buf.mark(); } /** * @return * @see java.nio.ByteBuffer#order() */ public final ByteOrder order() { return buf.order(); } /** * @param bo * @return * @see java.nio.ByteBuffer#order(java.nio.ByteOrder) */ public final ByteBuffer order(ByteOrder bo) { return buf.order(bo); } /** * @return * @see java.nio.Buffer#position() */ public final int position() { return buf.position(); } /** * @param newPosition * @return * @see java.nio.Buffer#position(int) */ public final Buffer position(int newPosition) { return buf.position(newPosition); } /** * If the buffer is currently at an odd position, it will advance * to an even position by writing a byte with value 0x00. * @throws IOException */ public void putBlockAlign() { if(buf.position()%2==1) { buf.put((byte)0); } } /** * @param b * @return * @see java.nio.ByteBuffer#put(byte) */ public ByteBuffer putByte(byte b) { return buf.put(b); } /** * @param index * @param b * @return * @see java.nio.ByteBuffer#put(int, byte) */ public ByteBuffer putByte(int index, byte b) { return buf.put(index, b); } /** * @param src * @return * @see java.nio.ByteBuffer#put(java.nio.ByteBuffer) */ public ByteBuffer putByteBuffer(ByteBuffer src) { return buf.put(src); } /** * @param src * @return * @see java.nio.ByteBuffer#put(byte[]) */ public final ByteBuffer putBytes(byte[] src) { return buf.put(src); } /** * @param src * @param offset * @param length * @return * @see java.nio.ByteBuffer#put(byte[], int, int) */ public ByteBuffer putBytes(byte[] src, int offset, int length) { return buf.put(src, offset, length); } /** * @param value * @return * @see java.nio.ByteBuffer#putChar(char) */ public ByteBuffer putChar(char value) { return buf.putChar(value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putChar(int, char) */ public ByteBuffer putChar(int index, char value) { return buf.putChar(index, value); } /** * @param value * @return * @see java.nio.ByteBuffer#putDouble(double) */ public ByteBuffer putDouble(double value) { return buf.putDouble(value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putDouble(int, double) */ public ByteBuffer putDouble(int index, double value) { return buf.putDouble(index, value); } /** * @param value * @return * @see java.nio.ByteBuffer#putFloat(float) */ public ByteBuffer putFloat(float value) { return buf.putFloat(value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putFloat(int, float) */ public ByteBuffer putFloat(int index, float value) { return buf.putFloat(index, value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putInt(int, int) */ public ByteBuffer putInt(int index, int value) { return buf.putInt(index, value); } /** * @param value * @return * @see java.nio.ByteBuffer#putInt(int) */ public ByteBuffer putInt(int value) { return buf.putInt(value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putLong(int, long) */ public ByteBuffer putLong(int index, long value) { return buf.putLong(index, value); } /** * @param value * @return * @see java.nio.ByteBuffer#putLong(long) */ public ByteBuffer putLong(long value) { return buf.putLong(value); } /** * @param index * @param value * @return * @see java.nio.ByteBuffer#putShort(int, short) */ public ByteBuffer putShort(int index, short value) { return buf.putShort(index, value); } /** * @param value * @return * @see java.nio.ByteBuffer#putShort(short) */ public ByteBuffer putShort(short value) { return buf.putShort(value); } /** * @param value */ public void putUnsignedByte(int value) { buf.put((byte) (value & 0xFF)); } /** * @param index * @param value */ public void putUnsignedByte(int index, int value) { buf.put(index, (byte) value); } /** * @param value */ public void putUnsignedInt(long value) { buf.putInt((int) (value & 0xFFFFFFFFL)); } /** * @param index * @param value */ public void putUnsignedInt(int index, long value) { buf.putInt(index, (int) (value & 0xFFFFFFFFL)); } /** * @param value */ public void putUnsignedShort(int value) { buf.putShort((short) (value & 0xFFFF)); } /** * @param index * @param value */ public void putUnsignedShort(int index, int value) { buf.putShort(index, (short) (value & 0xFFFF)); } /** * @return * @see java.nio.Buffer#remaining() */ public final int remaining() { return buf.remaining(); } /** * @return * @see java.nio.Buffer#reset() */ public final Buffer reset() { return buf.reset(); } /** * @return * @see java.nio.Buffer#rewind() */ public final Buffer rewind() { return buf.rewind(); } /** * @return * @see java.nio.ByteBuffer#slice() */ public ByteBuffer slice() { return buf.slice(); } /** * @return * @see java.nio.ByteBuffer#toString() */ public String toString() { return buf.toString(); } }