Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java
38924 views
1
/*
2
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
package com.sun.media.sound;
26
27
import java.nio.ByteBuffer;
28
import java.nio.ByteOrder;
29
import java.nio.DoubleBuffer;
30
import java.nio.FloatBuffer;
31
32
import javax.sound.sampled.AudioFormat;
33
import javax.sound.sampled.AudioFormat.Encoding;
34
35
/**
36
* This class is used to convert between 8,16,24,32,32+ bit signed/unsigned
37
* big/litle endian fixed/floating point byte buffers and float buffers.
38
*
39
* @author Karl Helgason
40
*/
41
public abstract class AudioFloatConverter {
42
43
/***************************************************************************
44
*
45
* LSB Filter, used filter least significant byte in samples arrays.
46
*
47
* Is used filter out data in lsb byte when SampleSizeInBits is not
48
* dividable by 8.
49
*
50
**************************************************************************/
51
52
private static class AudioFloatLSBFilter extends AudioFloatConverter {
53
54
private final AudioFloatConverter converter;
55
56
final private int offset;
57
58
final private int stepsize;
59
60
final private byte mask;
61
62
private byte[] mask_buffer;
63
64
AudioFloatLSBFilter(AudioFloatConverter converter, AudioFormat format) {
65
int bits = format.getSampleSizeInBits();
66
boolean bigEndian = format.isBigEndian();
67
this.converter = converter;
68
stepsize = (bits + 7) / 8;
69
offset = bigEndian ? (stepsize - 1) : 0;
70
int lsb_bits = bits % 8;
71
if (lsb_bits == 0)
72
mask = (byte) 0x00;
73
else if (lsb_bits == 1)
74
mask = (byte) 0x80;
75
else if (lsb_bits == 2)
76
mask = (byte) 0xC0;
77
else if (lsb_bits == 3)
78
mask = (byte) 0xE0;
79
else if (lsb_bits == 4)
80
mask = (byte) 0xF0;
81
else if (lsb_bits == 5)
82
mask = (byte) 0xF8;
83
else if (lsb_bits == 6)
84
mask = (byte) 0xFC;
85
else if (lsb_bits == 7)
86
mask = (byte) 0xFE;
87
else
88
mask = (byte) 0xFF;
89
}
90
91
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
92
byte[] out_buff, int out_offset) {
93
byte[] ret = converter.toByteArray(in_buff, in_offset, in_len,
94
out_buff, out_offset);
95
96
int out_offset_end = in_len * stepsize;
97
for (int i = out_offset + offset; i < out_offset_end; i += stepsize) {
98
out_buff[i] = (byte) (out_buff[i] & mask);
99
}
100
101
return ret;
102
}
103
104
public float[] toFloatArray(byte[] in_buff, int in_offset,
105
float[] out_buff, int out_offset, int out_len) {
106
if (mask_buffer == null || mask_buffer.length < in_buff.length)
107
mask_buffer = new byte[in_buff.length];
108
System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length);
109
int in_offset_end = out_len * stepsize;
110
for (int i = in_offset + offset; i < in_offset_end; i += stepsize) {
111
mask_buffer[i] = (byte) (mask_buffer[i] & mask);
112
}
113
float[] ret = converter.toFloatArray(mask_buffer, in_offset,
114
out_buff, out_offset, out_len);
115
return ret;
116
}
117
118
}
119
120
/***************************************************************************
121
*
122
* 64 bit float, little/big-endian
123
*
124
**************************************************************************/
125
126
// PCM 64 bit float, little-endian
127
private static class AudioFloatConversion64L extends AudioFloatConverter {
128
ByteBuffer bytebuffer = null;
129
130
DoubleBuffer floatbuffer = null;
131
132
double[] double_buff = null;
133
134
public float[] toFloatArray(byte[] in_buff, int in_offset,
135
float[] out_buff, int out_offset, int out_len) {
136
int in_len = out_len * 8;
137
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
138
bytebuffer = ByteBuffer.allocate(in_len).order(
139
ByteOrder.LITTLE_ENDIAN);
140
floatbuffer = bytebuffer.asDoubleBuffer();
141
}
142
bytebuffer.position(0);
143
floatbuffer.position(0);
144
bytebuffer.put(in_buff, in_offset, in_len);
145
if (double_buff == null
146
|| double_buff.length < out_len + out_offset)
147
double_buff = new double[out_len + out_offset];
148
floatbuffer.get(double_buff, out_offset, out_len);
149
int out_offset_end = out_offset + out_len;
150
for (int i = out_offset; i < out_offset_end; i++) {
151
out_buff[i] = (float) double_buff[i];
152
}
153
return out_buff;
154
}
155
156
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
157
byte[] out_buff, int out_offset) {
158
int out_len = in_len * 8;
159
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
160
bytebuffer = ByteBuffer.allocate(out_len).order(
161
ByteOrder.LITTLE_ENDIAN);
162
floatbuffer = bytebuffer.asDoubleBuffer();
163
}
164
floatbuffer.position(0);
165
bytebuffer.position(0);
166
if (double_buff == null || double_buff.length < in_offset + in_len)
167
double_buff = new double[in_offset + in_len];
168
int in_offset_end = in_offset + in_len;
169
for (int i = in_offset; i < in_offset_end; i++) {
170
double_buff[i] = in_buff[i];
171
}
172
floatbuffer.put(double_buff, in_offset, in_len);
173
bytebuffer.get(out_buff, out_offset, out_len);
174
return out_buff;
175
}
176
}
177
178
// PCM 64 bit float, big-endian
179
private static class AudioFloatConversion64B extends AudioFloatConverter {
180
ByteBuffer bytebuffer = null;
181
182
DoubleBuffer floatbuffer = null;
183
184
double[] double_buff = null;
185
186
public float[] toFloatArray(byte[] in_buff, int in_offset,
187
float[] out_buff, int out_offset, int out_len) {
188
int in_len = out_len * 8;
189
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
190
bytebuffer = ByteBuffer.allocate(in_len).order(
191
ByteOrder.BIG_ENDIAN);
192
floatbuffer = bytebuffer.asDoubleBuffer();
193
}
194
bytebuffer.position(0);
195
floatbuffer.position(0);
196
bytebuffer.put(in_buff, in_offset, in_len);
197
if (double_buff == null
198
|| double_buff.length < out_len + out_offset)
199
double_buff = new double[out_len + out_offset];
200
floatbuffer.get(double_buff, out_offset, out_len);
201
int out_offset_end = out_offset + out_len;
202
for (int i = out_offset; i < out_offset_end; i++) {
203
out_buff[i] = (float) double_buff[i];
204
}
205
return out_buff;
206
}
207
208
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
209
byte[] out_buff, int out_offset) {
210
int out_len = in_len * 8;
211
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
212
bytebuffer = ByteBuffer.allocate(out_len).order(
213
ByteOrder.BIG_ENDIAN);
214
floatbuffer = bytebuffer.asDoubleBuffer();
215
}
216
floatbuffer.position(0);
217
bytebuffer.position(0);
218
if (double_buff == null || double_buff.length < in_offset + in_len)
219
double_buff = new double[in_offset + in_len];
220
int in_offset_end = in_offset + in_len;
221
for (int i = in_offset; i < in_offset_end; i++) {
222
double_buff[i] = in_buff[i];
223
}
224
floatbuffer.put(double_buff, in_offset, in_len);
225
bytebuffer.get(out_buff, out_offset, out_len);
226
return out_buff;
227
}
228
}
229
230
/***************************************************************************
231
*
232
* 32 bit float, little/big-endian
233
*
234
**************************************************************************/
235
236
// PCM 32 bit float, little-endian
237
private static class AudioFloatConversion32L extends AudioFloatConverter {
238
ByteBuffer bytebuffer = null;
239
240
FloatBuffer floatbuffer = null;
241
242
public float[] toFloatArray(byte[] in_buff, int in_offset,
243
float[] out_buff, int out_offset, int out_len) {
244
int in_len = out_len * 4;
245
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
246
bytebuffer = ByteBuffer.allocate(in_len).order(
247
ByteOrder.LITTLE_ENDIAN);
248
floatbuffer = bytebuffer.asFloatBuffer();
249
}
250
bytebuffer.position(0);
251
floatbuffer.position(0);
252
bytebuffer.put(in_buff, in_offset, in_len);
253
floatbuffer.get(out_buff, out_offset, out_len);
254
return out_buff;
255
}
256
257
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
258
byte[] out_buff, int out_offset) {
259
int out_len = in_len * 4;
260
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
261
bytebuffer = ByteBuffer.allocate(out_len).order(
262
ByteOrder.LITTLE_ENDIAN);
263
floatbuffer = bytebuffer.asFloatBuffer();
264
}
265
floatbuffer.position(0);
266
bytebuffer.position(0);
267
floatbuffer.put(in_buff, in_offset, in_len);
268
bytebuffer.get(out_buff, out_offset, out_len);
269
return out_buff;
270
}
271
}
272
273
// PCM 32 bit float, big-endian
274
private static class AudioFloatConversion32B extends AudioFloatConverter {
275
ByteBuffer bytebuffer = null;
276
277
FloatBuffer floatbuffer = null;
278
279
public float[] toFloatArray(byte[] in_buff, int in_offset,
280
float[] out_buff, int out_offset, int out_len) {
281
int in_len = out_len * 4;
282
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
283
bytebuffer = ByteBuffer.allocate(in_len).order(
284
ByteOrder.BIG_ENDIAN);
285
floatbuffer = bytebuffer.asFloatBuffer();
286
}
287
bytebuffer.position(0);
288
floatbuffer.position(0);
289
bytebuffer.put(in_buff, in_offset, in_len);
290
floatbuffer.get(out_buff, out_offset, out_len);
291
return out_buff;
292
}
293
294
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
295
byte[] out_buff, int out_offset) {
296
int out_len = in_len * 4;
297
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
298
bytebuffer = ByteBuffer.allocate(out_len).order(
299
ByteOrder.BIG_ENDIAN);
300
floatbuffer = bytebuffer.asFloatBuffer();
301
}
302
floatbuffer.position(0);
303
bytebuffer.position(0);
304
floatbuffer.put(in_buff, in_offset, in_len);
305
bytebuffer.get(out_buff, out_offset, out_len);
306
return out_buff;
307
}
308
}
309
310
/***************************************************************************
311
*
312
* 8 bit signed/unsigned
313
*
314
**************************************************************************/
315
316
// PCM 8 bit, signed
317
private static class AudioFloatConversion8S extends AudioFloatConverter {
318
public float[] toFloatArray(byte[] in_buff, int in_offset,
319
float[] out_buff, int out_offset, int out_len) {
320
int ix = in_offset;
321
int ox = out_offset;
322
for (int i = 0; i < out_len; i++)
323
out_buff[ox++] = in_buff[ix++] * (1.0f / 127.0f);
324
return out_buff;
325
}
326
327
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
328
byte[] out_buff, int out_offset) {
329
int ix = in_offset;
330
int ox = out_offset;
331
for (int i = 0; i < in_len; i++)
332
out_buff[ox++] = (byte) (in_buff[ix++] * 127.0f);
333
return out_buff;
334
}
335
}
336
337
// PCM 8 bit, unsigned
338
private static class AudioFloatConversion8U extends AudioFloatConverter {
339
public float[] toFloatArray(byte[] in_buff, int in_offset,
340
float[] out_buff, int out_offset, int out_len) {
341
int ix = in_offset;
342
int ox = out_offset;
343
for (int i = 0; i < out_len; i++)
344
out_buff[ox++] = ((in_buff[ix++] & 0xFF) - 127)
345
* (1.0f / 127.0f);
346
return out_buff;
347
}
348
349
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
350
byte[] out_buff, int out_offset) {
351
int ix = in_offset;
352
int ox = out_offset;
353
for (int i = 0; i < in_len; i++)
354
out_buff[ox++] = (byte) (127 + in_buff[ix++] * 127.0f);
355
return out_buff;
356
}
357
}
358
359
/***************************************************************************
360
*
361
* 16 bit signed/unsigned, little/big-endian
362
*
363
**************************************************************************/
364
365
// PCM 16 bit, signed, little-endian
366
private static class AudioFloatConversion16SL extends AudioFloatConverter {
367
public float[] toFloatArray(byte[] in_buff, int in_offset,
368
float[] out_buff, int out_offset, int out_len) {
369
int ix = in_offset;
370
int len = out_offset + out_len;
371
for (int ox = out_offset; ox < len; ox++) {
372
out_buff[ox] = ((short) ((in_buff[ix++] & 0xFF) |
373
(in_buff[ix++] << 8))) * (1.0f / 32767.0f);
374
}
375
376
return out_buff;
377
}
378
379
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
380
byte[] out_buff, int out_offset) {
381
int ox = out_offset;
382
int len = in_offset + in_len;
383
for (int ix = in_offset; ix < len; ix++) {
384
int x = (int) (in_buff[ix] * 32767.0);
385
out_buff[ox++] = (byte) x;
386
out_buff[ox++] = (byte) (x >>> 8);
387
}
388
return out_buff;
389
}
390
}
391
392
// PCM 16 bit, signed, big-endian
393
private static class AudioFloatConversion16SB extends AudioFloatConverter {
394
public float[] toFloatArray(byte[] in_buff, int in_offset,
395
float[] out_buff, int out_offset, int out_len) {
396
int ix = in_offset;
397
int ox = out_offset;
398
for (int i = 0; i < out_len; i++) {
399
out_buff[ox++] = ((short) ((in_buff[ix++] << 8) |
400
(in_buff[ix++] & 0xFF))) * (1.0f / 32767.0f);
401
}
402
return out_buff;
403
}
404
405
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
406
byte[] out_buff, int out_offset) {
407
int ix = in_offset;
408
int ox = out_offset;
409
for (int i = 0; i < in_len; i++) {
410
int x = (int) (in_buff[ix++] * 32767.0);
411
out_buff[ox++] = (byte) (x >>> 8);
412
out_buff[ox++] = (byte) x;
413
}
414
return out_buff;
415
}
416
}
417
418
// PCM 16 bit, unsigned, little-endian
419
private static class AudioFloatConversion16UL extends AudioFloatConverter {
420
public float[] toFloatArray(byte[] in_buff, int in_offset,
421
float[] out_buff, int out_offset, int out_len) {
422
int ix = in_offset;
423
int ox = out_offset;
424
for (int i = 0; i < out_len; i++) {
425
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8);
426
out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f);
427
}
428
return out_buff;
429
}
430
431
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
432
byte[] out_buff, int out_offset) {
433
int ix = in_offset;
434
int ox = out_offset;
435
for (int i = 0; i < in_len; i++) {
436
int x = 32767 + (int) (in_buff[ix++] * 32767.0);
437
out_buff[ox++] = (byte) x;
438
out_buff[ox++] = (byte) (x >>> 8);
439
}
440
return out_buff;
441
}
442
}
443
444
// PCM 16 bit, unsigned, big-endian
445
private static class AudioFloatConversion16UB extends AudioFloatConverter {
446
public float[] toFloatArray(byte[] in_buff, int in_offset,
447
float[] out_buff, int out_offset, int out_len) {
448
int ix = in_offset;
449
int ox = out_offset;
450
for (int i = 0; i < out_len; i++) {
451
int x = ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
452
out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f);
453
}
454
return out_buff;
455
}
456
457
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
458
byte[] out_buff, int out_offset) {
459
int ix = in_offset;
460
int ox = out_offset;
461
for (int i = 0; i < in_len; i++) {
462
int x = 32767 + (int) (in_buff[ix++] * 32767.0);
463
out_buff[ox++] = (byte) (x >>> 8);
464
out_buff[ox++] = (byte) x;
465
}
466
return out_buff;
467
}
468
}
469
470
/***************************************************************************
471
*
472
* 24 bit signed/unsigned, little/big-endian
473
*
474
**************************************************************************/
475
476
// PCM 24 bit, signed, little-endian
477
private static class AudioFloatConversion24SL extends AudioFloatConverter {
478
public float[] toFloatArray(byte[] in_buff, int in_offset,
479
float[] out_buff, int out_offset, int out_len) {
480
int ix = in_offset;
481
int ox = out_offset;
482
for (int i = 0; i < out_len; i++) {
483
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)
484
| ((in_buff[ix++] & 0xFF) << 16);
485
if (x > 0x7FFFFF)
486
x -= 0x1000000;
487
out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);
488
}
489
return out_buff;
490
}
491
492
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
493
byte[] out_buff, int out_offset) {
494
int ix = in_offset;
495
int ox = out_offset;
496
for (int i = 0; i < in_len; i++) {
497
int x = (int) (in_buff[ix++] * (float)0x7FFFFF);
498
if (x < 0)
499
x += 0x1000000;
500
out_buff[ox++] = (byte) x;
501
out_buff[ox++] = (byte) (x >>> 8);
502
out_buff[ox++] = (byte) (x >>> 16);
503
}
504
return out_buff;
505
}
506
}
507
508
// PCM 24 bit, signed, big-endian
509
private static class AudioFloatConversion24SB extends AudioFloatConverter {
510
public float[] toFloatArray(byte[] in_buff, int in_offset,
511
float[] out_buff, int out_offset, int out_len) {
512
int ix = in_offset;
513
int ox = out_offset;
514
for (int i = 0; i < out_len; i++) {
515
int x = ((in_buff[ix++] & 0xFF) << 16)
516
| ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
517
if (x > 0x7FFFFF)
518
x -= 0x1000000;
519
out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);
520
}
521
return out_buff;
522
}
523
524
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
525
byte[] out_buff, int out_offset) {
526
int ix = in_offset;
527
int ox = out_offset;
528
for (int i = 0; i < in_len; i++) {
529
int x = (int) (in_buff[ix++] * (float)0x7FFFFF);
530
if (x < 0)
531
x += 0x1000000;
532
out_buff[ox++] = (byte) (x >>> 16);
533
out_buff[ox++] = (byte) (x >>> 8);
534
out_buff[ox++] = (byte) x;
535
}
536
return out_buff;
537
}
538
}
539
540
// PCM 24 bit, unsigned, little-endian
541
private static class AudioFloatConversion24UL extends AudioFloatConverter {
542
public float[] toFloatArray(byte[] in_buff, int in_offset,
543
float[] out_buff, int out_offset, int out_len) {
544
int ix = in_offset;
545
int ox = out_offset;
546
for (int i = 0; i < out_len; i++) {
547
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)
548
| ((in_buff[ix++] & 0xFF) << 16);
549
x -= 0x7FFFFF;
550
out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);
551
}
552
return out_buff;
553
}
554
555
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
556
byte[] out_buff, int out_offset) {
557
int ix = in_offset;
558
int ox = out_offset;
559
for (int i = 0; i < in_len; i++) {
560
int x = (int) (in_buff[ix++] * (float)0x7FFFFF);
561
x += 0x7FFFFF;
562
out_buff[ox++] = (byte) x;
563
out_buff[ox++] = (byte) (x >>> 8);
564
out_buff[ox++] = (byte) (x >>> 16);
565
}
566
return out_buff;
567
}
568
}
569
570
// PCM 24 bit, unsigned, big-endian
571
private static class AudioFloatConversion24UB extends AudioFloatConverter {
572
public float[] toFloatArray(byte[] in_buff, int in_offset,
573
float[] out_buff, int out_offset, int out_len) {
574
int ix = in_offset;
575
int ox = out_offset;
576
for (int i = 0; i < out_len; i++) {
577
int x = ((in_buff[ix++] & 0xFF) << 16)
578
| ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
579
x -= 0x7FFFFF;
580
out_buff[ox++] = x * (1.0f / (float)0x7FFFFF);
581
}
582
return out_buff;
583
}
584
585
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
586
byte[] out_buff, int out_offset) {
587
int ix = in_offset;
588
int ox = out_offset;
589
for (int i = 0; i < in_len; i++) {
590
int x = (int) (in_buff[ix++] * (float)0x7FFFFF);
591
x += 0x7FFFFF;
592
out_buff[ox++] = (byte) (x >>> 16);
593
out_buff[ox++] = (byte) (x >>> 8);
594
out_buff[ox++] = (byte) x;
595
}
596
return out_buff;
597
}
598
}
599
600
/***************************************************************************
601
*
602
* 32 bit signed/unsigned, little/big-endian
603
*
604
**************************************************************************/
605
606
// PCM 32 bit, signed, little-endian
607
private static class AudioFloatConversion32SL extends AudioFloatConverter {
608
public float[] toFloatArray(byte[] in_buff, int in_offset,
609
float[] out_buff, int out_offset, int out_len) {
610
int ix = in_offset;
611
int ox = out_offset;
612
for (int i = 0; i < out_len; i++) {
613
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) |
614
((in_buff[ix++] & 0xFF) << 16) |
615
((in_buff[ix++] & 0xFF) << 24);
616
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
617
}
618
return out_buff;
619
}
620
621
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
622
byte[] out_buff, int out_offset) {
623
int ix = in_offset;
624
int ox = out_offset;
625
for (int i = 0; i < in_len; i++) {
626
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
627
out_buff[ox++] = (byte) x;
628
out_buff[ox++] = (byte) (x >>> 8);
629
out_buff[ox++] = (byte) (x >>> 16);
630
out_buff[ox++] = (byte) (x >>> 24);
631
}
632
return out_buff;
633
}
634
}
635
636
// PCM 32 bit, signed, big-endian
637
private static class AudioFloatConversion32SB extends AudioFloatConverter {
638
public float[] toFloatArray(byte[] in_buff, int in_offset,
639
float[] out_buff, int out_offset, int out_len) {
640
int ix = in_offset;
641
int ox = out_offset;
642
for (int i = 0; i < out_len; i++) {
643
int x = ((in_buff[ix++] & 0xFF) << 24) |
644
((in_buff[ix++] & 0xFF) << 16) |
645
((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
646
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
647
}
648
return out_buff;
649
}
650
651
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
652
byte[] out_buff, int out_offset) {
653
int ix = in_offset;
654
int ox = out_offset;
655
for (int i = 0; i < in_len; i++) {
656
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
657
out_buff[ox++] = (byte) (x >>> 24);
658
out_buff[ox++] = (byte) (x >>> 16);
659
out_buff[ox++] = (byte) (x >>> 8);
660
out_buff[ox++] = (byte) x;
661
}
662
return out_buff;
663
}
664
}
665
666
// PCM 32 bit, unsigned, little-endian
667
private static class AudioFloatConversion32UL extends AudioFloatConverter {
668
public float[] toFloatArray(byte[] in_buff, int in_offset,
669
float[] out_buff, int out_offset, int out_len) {
670
int ix = in_offset;
671
int ox = out_offset;
672
for (int i = 0; i < out_len; i++) {
673
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) |
674
((in_buff[ix++] & 0xFF) << 16) |
675
((in_buff[ix++] & 0xFF) << 24);
676
x -= 0x7FFFFFFF;
677
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
678
}
679
return out_buff;
680
}
681
682
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
683
byte[] out_buff, int out_offset) {
684
int ix = in_offset;
685
int ox = out_offset;
686
for (int i = 0; i < in_len; i++) {
687
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
688
x += 0x7FFFFFFF;
689
out_buff[ox++] = (byte) x;
690
out_buff[ox++] = (byte) (x >>> 8);
691
out_buff[ox++] = (byte) (x >>> 16);
692
out_buff[ox++] = (byte) (x >>> 24);
693
}
694
return out_buff;
695
}
696
}
697
698
// PCM 32 bit, unsigned, big-endian
699
private static class AudioFloatConversion32UB extends AudioFloatConverter {
700
701
public float[] toFloatArray(byte[] in_buff, int in_offset,
702
float[] out_buff, int out_offset, int out_len) {
703
int ix = in_offset;
704
int ox = out_offset;
705
for (int i = 0; i < out_len; i++) {
706
int x = ((in_buff[ix++] & 0xFF) << 24) |
707
((in_buff[ix++] & 0xFF) << 16) |
708
((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
709
x -= 0x7FFFFFFF;
710
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
711
}
712
return out_buff;
713
}
714
715
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
716
byte[] out_buff, int out_offset) {
717
int ix = in_offset;
718
int ox = out_offset;
719
for (int i = 0; i < in_len; i++) {
720
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
721
x += 0x7FFFFFFF;
722
out_buff[ox++] = (byte) (x >>> 24);
723
out_buff[ox++] = (byte) (x >>> 16);
724
out_buff[ox++] = (byte) (x >>> 8);
725
out_buff[ox++] = (byte) x;
726
}
727
return out_buff;
728
}
729
}
730
731
/***************************************************************************
732
*
733
* 32+ bit signed/unsigned, little/big-endian
734
*
735
**************************************************************************/
736
737
// PCM 32+ bit, signed, little-endian
738
private static class AudioFloatConversion32xSL extends AudioFloatConverter {
739
740
final int xbytes;
741
742
AudioFloatConversion32xSL(int xbytes) {
743
this.xbytes = xbytes;
744
}
745
746
public float[] toFloatArray(byte[] in_buff, int in_offset,
747
float[] out_buff, int out_offset, int out_len) {
748
int ix = in_offset;
749
int ox = out_offset;
750
for (int i = 0; i < out_len; i++) {
751
ix += xbytes;
752
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)
753
| ((in_buff[ix++] & 0xFF) << 16)
754
| ((in_buff[ix++] & 0xFF) << 24);
755
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
756
}
757
return out_buff;
758
}
759
760
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
761
byte[] out_buff, int out_offset) {
762
int ix = in_offset;
763
int ox = out_offset;
764
for (int i = 0; i < in_len; i++) {
765
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
766
for (int j = 0; j < xbytes; j++) {
767
out_buff[ox++] = 0;
768
}
769
out_buff[ox++] = (byte) x;
770
out_buff[ox++] = (byte) (x >>> 8);
771
out_buff[ox++] = (byte) (x >>> 16);
772
out_buff[ox++] = (byte) (x >>> 24);
773
}
774
return out_buff;
775
}
776
}
777
778
// PCM 32+ bit, signed, big-endian
779
private static class AudioFloatConversion32xSB extends AudioFloatConverter {
780
781
final int xbytes;
782
783
AudioFloatConversion32xSB(int xbytes) {
784
this.xbytes = xbytes;
785
}
786
787
public float[] toFloatArray(byte[] in_buff, int in_offset,
788
float[] out_buff, int out_offset, int out_len) {
789
int ix = in_offset;
790
int ox = out_offset;
791
for (int i = 0; i < out_len; i++) {
792
int x = ((in_buff[ix++] & 0xFF) << 24)
793
| ((in_buff[ix++] & 0xFF) << 16)
794
| ((in_buff[ix++] & 0xFF) << 8)
795
| (in_buff[ix++] & 0xFF);
796
ix += xbytes;
797
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
798
}
799
return out_buff;
800
}
801
802
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
803
byte[] out_buff, int out_offset) {
804
int ix = in_offset;
805
int ox = out_offset;
806
for (int i = 0; i < in_len; i++) {
807
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
808
out_buff[ox++] = (byte) (x >>> 24);
809
out_buff[ox++] = (byte) (x >>> 16);
810
out_buff[ox++] = (byte) (x >>> 8);
811
out_buff[ox++] = (byte) x;
812
for (int j = 0; j < xbytes; j++) {
813
out_buff[ox++] = 0;
814
}
815
}
816
return out_buff;
817
}
818
}
819
820
// PCM 32+ bit, unsigned, little-endian
821
private static class AudioFloatConversion32xUL extends AudioFloatConverter {
822
823
final int xbytes;
824
825
AudioFloatConversion32xUL(int xbytes) {
826
this.xbytes = xbytes;
827
}
828
829
public float[] toFloatArray(byte[] in_buff, int in_offset,
830
float[] out_buff, int out_offset, int out_len) {
831
int ix = in_offset;
832
int ox = out_offset;
833
for (int i = 0; i < out_len; i++) {
834
ix += xbytes;
835
int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8)
836
| ((in_buff[ix++] & 0xFF) << 16)
837
| ((in_buff[ix++] & 0xFF) << 24);
838
x -= 0x7FFFFFFF;
839
out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF);
840
}
841
return out_buff;
842
}
843
844
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
845
byte[] out_buff, int out_offset) {
846
int ix = in_offset;
847
int ox = out_offset;
848
for (int i = 0; i < in_len; i++) {
849
int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF);
850
x += 0x7FFFFFFF;
851
for (int j = 0; j < xbytes; j++) {
852
out_buff[ox++] = 0;
853
}
854
out_buff[ox++] = (byte) x;
855
out_buff[ox++] = (byte) (x >>> 8);
856
out_buff[ox++] = (byte) (x >>> 16);
857
out_buff[ox++] = (byte) (x >>> 24);
858
}
859
return out_buff;
860
}
861
}
862
863
// PCM 32+ bit, unsigned, big-endian
864
private static class AudioFloatConversion32xUB extends AudioFloatConverter {
865
866
final int xbytes;
867
868
AudioFloatConversion32xUB(int xbytes) {
869
this.xbytes = xbytes;
870
}
871
872
public float[] toFloatArray(byte[] in_buff, int in_offset,
873
float[] out_buff, int out_offset, int out_len) {
874
int ix = in_offset;
875
int ox = out_offset;
876
for (int i = 0; i < out_len; i++) {
877
int x = ((in_buff[ix++] & 0xFF) << 24) |
878
((in_buff[ix++] & 0xFF) << 16) |
879
((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF);
880
ix += xbytes;
881
x -= 2147483647;
882
out_buff[ox++] = x * (1.0f / 2147483647.0f);
883
}
884
return out_buff;
885
}
886
887
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
888
byte[] out_buff, int out_offset) {
889
int ix = in_offset;
890
int ox = out_offset;
891
for (int i = 0; i < in_len; i++) {
892
int x = (int) (in_buff[ix++] * 2147483647.0);
893
x += 2147483647;
894
out_buff[ox++] = (byte) (x >>> 24);
895
out_buff[ox++] = (byte) (x >>> 16);
896
out_buff[ox++] = (byte) (x >>> 8);
897
out_buff[ox++] = (byte) x;
898
for (int j = 0; j < xbytes; j++) {
899
out_buff[ox++] = 0;
900
}
901
}
902
return out_buff;
903
}
904
}
905
906
public static AudioFloatConverter getConverter(AudioFormat format) {
907
AudioFloatConverter conv = null;
908
if (format.getFrameSize() == 0)
909
return null;
910
if (format.getFrameSize() !=
911
((format.getSampleSizeInBits() + 7) / 8) * format.getChannels()) {
912
return null;
913
}
914
if (format.getEncoding().equals(Encoding.PCM_SIGNED)) {
915
if (format.isBigEndian()) {
916
if (format.getSampleSizeInBits() <= 8) {
917
conv = new AudioFloatConversion8S();
918
} else if (format.getSampleSizeInBits() > 8 &&
919
format.getSampleSizeInBits() <= 16) {
920
conv = new AudioFloatConversion16SB();
921
} else if (format.getSampleSizeInBits() > 16 &&
922
format.getSampleSizeInBits() <= 24) {
923
conv = new AudioFloatConversion24SB();
924
} else if (format.getSampleSizeInBits() > 24 &&
925
format.getSampleSizeInBits() <= 32) {
926
conv = new AudioFloatConversion32SB();
927
} else if (format.getSampleSizeInBits() > 32) {
928
conv = new AudioFloatConversion32xSB(((format
929
.getSampleSizeInBits() + 7) / 8) - 4);
930
}
931
} else {
932
if (format.getSampleSizeInBits() <= 8) {
933
conv = new AudioFloatConversion8S();
934
} else if (format.getSampleSizeInBits() > 8 &&
935
format.getSampleSizeInBits() <= 16) {
936
conv = new AudioFloatConversion16SL();
937
} else if (format.getSampleSizeInBits() > 16 &&
938
format.getSampleSizeInBits() <= 24) {
939
conv = new AudioFloatConversion24SL();
940
} else if (format.getSampleSizeInBits() > 24 &&
941
format.getSampleSizeInBits() <= 32) {
942
conv = new AudioFloatConversion32SL();
943
} else if (format.getSampleSizeInBits() > 32) {
944
conv = new AudioFloatConversion32xSL(((format
945
.getSampleSizeInBits() + 7) / 8) - 4);
946
}
947
}
948
} else if (format.getEncoding().equals(Encoding.PCM_UNSIGNED)) {
949
if (format.isBigEndian()) {
950
if (format.getSampleSizeInBits() <= 8) {
951
conv = new AudioFloatConversion8U();
952
} else if (format.getSampleSizeInBits() > 8 &&
953
format.getSampleSizeInBits() <= 16) {
954
conv = new AudioFloatConversion16UB();
955
} else if (format.getSampleSizeInBits() > 16 &&
956
format.getSampleSizeInBits() <= 24) {
957
conv = new AudioFloatConversion24UB();
958
} else if (format.getSampleSizeInBits() > 24 &&
959
format.getSampleSizeInBits() <= 32) {
960
conv = new AudioFloatConversion32UB();
961
} else if (format.getSampleSizeInBits() > 32) {
962
conv = new AudioFloatConversion32xUB(((
963
format.getSampleSizeInBits() + 7) / 8) - 4);
964
}
965
} else {
966
if (format.getSampleSizeInBits() <= 8) {
967
conv = new AudioFloatConversion8U();
968
} else if (format.getSampleSizeInBits() > 8 &&
969
format.getSampleSizeInBits() <= 16) {
970
conv = new AudioFloatConversion16UL();
971
} else if (format.getSampleSizeInBits() > 16 &&
972
format.getSampleSizeInBits() <= 24) {
973
conv = new AudioFloatConversion24UL();
974
} else if (format.getSampleSizeInBits() > 24 &&
975
format.getSampleSizeInBits() <= 32) {
976
conv = new AudioFloatConversion32UL();
977
} else if (format.getSampleSizeInBits() > 32) {
978
conv = new AudioFloatConversion32xUL(((
979
format.getSampleSizeInBits() + 7) / 8) - 4);
980
}
981
}
982
} else if (format.getEncoding().equals(Encoding.PCM_FLOAT)) {
983
if (format.getSampleSizeInBits() == 32) {
984
if (format.isBigEndian())
985
conv = new AudioFloatConversion32B();
986
else
987
conv = new AudioFloatConversion32L();
988
} else if (format.getSampleSizeInBits() == 64) {
989
if (format.isBigEndian())
990
conv = new AudioFloatConversion64B();
991
else
992
conv = new AudioFloatConversion64L();
993
}
994
995
}
996
997
if ((format.getEncoding().equals(Encoding.PCM_SIGNED) ||
998
format.getEncoding().equals(Encoding.PCM_UNSIGNED)) &&
999
(format.getSampleSizeInBits() % 8 != 0)) {
1000
conv = new AudioFloatLSBFilter(conv, format);
1001
}
1002
1003
if (conv != null)
1004
conv.format = format;
1005
return conv;
1006
}
1007
1008
private AudioFormat format;
1009
1010
public final AudioFormat getFormat() {
1011
return format;
1012
}
1013
1014
public abstract float[] toFloatArray(byte[] in_buff, int in_offset,
1015
float[] out_buff, int out_offset, int out_len);
1016
1017
public final float[] toFloatArray(byte[] in_buff, float[] out_buff,
1018
int out_offset, int out_len) {
1019
return toFloatArray(in_buff, 0, out_buff, out_offset, out_len);
1020
}
1021
1022
public final float[] toFloatArray(byte[] in_buff, int in_offset,
1023
float[] out_buff, int out_len) {
1024
return toFloatArray(in_buff, in_offset, out_buff, 0, out_len);
1025
}
1026
1027
public final float[] toFloatArray(byte[] in_buff, float[] out_buff,
1028
int out_len) {
1029
return toFloatArray(in_buff, 0, out_buff, 0, out_len);
1030
}
1031
1032
public final float[] toFloatArray(byte[] in_buff, float[] out_buff) {
1033
return toFloatArray(in_buff, 0, out_buff, 0, out_buff.length);
1034
}
1035
1036
public abstract byte[] toByteArray(float[] in_buff, int in_offset,
1037
int in_len, byte[] out_buff, int out_offset);
1038
1039
public final byte[] toByteArray(float[] in_buff, int in_len,
1040
byte[] out_buff, int out_offset) {
1041
return toByteArray(in_buff, 0, in_len, out_buff, out_offset);
1042
}
1043
1044
public final byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
1045
byte[] out_buff) {
1046
return toByteArray(in_buff, in_offset, in_len, out_buff, 0);
1047
}
1048
1049
public final byte[] toByteArray(float[] in_buff, int in_len,
1050
byte[] out_buff) {
1051
return toByteArray(in_buff, 0, in_len, out_buff, 0);
1052
}
1053
1054
public final byte[] toByteArray(float[] in_buff, byte[] out_buff) {
1055
return toByteArray(in_buff, 0, in_buff.length, out_buff, 0);
1056
}
1057
}
1058
1059