⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voicedatabuffer.java

📁 Myjxta的源代码 基于JXTA的P2P即时通信系统
💻 JAVA
字号:
/* * Created on Mar 3, 2005 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */package net.jxta.myjxta.plugins.vojxta;/** * @author Ravi * @modified 2005-22-03 jamoore added capacity accessor and logger * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */import java.nio.ByteBuffer;import java.util.logging.Level;import java.util.logging.Logger;/** *  FIFO buffer. *  @author ravi *  @modified 2005-23-03 jamoore add dynamic buffer resize *  @modified 2005-23-03 jamoore add capacity accessor, audioresource and res name */public final class VoiceDataBuffer {    private static final Logger LOG = Logger.getLogger (VoiceDataBuffer.class.getName());    private ByteBuffer buffer = null;    private int length;    private int current;        private final String audioResourceName;        private final AudioResource audioResource;        private boolean bufferOverFlow = false;    /**     *     */    public VoiceDataBuffer (int size, AudioResource audioResource, String audioResourceName) {        super ();                LOG.setLevel (Level.INFO);        this.audioResource = audioResource;        this.audioResourceName = audioResourceName;        buffer = ByteBuffer.allocate (size);        length = 0;        current = 0;    }        public int getCapacity () {                return buffer.capacity ();    }        /**     *  Returns if there has been a buffer overflow.     *  Not sync'd     */    public boolean isBufferOverFlow () {                boolean rtn = bufferOverFlow;                if(bufferOverFlow == true) {                        bufferOverFlow = false;        }                return rtn;            }        public byte[] get (int len) {        synchronized (buffer) {            if (len > length) {                System.err.println ("error: len larger than buffer content length");                return null;            }            byte[] buf = new byte[len];            byte[] rem = new byte[length - len];            //			System.out.println("---popping len: " + len + " remlen: " +            // rem.length);            buffer.position (0);            buffer.get (buf, 0, len);            //			System.out.println("---got buf: " + arrayToString(buf));            length -= len; // size of contents in buffer is minus len            //			System.out.println("---length: " + length + " position: " +            // buffer.position());            current = buffer.position ();            //buffer.get(rem, current, length); // get remainder of buffer            // contents            for (int i = 0; i < length; i++) {                rem[i] = buffer.get ();            }            //			System.out.println("---got rem: " + arrayToString(rem));            buffer.position (0); // reset buffer position to front of buffer            buffer.put (rem); // shift remainder to beginning of buffer eg.            // buffer.put(rem, 0, length);            current = buffer.position ();            //			System.out.println("---current: " + current);            //clear(buffer.position()); // may not be necessary            return buf;        }            }        /**     *  Appends the given byte array to the end of this buffer. If a buffer     *  overflow occurs a new buffer is allocated and it's size is increased     *  acording to the audio resource's (speaker, mic) current buffer spec.     *  @modified 2005-23-03 jamoore add dynamic buffer increase     */    public void append (byte[] array) {                synchronized (buffer) {                        if (array.length + length > buffer.capacity ()) {                                synchronized(buffer) {                    bufferOverFlow = true; // only used for debugging, no sync needed                                        LOG.setLevel (Level.INFO);                    if(LOG.getLevel () == Level.INFO) {                        LOG.info("buffer overflow error in " + audioResourceName +                                 " : current size " + this.size() + " capacity " +                                 buffer.capacity());                    }                                        ByteBuffer tmpBuffer = ByteBuffer.allocate (buffer.capacity () +                            audioResource.getBufferSize ());                                        tmpBuffer.put (buffer);                                        buffer = null;                                        buffer = tmpBuffer;                                        tmpBuffer = null;                                    }                                if(LOG.getLevel () == Level.INFO) {                    LOG.info("adjusting buffer size to " + buffer.capacity());                }                            }                        buffer.put (array);                        length += array.length;                        current = buffer.position ();        }    }        /**     *  Appends a single byte onto the buffer. Behaves exactly as if a call to     *  append(byte[]) with a byte[1] arg     *  @modified 2005-23-03 jamoore this method now calls append(byte[])     */    public void append (byte b) {                byte[] buff = new byte[1];                buff[0] = b;                append (buff);            }        public int size () {        synchronized (buffer) {            return length;        }    }        /*     * must be called in synchronized block     */    private void clear (int offset) {        for (int i = offset; i < buffer.capacity (); i++) {            buffer.put (i, (byte) 0);        }        buffer.position (offset); // reset position to offset index value    }        private void reset () {        buffer.position (current);    }        public void printBuffer () {        synchronized (buffer) {            System.out.println (audioResourceName+" Length of buffer contents: " + size ()            + ", current position: " + buffer.position ());            System.out.print ("buffer: ");            buffer.position (0);            for (int i = 0; i < buffer.capacity (); i++) {                String str = (i == 0) ? "[" : ", ";                System.out.print (str + (char) buffer.get ());            }            System.out.println ("]");            reset ();        }    }        public static String arrayToString (byte[] array) {        String string = "";        if (array.length <= 0)            return string;        for (int i = 0; i < array.length; i++) {            string += (i == 0) ? "[" : ", ";            string += (char) array[i];        }        string += "]";        return string;    }        public void printBuffer (int offset, int len) {        synchronized (buffer) {            System.out.println ("Length of buffer contents: " + size ()            + ", current position: " + buffer.position ());            System.out.print ("Voice Data Buffer Content : ");            buffer.position (offset);            for (int i = 0; i < len; i++) {                String str = (i == 0) ? "[" : ",";                System.out.print (str + (char) buffer.get ());            }            System.out.println ("]");            reset ();        }    }        public static void main (String[] args) {        /*        System.out.println ("Testing VoiceDatBuffer...");        //VoiceDataBuffer mybuff = new VoiceDataBuffer (10,"Test");        mybuff.printBuffer ();        byte[] a = { 'a', 'b', 'c' };        mybuff.append (a);        mybuff.printBuffer ();        byte[] b = { 'd', 'e', 'f', 'g' };        mybuff.append (b);        mybuff.printBuffer ();        byte[] c = { 'h', 'i', 'j', 'k' };        mybuff.append (c);        mybuff.printBuffer ();                 byte[] d = mybuff.get (4);        System.out.println ("d.len: " + d.length + " " + arrayToString (d));        mybuff.printBuffer ();                 mybuff.append (c);        mybuff.printBuffer ();                 mybuff.get (7);        mybuff.printBuffer ();                 mybuff.append ((byte) 'a');        mybuff.printBuffer ();                 mybuff.append (c);        mybuff.append (c);        mybuff.append ((byte) 'b');        mybuff.printBuffer ();                 mybuff.append ((byte) 'c');        mybuff.printBuffer ();                 byte[] e = mybuff.get (9);        mybuff.printBuffer ();                 mybuff.get (2);        mybuff.printBuffer ();                 System.exit (0);         **/    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -