/** * Convert the audio bytes into the stream * * @param format The audio format being decoded * @param audio_bytes The audio byts * @param two_bytes_data True if we using double byte data * @return The byte bufer of data */ private static ByteBuffer convertAudioBytes(AudioFormat format, byte[] audio_bytes, boolean two_bytes_data) { ByteBuffer dest = ByteBuffer.allocateDirect(audio_bytes.length); dest.order(ByteOrder.nativeOrder()); ByteBuffer src = ByteBuffer.wrap(audio_bytes); src.order(ByteOrder.BIG_ENDIAN); if (two_bytes_data) { ShortBuffer dest_short = dest.asShortBuffer(); ShortBuffer src_short = src.asShortBuffer(); while (src_short.hasRemaining()) dest_short.put(src_short.get()); } else { while (src.hasRemaining()) { byte b = src.get(); if (format.getEncoding() == Encoding.PCM_SIGNED) { b = (byte) (b + 127); } dest.put(b); } } dest.rewind(); return dest; }
public AudioInputStream getAudioInputStream(Encoding targetEncoding, AudioInputStream sourceStream) { if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) return sourceStream; AudioFormat format = sourceStream.getFormat(); int channels = format.getChannels(); Encoding encoding = targetEncoding; float samplerate = format.getSampleRate(); int bits = format.getSampleSizeInBits(); boolean bigendian = format.isBigEndian(); if (targetEncoding.equals(Encoding.PCM_FLOAT)) bits = 32; AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, channels, channels * bits / 8, samplerate, bigendian); return getAudioInputStream(targetFormat, sourceStream); }
public static void main(String[] args) throws Exception { // 1st checks Encoding.PCM_FLOAT is available pcmFloatEnc = Encoding.PCM_FLOAT; Encoding[] encodings = AudioSystem.getTargetEncodings(pcmFloatEnc); out("conversion from PCM_FLOAT to " + encodings.length + " encodings:"); for (Encoding e: encodings) { out(" - " + e); } if (encodings.length == 0) { testFailed = true; } test(Encoding.PCM_SIGNED); test(Encoding.PCM_UNSIGNED); if (testFailed) { throw new Exception("test failed"); } out("test passed."); }
@Override public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){ Objects.requireNonNull(targetEncoding); // filter out targetEncoding from the old getOutputFormats( sourceFormat ) method AudioFormat[] formats = getOutputFormats( sourceFormat ); Vector<AudioFormat> newFormats = new Vector<>(); for(int i=0; i<formats.length; i++ ) { if( formats[i].getEncoding().equals( targetEncoding ) ) { newFormats.addElement( formats[i] ); } } AudioFormat[] formatArray = new AudioFormat[newFormats.size()]; for (int i = 0; i < formatArray.length; i++) { formatArray[i] = newFormats.elementAt(i); } return formatArray; }
@Override public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream) { if( isConversionSupported(targetEncoding, sourceStream.getFormat()) ) { AudioFormat sourceFormat = sourceStream.getFormat(); AudioFormat targetFormat = new AudioFormat( targetEncoding, sourceFormat.getSampleRate(), sourceFormat.getSampleSizeInBits(), sourceFormat.getChannels(), sourceFormat.getFrameSize(), sourceFormat.getFrameRate(), sourceFormat.isBigEndian() ); return getConvertedStream(targetFormat, sourceStream); } else { throw new IllegalArgumentException("Unsupported conversion: " + sourceStream.getFormat().toString() + " to " + targetEncoding.toString() ); } }
@Override public AudioInputStream getAudioInputStream(Encoding targetEncoding, AudioInputStream sourceStream) { if (!isConversionSupported(targetEncoding, sourceStream.getFormat())) { throw new IllegalArgumentException( "Unsupported conversion: " + sourceStream.getFormat() .toString() + " to " + targetEncoding.toString()); } if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) return sourceStream; AudioFormat format = sourceStream.getFormat(); int channels = format.getChannels(); Encoding encoding = targetEncoding; float samplerate = format.getSampleRate(); int bits = format.getSampleSizeInBits(); boolean bigendian = format.isBigEndian(); if (targetEncoding.equals(Encoding.PCM_FLOAT)) bits = 32; AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, channels, channels * bits / 8, samplerate, bigendian); return getAudioInputStream(targetFormat, sourceStream); }
private static void test(final Encoding enc, final byte[] expected, boolean end) { AudioFormat af = new AudioFormat(enc, 44100, SIZE, 1, SIZE / 8, 44100, end); byte[] bytes = new byte[FLOATS.length * af.getFrameSize()]; AudioFloatConverter conv = AudioFloatConverter.getConverter(af); conv.toByteArray(FLOATS, bytes); if (!Arrays.equals(bytes, expected)) { System.err.println("Actual: " + Arrays.toString(bytes)); System.err.println("Expected: " + Arrays.toString(expected)); throw new RuntimeException(); } float[] floats = new float[bytes.length / af.getFrameSize()]; conv.toFloatArray(bytes, floats); if (!Arrays.equals(floats, FLOATS)) { System.err.println("Actual: " + Arrays.toString(floats)); System.err.println("Expected: " + Arrays.toString(FLOATS)); throw new RuntimeException(); } }
private static void test(final Encoding enc, final byte[] expected, boolean end) { System.err.println(enc); AudioFormat af = new AudioFormat(enc, 44100, SIZE, 1, SIZE / 8, 44100, end); byte[] bytes = new byte[FLOATS.length * af.getFrameSize()]; AudioFloatConverter conv = AudioFloatConverter.getConverter(af); conv.toByteArray(FLOATS, bytes); if (!Arrays.equals(bytes, expected)) { System.err.println("Actual: " + Arrays.toString(bytes)); System.err.println("Expected: " + Arrays.toString(expected)); throw new RuntimeException(); } float[] floats = new float[bytes.length / af.getFrameSize()]; conv.toFloatArray(bytes, floats); if (!Arrays.equals(floats, FLOATS)) { System.err.println("Actual: " + Arrays.toString(floats)); System.err.println("Expected: " + Arrays.toString(FLOATS)); throw new RuntimeException(); } }
private static void test(final Encoding enc, final byte[] expected, boolean end) { System.err.println("enc = " + enc); AudioFormat af = new AudioFormat(enc, 44100, SIZE, 1, SIZE / 8, 44100, end); byte[] bytes = new byte[FLOATS.length * af.getFrameSize()]; AudioFloatConverter conv = AudioFloatConverter.getConverter(af); conv.toByteArray(FLOATS, bytes); if (!Arrays.equals(bytes, expected)) { System.err.println("Actual: " + Arrays.toString(bytes)); System.err.println("Expected: " + Arrays.toString(expected)); throw new RuntimeException(); } float[] floats = new float[bytes.length / af.getFrameSize()]; conv.toFloatArray(bytes, floats); if (!Arrays.equals(floats, FLOATS)) { System.err.println("Actual: " + Arrays.toString(floats)); System.err.println("Expected: " + Arrays.toString(FLOATS)); throw new RuntimeException(); } }
private static void test(final Encoding enc, final byte[] expected) { AudioFormat af = new AudioFormat(enc, 44100, SIZE, 1, SIZE / 8, 44100, true); byte[] bytes = new byte[FLOATS.length * af.getFrameSize()]; AudioFloatConverter conv = AudioFloatConverter.getConverter(af); conv.toByteArray(FLOATS, bytes); if (!Arrays.equals(bytes, expected)) { System.err.println("Actual: " + Arrays.toString(bytes)); System.err.println("Expected: " + Arrays.toString(expected)); throw new RuntimeException(); } float[] floats = new float[bytes.length / af.getFrameSize()]; conv.toFloatArray(bytes, floats); if (!Arrays.equals(floats, FLOATS)) { System.err.println("Actual: " + Arrays.toString(floats)); System.err.println("Expected: " + Arrays.toString(FLOATS)); throw new RuntimeException(); } }
public AudioInputStream getAudioInputStream(Encoding targetEncoding, AudioInputStream sourceStream) { if (!isConversionSupported(targetEncoding, sourceStream.getFormat())) { throw new IllegalArgumentException( "Unsupported conversion: " + sourceStream.getFormat() .toString() + " to " + targetEncoding.toString()); } if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) return sourceStream; AudioFormat format = sourceStream.getFormat(); int channels = format.getChannels(); Encoding encoding = targetEncoding; float samplerate = format.getSampleRate(); int bits = format.getSampleSizeInBits(); boolean bigendian = format.isBigEndian(); if (targetEncoding.equals(Encoding.PCM_FLOAT)) bits = 32; AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, channels, channels * bits / 8, samplerate, bigendian); return getAudioInputStream(targetFormat, sourceStream); }
/** Create a StretchedAudioInputStream that distorts the incoming * audio so it matches a fixed number of frames. * * @param in the AudioInputStream to stretch. * @param frames the number of frames the input stream should be stretched to. * @throws IOException if an IO problem occurs. */ public static StretchedAudioInputStream create(AudioInputStream in,long frames) throws IOException { AudioFormat format = in.getFormat(); if(!(format.getEncoding().equals(Encoding.PCM_SIGNED) || format.getEncoding().equals(Encoding.PCM_UNSIGNED) )) throw new IllegalArgumentException("the audio input must be PCM-encoded data (found "+format.getEncoding()+")"); PipedInputStream pipedIn = new PipedInputStream(); PipedOutputStream pipedOut = new PipedOutputStream(pipedIn); /** One flaw with this model is that we always generate ALL the * transformed data: even if the entity working with pipedIn * is trying to skip large chunks of data. */ Thread thread = new StretchThread(in, format, frames, pipedOut); thread.start(); return new StretchedAudioInputStream( pipedIn, format, frames); }
public TGMixer() { super(new Line.Info(Mixer.class)); this.lines = new HashMap<Class<?>, Line>(); this.sourceLineInfo = new ArrayList<DataLine.Info>(); this.targetLineInfo = new ArrayList<DataLine.Info>(); List<AudioFormat> formats = new ArrayList<AudioFormat>(); for (int channels = 1; channels <= 2; channels++) { formats.add(new AudioFormat(Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, 8, channels, channels, AudioSystem.NOT_SPECIFIED, false)); formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, AudioSystem.NOT_SPECIFIED, 8, channels, channels, AudioSystem.NOT_SPECIFIED, false)); for (int bits = 16; bits < 32; bits += 8) { formats.add(new AudioFormat(Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, bits, channels, channels * bits / 8, AudioSystem.NOT_SPECIFIED, false)); formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, AudioSystem.NOT_SPECIFIED, bits, channels, channels * bits / 8, AudioSystem.NOT_SPECIFIED, false)); formats.add(new AudioFormat(Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, bits, channels, channels * bits / 8, AudioSystem.NOT_SPECIFIED, true)); formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, AudioSystem.NOT_SPECIFIED, bits, channels, channels * bits / 8, AudioSystem.NOT_SPECIFIED, true)); } formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, AudioSystem.NOT_SPECIFIED, false)); formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, AudioSystem.NOT_SPECIFIED, true)); formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, AudioSystem.NOT_SPECIFIED, false)); formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, AudioSystem.NOT_SPECIFIED, true)); } this.sourceLineInfo.add(new DataLine.Info(SourceDataLine.class, formats.toArray(new AudioFormat[formats.size()]), AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED)); }
public AudioInputStream getAudioInputStream(Encoding targetEncoding, AudioInputStream sourceStream) { if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) return sourceStream; AudioFormat format = sourceStream.getFormat(); int channels = format.getChannels(); Encoding encoding = targetEncoding; float samplerate = format.getSampleRate(); int bits = format.getSampleSizeInBits(); boolean bigendian = format.isBigEndian(); if (targetEncoding.equals(AudioFloatConverter.PCM_FLOAT)) bits = 32; AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, channels, channels * bits / 8, samplerate, bigendian); return getAudioInputStream(targetFormat, sourceStream); }
/** * Test method for {@link com.deb.vad.utility.CommonUtil#getAudioFormatMp3()}. */ public final void testGetAudioFormatMp3() { // package com.ibm.emb.test.mfb; study this package. // Not working [PCM_SIGNED, PCM_UNSIGNED, ALAW, ULAW] // interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 16000 bytes/frame, 16.0 frames/second, big-endian // Working // interface TargetDataLine supporting format PCM_SIGNED 16000.0 Hz, 8 bit, mono, 1 bytes/frame, AudioFormat mp3Format = CommonUtil.getAudioFormatMp3(); Encoding[] encoding = AudioSystem.getTargetEncodings(mp3Format); System.out.println(Arrays.toString(encoding)); DataLine.Info info = new DataLine.Info(TargetDataLine.class, mp3Format); System.out.println(info.toString()); if (!AudioSystem.isLineSupported(info)) { assertFalse("Line not supported. Sorry I am leaving...",true); } }
@Test public void testOpenMidiDevice() throws Exception { FrinikaJVSTSynth synth = (FrinikaJVSTSynth) MidiSystem.getMidiDevice(new FrinikaJVSTSynthProvider.FrinikaJVSTSynthProviderInfo()); final TargetDataLine line = (TargetDataLine)((Mixer)synth).getLine( new Line.Info(TargetDataLine.class)); AudioFormat.Encoding PCM_FLOAT = new AudioFormat.Encoding("PCM_FLOAT"); AudioFormat format = new AudioFormat(PCM_FLOAT, 44100, 32, 2, 4*2, 44100, ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)); line.open(format); AudioInputStream ais = new AudioInputStream(line); assertTrue(AudioSystem.isConversionSupported(Encoding.PCM_SIGNED, ais.getFormat())); AudioInputStream convertedAis = AudioSystem.getAudioInputStream(Encoding.PCM_SIGNED, ais); SourceDataLine sdl = AudioSystem.getSourceDataLine(convertedAis.getFormat()); sdl.open(); sdl.start(); byte[] buf = new byte[16384]; ShortMessage shm = new ShortMessage(); shm.setMessage(ShortMessage.NOTE_ON, 1, 40, 127); synth.getReceiver().send(shm,-1); for(int n=0;n<20;n++) { int read = convertedAis.read(buf); sdl.write(buf, 0, read); } }