Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java
38924 views
/*1* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/24package com.sun.media.sound;2526import java.nio.ByteBuffer;27import java.nio.ByteOrder;28import java.nio.DoubleBuffer;29import java.nio.FloatBuffer;3031import javax.sound.sampled.AudioFormat;32import javax.sound.sampled.AudioFormat.Encoding;3334/**35* This class is used to convert between 8,16,24,32,32+ bit signed/unsigned36* big/litle endian fixed/floating point byte buffers and float buffers.37*38* @author Karl Helgason39*/40public abstract class AudioFloatConverter {4142/***************************************************************************43*44* LSB Filter, used filter least significant byte in samples arrays.45*46* Is used filter out data in lsb byte when SampleSizeInBits is not47* dividable by 8.48*49**************************************************************************/5051private static class AudioFloatLSBFilter extends AudioFloatConverter {5253private final AudioFloatConverter converter;5455final private int offset;5657final private int stepsize;5859final private byte mask;6061private byte[] mask_buffer;6263AudioFloatLSBFilter(AudioFloatConverter converter, AudioFormat format) {64int bits = format.getSampleSizeInBits();65boolean bigEndian = format.isBigEndian();66this.converter = converter;67stepsize = (bits + 7) / 8;68offset = bigEndian ? (stepsize - 1) : 0;69int lsb_bits = bits % 8;70if (lsb_bits == 0)71mask = (byte) 0x00;72else if (lsb_bits == 1)73mask = (byte) 0x80;74else if (lsb_bits == 2)75mask = (byte) 0xC0;76else if (lsb_bits == 3)77mask = (byte) 0xE0;78else if (lsb_bits == 4)79mask = (byte) 0xF0;80else if (lsb_bits == 5)81mask = (byte) 0xF8;82else if (lsb_bits == 6)83mask = (byte) 0xFC;84else if (lsb_bits == 7)85mask = (byte) 0xFE;86else87mask = (byte) 0xFF;88}8990public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,91byte[] out_buff, int out_offset) {92byte[] ret = converter.toByteArray(in_buff, in_offset, in_len,93out_buff, out_offset);9495int out_offset_end = in_len * stepsize;96for (int i = out_offset + offset; i < out_offset_end; i += stepsize) {97out_buff[i] = (byte) (out_buff[i] & mask);98}99100return ret;101}102103public float[] toFloatArray(byte[] in_buff, int in_offset,104float[] out_buff, int out_offset, int out_len) {105if (mask_buffer == null || mask_buffer.length < in_buff.length)106mask_buffer = new byte[in_buff.length];107System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length);108int in_offset_end = out_len * stepsize;109for (int i = in_offset + offset; i < in_offset_end; i += stepsize) {110mask_buffer[i] = (byte) (mask_buffer[i] & mask);111}112float[] ret = converter.toFloatArray(mask_buffer, in_offset,113out_buff, out_offset, out_len);114return ret;115}116117}118119/***************************************************************************120*121* 64 bit float, little/big-endian122*123**************************************************************************/124125// PCM 64 bit float, little-endian126private static class AudioFloatConversion64L extends AudioFloatConverter {127ByteBuffer bytebuffer = null;128129DoubleBuffer floatbuffer = null;130131double[] double_buff = null;132133public float[] toFloatArray(byte[] in_buff, int in_offset,134float[] out_buff, int out_offset, int out_len) {135int in_len = out_len * 8;136if (bytebuffer == null || bytebuffer.capacity() < in_len) {137bytebuffer = ByteBuffer.allocate(in_len).order(138ByteOrder.LITTLE_ENDIAN);139floatbuffer = bytebuffer.asDoubleBuffer();140}141bytebuffer.position(0);142floatbuffer.position(0);143bytebuffer.put(in_buff, in_offset, in_len);144if (double_buff == null145|| double_buff.length < out_len + out_offset)146double_buff = new double[out_len + out_offset];147floatbuffer.get(double_buff, out_offset, out_len);148int out_offset_end = out_offset + out_len;149for (int i = out_offset; i < out_offset_end; i++) {150out_buff[i] = (float) double_buff[i];151}152return out_buff;153}154155public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,156byte[] out_buff, int out_offset) {157int out_len = in_len * 8;158if (bytebuffer == null || bytebuffer.capacity() < out_len) {159bytebuffer = ByteBuffer.allocate(out_len).order(160ByteOrder.LITTLE_ENDIAN);161floatbuffer = bytebuffer.asDoubleBuffer();162}163floatbuffer.position(0);164bytebuffer.position(0);165if (double_buff == null || double_buff.length < in_offset + in_len)166double_buff = new double[in_offset + in_len];167int in_offset_end = in_offset + in_len;168for (int i = in_offset; i < in_offset_end; i++) {169double_buff[i] = in_buff[i];170}171floatbuffer.put(double_buff, in_offset, in_len);172bytebuffer.get(out_buff, out_offset, out_len);173return out_buff;174}175}176177// PCM 64 bit float, big-endian178private static class AudioFloatConversion64B extends AudioFloatConverter {179ByteBuffer bytebuffer = null;180181DoubleBuffer floatbuffer = null;182183double[] double_buff = null;184185public float[] toFloatArray(byte[] in_buff, int in_offset,186float[] out_buff, int out_offset, int out_len) {187int in_len = out_len * 8;188if (bytebuffer == null || bytebuffer.capacity() < in_len) {189bytebuffer = ByteBuffer.allocate(in_len).order(190ByteOrder.BIG_ENDIAN);191floatbuffer = bytebuffer.asDoubleBuffer();192}193bytebuffer.position(0);194floatbuffer.position(0);195bytebuffer.put(in_buff, in_offset, in_len);196if (double_buff == null197|| double_buff.length < out_len + out_offset)198double_buff = new double[out_len + out_offset];199floatbuffer.get(double_buff, out_offset, out_len);200int out_offset_end = out_offset + out_len;201for (int i = out_offset; i < out_offset_end; i++) {202out_buff[i] = (float) double_buff[i];203}204return out_buff;205}206207public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,208byte[] out_buff, int out_offset) {209int out_len = in_len * 8;210if (bytebuffer == null || bytebuffer.capacity() < out_len) {211bytebuffer = ByteBuffer.allocate(out_len).order(212ByteOrder.BIG_ENDIAN);213floatbuffer = bytebuffer.asDoubleBuffer();214}215floatbuffer.position(0);216bytebuffer.position(0);217if (double_buff == null || double_buff.length < in_offset + in_len)218double_buff = new double[in_offset + in_len];219int in_offset_end = in_offset + in_len;220for (int i = in_offset; i < in_offset_end; i++) {221double_buff[i] = in_buff[i];222}223floatbuffer.put(double_buff, in_offset, in_len);224bytebuffer.get(out_buff, out_offset, out_len);225return out_buff;226}227}228229/***************************************************************************230*231* 32 bit float, little/big-endian232*233**************************************************************************/234235// PCM 32 bit float, little-endian236private static class AudioFloatConversion32L extends AudioFloatConverter {237ByteBuffer bytebuffer = null;238239FloatBuffer floatbuffer = null;240241public float[] toFloatArray(byte[] in_buff, int in_offset,242float[] out_buff, int out_offset, int out_len) {243int in_len = out_len * 4;244if (bytebuffer == null || bytebuffer.capacity() < in_len) {245bytebuffer = ByteBuffer.allocate(in_len).order(246ByteOrder.LITTLE_ENDIAN);247floatbuffer = bytebuffer.asFloatBuffer();248}249bytebuffer.position(0);250floatbuffer.position(0);251bytebuffer.put(in_buff, in_offset, in_len);252floatbuffer.get(out_buff, out_offset, out_len);253return out_buff;254}255256public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,257byte[] out_buff, int out_offset) {258int out_len = in_len * 4;259if (bytebuffer == null || bytebuffer.capacity() < out_len) {260bytebuffer = ByteBuffer.allocate(out_len).order(261ByteOrder.LITTLE_ENDIAN);262floatbuffer = bytebuffer.asFloatBuffer();263}264floatbuffer.position(0);265bytebuffer.position(0);266floatbuffer.put(in_buff, in_offset, in_len);267bytebuffer.get(out_buff, out_offset, out_len);268return out_buff;269}270}271272// PCM 32 bit float, big-endian273private static class AudioFloatConversion32B extends AudioFloatConverter {274ByteBuffer bytebuffer = null;275276FloatBuffer floatbuffer = null;277278public float[] toFloatArray(byte[] in_buff, int in_offset,279float[] out_buff, int out_offset, int out_len) {280int in_len = out_len * 4;281if (bytebuffer == null || bytebuffer.capacity() < in_len) {282bytebuffer = ByteBuffer.allocate(in_len).order(283ByteOrder.BIG_ENDIAN);284floatbuffer = bytebuffer.asFloatBuffer();285}286bytebuffer.position(0);287floatbuffer.position(0);288bytebuffer.put(in_buff, in_offset, in_len);289floatbuffer.get(out_buff, out_offset, out_len);290return out_buff;291}292293public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,294byte[] out_buff, int out_offset) {295int out_len = in_len * 4;296if (bytebuffer == null || bytebuffer.capacity() < out_len) {297bytebuffer = ByteBuffer.allocate(out_len).order(298ByteOrder.BIG_ENDIAN);299floatbuffer = bytebuffer.asFloatBuffer();300}301floatbuffer.position(0);302bytebuffer.position(0);303floatbuffer.put(in_buff, in_offset, in_len);304bytebuffer.get(out_buff, out_offset, out_len);305return out_buff;306}307}308309/***************************************************************************310*311* 8 bit signed/unsigned312*313**************************************************************************/314315// PCM 8 bit, signed316private static class AudioFloatConversion8S extends AudioFloatConverter {317public float[] toFloatArray(byte[] in_buff, int in_offset,318float[] out_buff, int out_offset, int out_len) {319int ix = in_offset;320int ox = out_offset;321for (int i = 0; i < out_len; i++)322out_buff[ox++] = in_buff[ix++] * (1.0f / 127.0f);323return out_buff;324}325326public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,327byte[] out_buff, int out_offset) {328int ix = in_offset;329int ox = out_offset;330for (int i = 0; i < in_len; i++)331out_buff[ox++] = (byte) (in_buff[ix++] * 127.0f);332return out_buff;333}334}335336// PCM 8 bit, unsigned337private static class AudioFloatConversion8U extends AudioFloatConverter {338public float[] toFloatArray(byte[] in_buff, int in_offset,339float[] out_buff, int out_offset, int out_len) {340int ix = in_offset;341int ox = out_offset;342for (int i = 0; i < out_len; i++)343out_buff[ox++] = ((in_buff[ix++] & 0xFF) - 127)344* (1.0f / 127.0f);345return out_buff;346}347348public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,349byte[] out_buff, int out_offset) {350int ix = in_offset;351int ox = out_offset;352for (int i = 0; i < in_len; i++)353out_buff[ox++] = (byte) (127 + in_buff[ix++] * 127.0f);354return out_buff;355}356}357358/***************************************************************************359*360* 16 bit signed/unsigned, little/big-endian361*362**************************************************************************/363364// PCM 16 bit, signed, little-endian365private static class AudioFloatConversion16SL extends AudioFloatConverter {366public float[] toFloatArray(byte[] in_buff, int in_offset,367float[] out_buff, int out_offset, int out_len) {368int ix = in_offset;369int len = out_offset + out_len;370for (int ox = out_offset; ox < len; ox++) {371out_buff[ox] = ((short) ((in_buff[ix++] & 0xFF) |372(in_buff[ix++] << 8))) * (1.0f / 32767.0f);373}374375return out_buff;376}377378public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,379byte[] out_buff, int out_offset) {380int ox = out_offset;381int len = in_offset + in_len;382for (int ix = in_offset; ix < len; ix++) {383int x = (int) (in_buff[ix] * 32767.0);384out_buff[ox++] = (byte) x;385out_buff[ox++] = (byte) (x >>> 8);386}387return out_buff;388}389}390391// PCM 16 bit, signed, big-endian392private static class AudioFloatConversion16SB extends AudioFloatConverter {393public float[] toFloatArray(byte[] in_buff, int in_offset,394float[] out_buff, int out_offset, int out_len) {395int ix = in_offset;396int ox = out_offset;397for (int i = 0; i < out_len; i++) {398out_buff[ox++] = ((short) ((in_buff[ix++] << 8) |399(in_buff[ix++] & 0xFF))) * (1.0f / 32767.0f);400}401return out_buff;402}403404public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,405byte[] out_buff, int out_offset) {406int ix = in_offset;407int ox = out_offset;408for (int i = 0; i < in_len; i++) {409int x = (int) (in_buff[ix++] * 32767.0);410out_buff[ox++] = (byte) (x >>> 8);411out_buff[ox++] = (byte) x;412}413return out_buff;414}415}416417// PCM 16 bit, unsigned, little-endian418private static class AudioFloatConversion16UL extends AudioFloatConverter {419public float[] toFloatArray(byte[] in_buff, int in_offset,420float[] out_buff, int out_offset, int out_len) {421int ix = in_offset;422int ox = out_offset;423for (int i = 0; i < out_len; i++) {424int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8);425out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f);426}427return out_buff;428}429430public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,431byte[] out_buff, int out_offset) {432int ix = in_offset;433int ox = out_offset;434for (int i = 0; i < in_len; i++) {435int x = 32767 + (int) (in_buff[ix++] * 32767.0);436out_buff[ox++] = (byte) x;437out_buff[ox++] = (byte) (x >>> 8);438}439return out_buff;440}441}442443// PCM 16 bit, unsigned, big-endian444private static class AudioFloatConversion16UB extends AudioFloatConverter {445public float[] toFloatArray(byte[] in_buff, int in_offset,446float[] out_buff, int out_offset, int out_len) {447int ix = in_offset;448int ox = out_offset;449for (int i = 0; i < out_len; i++) {450int x = ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);451out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f);452}453return out_buff;454}455456public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,457byte[] out_buff, int out_offset) {458int ix = in_offset;459int ox = out_offset;460for (int i = 0; i < in_len; i++) {461int x = 32767 + (int) (in_buff[ix++] * 32767.0);462out_buff[ox++] = (byte) (x >>> 8);463out_buff[ox++] = (byte) x;464}465return out_buff;466}467}468469/***************************************************************************470*471* 24 bit signed/unsigned, little/big-endian472*473**************************************************************************/474475// PCM 24 bit, signed, little-endian476private static class AudioFloatConversion24SL extends AudioFloatConverter {477public float[] toFloatArray(byte[] in_buff, int in_offset,478float[] out_buff, int out_offset, int out_len) {479int ix = in_offset;480int ox = out_offset;481for (int i = 0; i < out_len; i++) {482int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)483| ((in_buff[ix++] & 0xFF) << 16);484if (x > 0x7FFFFF)485x -= 0x1000000;486out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);487}488return out_buff;489}490491public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,492byte[] out_buff, int out_offset) {493int ix = in_offset;494int ox = out_offset;495for (int i = 0; i < in_len; i++) {496int x = (int) (in_buff[ix++] * (float)0x7FFFFF);497if (x < 0)498x += 0x1000000;499out_buff[ox++] = (byte) x;500out_buff[ox++] = (byte) (x >>> 8);501out_buff[ox++] = (byte) (x >>> 16);502}503return out_buff;504}505}506507// PCM 24 bit, signed, big-endian508private static class AudioFloatConversion24SB extends AudioFloatConverter {509public float[] toFloatArray(byte[] in_buff, int in_offset,510float[] out_buff, int out_offset, int out_len) {511int ix = in_offset;512int ox = out_offset;513for (int i = 0; i < out_len; i++) {514int x = ((in_buff[ix++] & 0xFF) << 16)515| ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);516if (x > 0x7FFFFF)517x -= 0x1000000;518out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);519}520return out_buff;521}522523public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,524byte[] out_buff, int out_offset) {525int ix = in_offset;526int ox = out_offset;527for (int i = 0; i < in_len; i++) {528int x = (int) (in_buff[ix++] * (float)0x7FFFFF);529if (x < 0)530x += 0x1000000;531out_buff[ox++] = (byte) (x >>> 16);532out_buff[ox++] = (byte) (x >>> 8);533out_buff[ox++] = (byte) x;534}535return out_buff;536}537}538539// PCM 24 bit, unsigned, little-endian540private static class AudioFloatConversion24UL extends AudioFloatConverter {541public float[] toFloatArray(byte[] in_buff, int in_offset,542float[] out_buff, int out_offset, int out_len) {543int ix = in_offset;544int ox = out_offset;545for (int i = 0; i < out_len; i++) {546int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)547| ((in_buff[ix++] & 0xFF) << 16);548x -= 0x7FFFFF;549out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);550}551return out_buff;552}553554public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,555byte[] out_buff, int out_offset) {556int ix = in_offset;557int ox = out_offset;558for (int i = 0; i < in_len; i++) {559int x = (int) (in_buff[ix++] * (float)0x7FFFFF);560x += 0x7FFFFF;561out_buff[ox++] = (byte) x;562out_buff[ox++] = (byte) (x >>> 8);563out_buff[ox++] = (byte) (x >>> 16);564}565return out_buff;566}567}568569// PCM 24 bit, unsigned, big-endian570private static class AudioFloatConversion24UB extends AudioFloatConverter {571public float[] toFloatArray(byte[] in_buff, int in_offset,572float[] out_buff, int out_offset, int out_len) {573int ix = in_offset;574int ox = out_offset;575for (int i = 0; i < out_len; i++) {576int x = ((in_buff[ix++] & 0xFF) << 16)577| ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);578x -= 0x7FFFFF;579out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);580}581return out_buff;582}583584public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,585byte[] out_buff, int out_offset) {586int ix = in_offset;587int ox = out_offset;588for (int i = 0; i < in_len; i++) {589int x = (int) (in_buff[ix++] * (float)0x7FFFFF);590x += 0x7FFFFF;591out_buff[ox++] = (byte) (x >>> 16);592out_buff[ox++] = (byte) (x >>> 8);593out_buff[ox++] = (byte) x;594}595return out_buff;596}597}598599/***************************************************************************600*601* 32 bit signed/unsigned, little/big-endian602*603**************************************************************************/604605// PCM 32 bit, signed, little-endian606private static class AudioFloatConversion32SL extends AudioFloatConverter {607public float[] toFloatArray(byte[] in_buff, int in_offset,608float[] out_buff, int out_offset, int out_len) {609int ix = in_offset;610int ox = out_offset;611for (int i = 0; i < out_len; i++) {612int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) |613((in_buff[ix++] & 0xFF) << 16) |614((in_buff[ix++] & 0xFF) << 24);615out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);616}617return out_buff;618}619620public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,621byte[] out_buff, int out_offset) {622int ix = in_offset;623int ox = out_offset;624for (int i = 0; i < in_len; i++) {625int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);626out_buff[ox++] = (byte) x;627out_buff[ox++] = (byte) (x >>> 8);628out_buff[ox++] = (byte) (x >>> 16);629out_buff[ox++] = (byte) (x >>> 24);630}631return out_buff;632}633}634635// PCM 32 bit, signed, big-endian636private static class AudioFloatConversion32SB extends AudioFloatConverter {637public float[] toFloatArray(byte[] in_buff, int in_offset,638float[] out_buff, int out_offset, int out_len) {639int ix = in_offset;640int ox = out_offset;641for (int i = 0; i < out_len; i++) {642int x = ((in_buff[ix++] & 0xFF) << 24) |643((in_buff[ix++] & 0xFF) << 16) |644((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);645out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);646}647return out_buff;648}649650public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,651byte[] out_buff, int out_offset) {652int ix = in_offset;653int ox = out_offset;654for (int i = 0; i < in_len; i++) {655int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);656out_buff[ox++] = (byte) (x >>> 24);657out_buff[ox++] = (byte) (x >>> 16);658out_buff[ox++] = (byte) (x >>> 8);659out_buff[ox++] = (byte) x;660}661return out_buff;662}663}664665// PCM 32 bit, unsigned, little-endian666private static class AudioFloatConversion32UL extends AudioFloatConverter {667public float[] toFloatArray(byte[] in_buff, int in_offset,668float[] out_buff, int out_offset, int out_len) {669int ix = in_offset;670int ox = out_offset;671for (int i = 0; i < out_len; i++) {672int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) |673((in_buff[ix++] & 0xFF) << 16) |674((in_buff[ix++] & 0xFF) << 24);675x -= 0x7FFFFFFF;676out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);677}678return out_buff;679}680681public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,682byte[] out_buff, int out_offset) {683int ix = in_offset;684int ox = out_offset;685for (int i = 0; i < in_len; i++) {686int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);687x += 0x7FFFFFFF;688out_buff[ox++] = (byte) x;689out_buff[ox++] = (byte) (x >>> 8);690out_buff[ox++] = (byte) (x >>> 16);691out_buff[ox++] = (byte) (x >>> 24);692}693return out_buff;694}695}696697// PCM 32 bit, unsigned, big-endian698private static class AudioFloatConversion32UB extends AudioFloatConverter {699700public float[] toFloatArray(byte[] in_buff, int in_offset,701float[] out_buff, int out_offset, int out_len) {702int ix = in_offset;703int ox = out_offset;704for (int i = 0; i < out_len; i++) {705int x = ((in_buff[ix++] & 0xFF) << 24) |706((in_buff[ix++] & 0xFF) << 16) |707((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);708x -= 0x7FFFFFFF;709out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);710}711return out_buff;712}713714public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,715byte[] out_buff, int out_offset) {716int ix = in_offset;717int ox = out_offset;718for (int i = 0; i < in_len; i++) {719int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);720x += 0x7FFFFFFF;721out_buff[ox++] = (byte) (x >>> 24);722out_buff[ox++] = (byte) (x >>> 16);723out_buff[ox++] = (byte) (x >>> 8);724out_buff[ox++] = (byte) x;725}726return out_buff;727}728}729730/***************************************************************************731*732* 32+ bit signed/unsigned, little/big-endian733*734**************************************************************************/735736// PCM 32+ bit, signed, little-endian737private static class AudioFloatConversion32xSL extends AudioFloatConverter {738739final int xbytes;740741AudioFloatConversion32xSL(int xbytes) {742this.xbytes = xbytes;743}744745public float[] toFloatArray(byte[] in_buff, int in_offset,746float[] out_buff, int out_offset, int out_len) {747int ix = in_offset;748int ox = out_offset;749for (int i = 0; i < out_len; i++) {750ix += xbytes;751int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)752| ((in_buff[ix++] & 0xFF) << 16)753| ((in_buff[ix++] & 0xFF) << 24);754out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);755}756return out_buff;757}758759public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,760byte[] out_buff, int out_offset) {761int ix = in_offset;762int ox = out_offset;763for (int i = 0; i < in_len; i++) {764int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);765for (int j = 0; j < xbytes; j++) {766out_buff[ox++] = 0;767}768out_buff[ox++] = (byte) x;769out_buff[ox++] = (byte) (x >>> 8);770out_buff[ox++] = (byte) (x >>> 16);771out_buff[ox++] = (byte) (x >>> 24);772}773return out_buff;774}775}776777// PCM 32+ bit, signed, big-endian778private static class AudioFloatConversion32xSB extends AudioFloatConverter {779780final int xbytes;781782AudioFloatConversion32xSB(int xbytes) {783this.xbytes = xbytes;784}785786public float[] toFloatArray(byte[] in_buff, int in_offset,787float[] out_buff, int out_offset, int out_len) {788int ix = in_offset;789int ox = out_offset;790for (int i = 0; i < out_len; i++) {791int x = ((in_buff[ix++] & 0xFF) << 24)792| ((in_buff[ix++] & 0xFF) << 16)793| ((in_buff[ix++] & 0xFF) << 8)794| (in_buff[ix++] & 0xFF);795ix += xbytes;796out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);797}798return out_buff;799}800801public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,802byte[] out_buff, int out_offset) {803int ix = in_offset;804int ox = out_offset;805for (int i = 0; i < in_len; i++) {806int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);807out_buff[ox++] = (byte) (x >>> 24);808out_buff[ox++] = (byte) (x >>> 16);809out_buff[ox++] = (byte) (x >>> 8);810out_buff[ox++] = (byte) x;811for (int j = 0; j < xbytes; j++) {812out_buff[ox++] = 0;813}814}815return out_buff;816}817}818819// PCM 32+ bit, unsigned, little-endian820private static class AudioFloatConversion32xUL extends AudioFloatConverter {821822final int xbytes;823824AudioFloatConversion32xUL(int xbytes) {825this.xbytes = xbytes;826}827828public float[] toFloatArray(byte[] in_buff, int in_offset,829float[] out_buff, int out_offset, int out_len) {830int ix = in_offset;831int ox = out_offset;832for (int i = 0; i < out_len; i++) {833ix += xbytes;834int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)835| ((in_buff[ix++] & 0xFF) << 16)836| ((in_buff[ix++] & 0xFF) << 24);837x -= 0x7FFFFFFF;838out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);839}840return out_buff;841}842843public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,844byte[] out_buff, int out_offset) {845int ix = in_offset;846int ox = out_offset;847for (int i = 0; i < in_len; i++) {848int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);849x += 0x7FFFFFFF;850for (int j = 0; j < xbytes; j++) {851out_buff[ox++] = 0;852}853out_buff[ox++] = (byte) x;854out_buff[ox++] = (byte) (x >>> 8);855out_buff[ox++] = (byte) (x >>> 16);856out_buff[ox++] = (byte) (x >>> 24);857}858return out_buff;859}860}861862// PCM 32+ bit, unsigned, big-endian863private static class AudioFloatConversion32xUB extends AudioFloatConverter {864865final int xbytes;866867AudioFloatConversion32xUB(int xbytes) {868this.xbytes = xbytes;869}870871public float[] toFloatArray(byte[] in_buff, int in_offset,872float[] out_buff, int out_offset, int out_len) {873int ix = in_offset;874int ox = out_offset;875for (int i = 0; i < out_len; i++) {876int x = ((in_buff[ix++] & 0xFF) << 24) |877((in_buff[ix++] & 0xFF) << 16) |878((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);879ix += xbytes;880x -= 2147483647;881out_buff[ox++] = x * (1.0f / 2147483647.0f);882}883return out_buff;884}885886public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,887byte[] out_buff, int out_offset) {888int ix = in_offset;889int ox = out_offset;890for (int i = 0; i < in_len; i++) {891int x = (int) (in_buff[ix++] * 2147483647.0);892x += 2147483647;893out_buff[ox++] = (byte) (x >>> 24);894out_buff[ox++] = (byte) (x >>> 16);895out_buff[ox++] = (byte) (x >>> 8);896out_buff[ox++] = (byte) x;897for (int j = 0; j < xbytes; j++) {898out_buff[ox++] = 0;899}900}901return out_buff;902}903}904905public static AudioFloatConverter getConverter(AudioFormat format) {906AudioFloatConverter conv = null;907if (format.getFrameSize() == 0)908return null;909if (format.getFrameSize() !=910((format.getSampleSizeInBits() + 7) / 8) * format.getChannels()) {911return null;912}913if (format.getEncoding().equals(Encoding.PCM_SIGNED)) {914if (format.isBigEndian()) {915if (format.getSampleSizeInBits() <= 8) {916conv = new AudioFloatConversion8S();917} else if (format.getSampleSizeInBits() > 8 &&918format.getSampleSizeInBits() <= 16) {919conv = new AudioFloatConversion16SB();920} else if (format.getSampleSizeInBits() > 16 &&921format.getSampleSizeInBits() <= 24) {922conv = new AudioFloatConversion24SB();923} else if (format.getSampleSizeInBits() > 24 &&924format.getSampleSizeInBits() <= 32) {925conv = new AudioFloatConversion32SB();926} else if (format.getSampleSizeInBits() > 32) {927conv = new AudioFloatConversion32xSB(((format928.getSampleSizeInBits() + 7) / 8) - 4);929}930} else {931if (format.getSampleSizeInBits() <= 8) {932conv = new AudioFloatConversion8S();933} else if (format.getSampleSizeInBits() > 8 &&934format.getSampleSizeInBits() <= 16) {935conv = new AudioFloatConversion16SL();936} else if (format.getSampleSizeInBits() > 16 &&937format.getSampleSizeInBits() <= 24) {938conv = new AudioFloatConversion24SL();939} else if (format.getSampleSizeInBits() > 24 &&940format.getSampleSizeInBits() <= 32) {941conv = new AudioFloatConversion32SL();942} else if (format.getSampleSizeInBits() > 32) {943conv = new AudioFloatConversion32xSL(((format944.getSampleSizeInBits() + 7) / 8) - 4);945}946}947} else if (format.getEncoding().equals(Encoding.PCM_UNSIGNED)) {948if (format.isBigEndian()) {949if (format.getSampleSizeInBits() <= 8) {950conv = new AudioFloatConversion8U();951} else if (format.getSampleSizeInBits() > 8 &&952format.getSampleSizeInBits() <= 16) {953conv = new AudioFloatConversion16UB();954} else if (format.getSampleSizeInBits() > 16 &&955format.getSampleSizeInBits() <= 24) {956conv = new AudioFloatConversion24UB();957} else if (format.getSampleSizeInBits() > 24 &&958format.getSampleSizeInBits() <= 32) {959conv = new AudioFloatConversion32UB();960} else if (format.getSampleSizeInBits() > 32) {961conv = new AudioFloatConversion32xUB(((962format.getSampleSizeInBits() + 7) / 8) - 4);963}964} else {965if (format.getSampleSizeInBits() <= 8) {966conv = new AudioFloatConversion8U();967} else if (format.getSampleSizeInBits() > 8 &&968format.getSampleSizeInBits() <= 16) {969conv = new AudioFloatConversion16UL();970} else if (format.getSampleSizeInBits() > 16 &&971format.getSampleSizeInBits() <= 24) {972conv = new AudioFloatConversion24UL();973} else if (format.getSampleSizeInBits() > 24 &&974format.getSampleSizeInBits() <= 32) {975conv = new AudioFloatConversion32UL();976} else if (format.getSampleSizeInBits() > 32) {977conv = new AudioFloatConversion32xUL(((978format.getSampleSizeInBits() + 7) / 8) - 4);979}980}981} else if (format.getEncoding().equals(Encoding.PCM_FLOAT)) {982if (format.getSampleSizeInBits() == 32) {983if (format.isBigEndian())984conv = new AudioFloatConversion32B();985else986conv = new AudioFloatConversion32L();987} else if (format.getSampleSizeInBits() == 64) {988if (format.isBigEndian())989conv = new AudioFloatConversion64B();990else991conv = new AudioFloatConversion64L();992}993994}995996if ((format.getEncoding().equals(Encoding.PCM_SIGNED) ||997format.getEncoding().equals(Encoding.PCM_UNSIGNED)) &&998(format.getSampleSizeInBits() % 8 != 0)) {999conv = new AudioFloatLSBFilter(conv, format);1000}10011002if (conv != null)1003conv.format = format;1004return conv;1005}10061007private AudioFormat format;10081009public final AudioFormat getFormat() {1010return format;1011}10121013public abstract float[] toFloatArray(byte[] in_buff, int in_offset,1014float[] out_buff, int out_offset, int out_len);10151016public final float[] toFloatArray(byte[] in_buff, float[] out_buff,1017int out_offset, int out_len) {1018return toFloatArray(in_buff, 0, out_buff, out_offset, out_len);1019}10201021public final float[] toFloatArray(byte[] in_buff, int in_offset,1022float[] out_buff, int out_len) {1023return toFloatArray(in_buff, in_offset, out_buff, 0, out_len);1024}10251026public final float[] toFloatArray(byte[] in_buff, float[] out_buff,1027int out_len) {1028return toFloatArray(in_buff, 0, out_buff, 0, out_len);1029}10301031public final float[] toFloatArray(byte[] in_buff, float[] out_buff) {1032return toFloatArray(in_buff, 0, out_buff, 0, out_buff.length);1033}10341035public abstract byte[] toByteArray(float[] in_buff, int in_offset,1036int in_len, byte[] out_buff, int out_offset);10371038public final byte[] toByteArray(float[] in_buff, int in_len,1039byte[] out_buff, int out_offset) {1040return toByteArray(in_buff, 0, in_len, out_buff, out_offset);1041}10421043public final byte[] toByteArray(float[] in_buff, int in_offset, int in_len,1044byte[] out_buff) {1045return toByteArray(in_buff, in_offset, in_len, out_buff, 0);1046}10471048public final byte[] toByteArray(float[] in_buff, int in_len,1049byte[] out_buff) {1050return toByteArray(in_buff, 0, in_len, out_buff, 0);1051}10521053public final byte[] toByteArray(float[] in_buff, byte[] out_buff) {1054return toByteArray(in_buff, 0, in_buff.length, out_buff, 0);1055}1056}105710581059