From b44363990d278f6895da07f5450e9a8f811817bf Mon Sep 17 00:00:00 2001 From: "Raybz@Raybz" Date: Fri, 14 Jun 2013 12:30:07 +0200 Subject: [PATCH] added Vorbis decoder, replaced own mp3 file reader with the default one --- AudioProcessing/lib/jogg-0.0.7.jar | Bin 0 -> 6839 bytes AudioProcessing/lib/jorbis-0.0.15.jar | Bin 0 -> 58917 bytes AudioProcessing/lib/tritonus_jorbis-0.3.6.jar | Bin 0 -> 11641 bytes AudioProcessing/pom.xml | 21 ++ .../wyrez/audio/decoder/DecoderFactory.java | 10 +- .../org/wyrez/audio/decoder/MP3Decoder.java | 182 +---------------- .../wyrez/audio/decoder/VorbisDecoder.java | 187 ++++++++++++++++++ 7 files changed, 217 insertions(+), 183 deletions(-) create mode 100644 AudioProcessing/lib/jogg-0.0.7.jar create mode 100644 AudioProcessing/lib/jorbis-0.0.15.jar create mode 100644 AudioProcessing/lib/tritonus_jorbis-0.3.6.jar create mode 100644 AudioProcessing/src/main/java/org/wyrez/audio/decoder/VorbisDecoder.java diff --git a/AudioProcessing/lib/jogg-0.0.7.jar b/AudioProcessing/lib/jogg-0.0.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..1cbd1ad5682f167e62d3dc77f805e30e30e80581 GIT binary patch literal 6839 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 literal 0 HcmV?d00001 diff --git a/AudioProcessing/pom.xml b/AudioProcessing/pom.xml index a04339e..b864175 100644 --- a/AudioProcessing/pom.xml +++ b/AudioProcessing/pom.xml @@ -34,6 +34,27 @@ system ${basedir}/lib/mp3spi1.9.5.jar + + org.tritonus + jorbis + 0.3.6 + system + ${basedir}/lib/tritonus_jorbis-0.3.6.jar + + + com.jcraft + jogg + 0.0.7 + system + ${basedir}/lib/jogg-0.0.7.jar + + + com.jcraft + jorbis + 0.0.15 + system + ${basedir}/lib/jorbis-0.0.15.jar + org.tritonus share diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/decoder/DecoderFactory.java b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/DecoderFactory.java index e401c60..a023020 100644 --- a/AudioProcessing/src/main/java/org/wyrez/audio/decoder/DecoderFactory.java +++ b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/DecoderFactory.java @@ -26,7 +26,7 @@ import java.io.InputStream; */ public enum DecoderFactory { - WAVE, MP3; + WAVE, MP3, OGG; /** * Creates a decoder for the selected codec. @@ -36,10 +36,12 @@ public enum DecoderFactory { */ public Decoder create(InputStream is) throws Exception { switch (this) { - case WAVE: - return new WaveDecoder(is); case MP3: return new MP3Decoder(is); + case OGG: + return new VorbisDecoder(is); + case WAVE: + return new WaveDecoder(is); default: //impossible return null; } @@ -63,6 +65,8 @@ public enum DecoderFactory { switch (extension.toUpperCase()) { case "MP3": return MP3.create(new FileInputStream(file)); + case "OGG": + return OGG.create(new FileInputStream(file)); case "WAV": case "WAVE": return WAVE.create(new FileInputStream(file)); diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/decoder/MP3Decoder.java b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/MP3Decoder.java index 76367e0..6948fa2 100644 --- a/AudioProcessing/src/main/java/org/wyrez/audio/decoder/MP3Decoder.java +++ b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/MP3Decoder.java @@ -25,22 +25,11 @@ package org.wyrez.audio.decoder; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.PushbackInputStream; -import java.util.HashMap; -import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.UnsupportedAudioFileException; -import javazoom.jl.decoder.Bitstream; -import javazoom.jl.decoder.Header; -import javazoom.spi.mpeg.sampled.file.MpegAudioFileFormat; -import javazoom.spi.mpeg.sampled.file.MpegAudioFormat; -import javazoom.spi.mpeg.sampled.file.MpegEncoding; -import javazoom.spi.mpeg.sampled.file.MpegFileFormatType; -import org.tritonus.share.TDebug; +import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; import org.tritonus.share.sampled.FloatSampleBuffer; -import org.tritonus.share.sampled.file.TAudioFileReader; /** * A decoder for MP3 files with a maximum of 2 channels. @@ -64,7 +53,7 @@ public class MP3Decoder implements Decoder { */ public MP3Decoder(InputStream stream) throws Exception { InputStream in = new BufferedInputStream(stream, 1024 * 1024); - this.in = new MP3AudioFileReader().getAudioInputStream(in); + this.in = new MpegAudioFileReader().getAudioInputStream(in); AudioFormat baseFormat = this.in.getFormat(); this.channels = baseFormat.getChannels(); if (channels > 2) { @@ -195,171 +184,4 @@ public class MP3Decoder implements Decoder { public float getSamplingRate() { return samplingRate; } - - class MP3AudioFileReader extends TAudioFileReader { - - public static final int INITAL_READ_LENGTH = 128000; - private static final int MARK_LIMIT = INITAL_READ_LENGTH + 1; - private final AudioFormat.Encoding[][] sm_aEncodings = { - {MpegEncoding.MPEG2L1, MpegEncoding.MPEG2L2, MpegEncoding.MPEG2L3}, - {MpegEncoding.MPEG1L1, MpegEncoding.MPEG1L2, MpegEncoding.MPEG1L3}, - {MpegEncoding.MPEG2DOT5L1, MpegEncoding.MPEG2DOT5L2, - MpegEncoding.MPEG2DOT5L3},}; - - protected MP3AudioFileReader() { - super(MARK_LIMIT, true); - } - - @Override - protected AudioFileFormat getAudioFileFormat(InputStream inputStream, long mediaLength) - throws UnsupportedAudioFileException, IOException { - HashMap aff_properties = new HashMap(); - HashMap af_properties = new HashMap(); - int mLength = (int) mediaLength; - int size = inputStream.available(); - PushbackInputStream pis = new PushbackInputStream(inputStream, MARK_LIMIT); - byte head[] = new byte[22]; - pis.read(head); - - // Check for WAV, AU, and AIFF, Ogg Vorbis, Flac, MAC file formats. - // Next check for Shoutcast (supported) and OGG (unsupported) streams. - if ((head[0] == 'R') && (head[1] == 'I') && (head[2] == 'F') - && (head[3] == 'F') && (head[8] == 'W') && (head[9] == 'A') - && (head[10] == 'V') && (head[11] == 'E')) { - int isPCM = ((head[21] << 8) & 0x0000FF00) | ((head[20]) & 0x00000FF); - throw new UnsupportedAudioFileException("WAV PCM stream found"); - - } else if ((head[0] == '.') && (head[1] == 's') && (head[2] == 'n') - && (head[3] == 'd')) { - throw new UnsupportedAudioFileException("AU stream found"); - } else if ((head[0] == 'F') && (head[1] == 'O') && (head[2] == 'R') - && (head[3] == 'M') && (head[8] == 'A') && (head[9] == 'I') - && (head[10] == 'F') && (head[11] == 'F')) { - throw new UnsupportedAudioFileException("AIFF stream found"); - } else if (((head[0] == 'M') | (head[0] == 'm')) - && ((head[1] == 'A') | (head[1] == 'a')) - && ((head[2] == 'C') | (head[2] == 'c'))) { - throw new UnsupportedAudioFileException("APE stream found"); - } else if (((head[0] == 'F') | (head[0] == 'f')) - && ((head[1] == 'L') | (head[1] == 'l')) - && ((head[2] == 'A') | (head[2] == 'a')) - && ((head[3] == 'C') | (head[3] == 'c'))) { - throw new UnsupportedAudioFileException("FLAC stream found"); - } // Shoutcast stream ? - else if (((head[0] == 'I') | (head[0] == 'i')) - && ((head[1] == 'C') | (head[1] == 'c')) - && ((head[2] == 'Y') | (head[2] == 'y'))) { - pis.unread(head); - // Load shoutcast meta data. - } // Ogg stream ? - else if (((head[0] == 'O') | (head[0] == 'o')) - && ((head[1] == 'G') | (head[1] == 'g')) - && ((head[2] == 'G') | (head[2] == 'g'))) { - throw new UnsupportedAudioFileException("Ogg stream found"); - } // No, so pushback. - else { - pis.unread(head); - } - // MPEG header info. - int nVersion = AudioSystem.NOT_SPECIFIED; - int nLayer = AudioSystem.NOT_SPECIFIED; - // int nSFIndex = AudioSystem.NOT_SPECIFIED; - int nMode = AudioSystem.NOT_SPECIFIED; - int FrameSize = AudioSystem.NOT_SPECIFIED; - // int nFrameSize = AudioSystem.NOT_SPECIFIED; - int nFrequency = AudioSystem.NOT_SPECIFIED; - int nTotalFrames = AudioSystem.NOT_SPECIFIED; - float FrameRate = AudioSystem.NOT_SPECIFIED; - int BitRate = AudioSystem.NOT_SPECIFIED; - int nChannels = AudioSystem.NOT_SPECIFIED; - int nHeader = AudioSystem.NOT_SPECIFIED; - int nTotalMS = AudioSystem.NOT_SPECIFIED; - boolean nVBR = false; - AudioFormat.Encoding encoding = null; - try { - Bitstream m_bitstream = new Bitstream(pis); - aff_properties.put("mp3.header.pos", - new Integer(m_bitstream.header_pos())); - Header m_header = m_bitstream.readFrame(); - // nVersion = 0 => MPEG2-LSF (Including MPEG2.5), nVersion = 1 => MPEG1 - nVersion = m_header.version(); - if (nVersion == 2) { - aff_properties.put("mp3.version.mpeg", Float.toString(2.5f)); - } else { - aff_properties.put("mp3.version.mpeg", - Integer.toString(2 - nVersion)); - } - // nLayer = 1,2,3 - nLayer = m_header.layer(); - aff_properties.put("mp3.version.layer", Integer.toString(nLayer)); - // nSFIndex = m_header.sample_frequency(); - nMode = m_header.mode(); - aff_properties.put("mp3.mode", new Integer(nMode)); - nChannels = nMode == 3 ? 1 : 2; - aff_properties.put("mp3.channels", new Integer(nChannels)); - nVBR = m_header.vbr(); - af_properties.put("vbr", new Boolean(nVBR)); - aff_properties.put("mp3.vbr", new Boolean(nVBR)); - aff_properties.put("mp3.vbr.scale", new Integer(m_header.vbr_scale())); - FrameSize = m_header.calculate_framesize(); - aff_properties.put("mp3.framesize.bytes", new Integer(FrameSize)); - if (FrameSize < 0) { - throw new UnsupportedAudioFileException("Invalid FrameSize : " + FrameSize); - } - nFrequency = m_header.frequency(); - aff_properties.put("mp3.frequency.hz", new Integer(nFrequency)); - FrameRate = (float) ((1.0 / (m_header.ms_per_frame())) * 1000.0); - aff_properties.put("mp3.framerate.fps", new Float(FrameRate)); - if (FrameRate < 0) { - throw new UnsupportedAudioFileException("Invalid FrameRate : " + FrameRate); - } - if (mLength != AudioSystem.NOT_SPECIFIED) { - aff_properties.put("mp3.length.bytes", new Integer(mLength)); - nTotalFrames = m_header.max_number_of_frames(mLength); - aff_properties.put("mp3.length.frames", new Integer(nTotalFrames)); - } - BitRate = m_header.bitrate(); - af_properties.put("bitrate", new Integer(BitRate)); - aff_properties.put("mp3.bitrate.nominal.bps", new Integer(BitRate)); - nHeader = m_header.getSyncHeader(); - encoding = sm_aEncodings[nVersion][nLayer - 1]; - aff_properties.put("mp3.version.encoding", encoding.toString()); - if (mLength != AudioSystem.NOT_SPECIFIED) { - nTotalMS = Math.round(m_header.total_ms(mLength)); - aff_properties.put("duration", new Long((long) nTotalMS * 1000L)); - } - aff_properties.put("mp3.copyright", new Boolean(m_header.copyright())); - aff_properties.put("mp3.original", new Boolean(m_header.original())); - aff_properties.put("mp3.crc", new Boolean(m_header.checksums())); - aff_properties.put("mp3.padding", new Boolean(m_header.padding())); - InputStream id3v2 = m_bitstream.getRawID3v2(); - if (id3v2 != null) { - aff_properties.put("mp3.id3tag.v2", id3v2); - } - if (TDebug.TraceAudioFileReader) { - TDebug.out(m_header.toString()); - } - } catch (Exception e) { - throw new UnsupportedAudioFileException("not a MPEG stream:" - + e.getMessage()); - } - // Deeper checks ? - int cVersion = (nHeader >> 19) & 0x3; - if (cVersion == 1) { - throw new UnsupportedAudioFileException( - "not a MPEG stream: wrong version"); - } - int cSFIndex = (nHeader >> 10) & 0x3; - if (cSFIndex == 3) { - - throw new UnsupportedAudioFileException( - "not a MPEG stream: wrong sampling rate"); - } - - AudioFormat format = new MpegAudioFormat(encoding, (float) nFrequency, - AudioSystem.NOT_SPECIFIED, nChannels, -1, FrameRate, true, af_properties); - return new MpegAudioFileFormat(MpegFileFormatType.MP3, format, - nTotalFrames, mLength, aff_properties); - } - } } diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/decoder/VorbisDecoder.java b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/VorbisDecoder.java new file mode 100644 index 0000000..18b7009 --- /dev/null +++ b/AudioProcessing/src/main/java/org/wyrez/audio/decoder/VorbisDecoder.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2013 Darth Affe and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * This Code is based on the source provided with a tutorial by + * http://www.badlogicgames.com (as of 16.05.2013). + * The original source can be found here: + * http://code.google.com/p/audio-analysis/source/browse/trunk/src/com/badlogic/audio/io/MP3Decoder.java + */ +package org.wyrez.audio.decoder; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import org.tritonus.sampled.file.jorbis.JorbisAudioFileReader; +import org.tritonus.share.sampled.FloatSampleBuffer; + +/** + * A decoder for MP3 files with a maximum of 2 channels. + * + * @author Darth Affe + */ +public class VorbisDecoder implements Decoder { + + private AudioInputStream in; + private FloatSampleBuffer buffer; + private byte[] bytes; + private int channels; + private float samplingRate; + + /** + * Constructor, sets the input stream to read the MP3 file from. Audio files + * with more than 2 channels aren't supported! + * + * @param stream The input stream. + * @throws Exception in case the input stream couldn't be read properly + */ + public VorbisDecoder(InputStream stream) throws Exception { + InputStream in = new BufferedInputStream(stream, 1024 * 1024); + this.in = new JorbisAudioFileReader().getAudioInputStream(in); + AudioFormat baseFormat = this.in.getFormat(); + this.channels = baseFormat.getChannels(); + if (channels > 2) { + throw new IllegalArgumentException("more than 2 channels aren't supported"); + } + this.samplingRate = baseFormat.getSampleRate(); + AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, + baseFormat.getSampleRate(), 16, + baseFormat.getChannels(), + baseFormat.getChannels() * 2, + baseFormat.getSampleRate(), false); + this.in = AudioSystem.getAudioInputStream(format, this.in); + } + + /** + * Tries to read in samples.length stereo samples. Returns the number of + * samples actually read. Guarantees that samples.length samples are read in + * if there was enough data in the stream. + * + * @param samples The samples array to write the samples to + * @return The number of samples actually read + */ + @Override + public int readSamplesStereo(float[] samples) { + if (buffer == null || buffer.getSampleCount() < samples.length / 2) { + buffer = new FloatSampleBuffer(in.getFormat().getChannels(), samples.length / 2, in.getFormat().getSampleRate()); + bytes = new byte[buffer.getByteArrayBufferSize(in.getFormat())]; + } + + int read = 0; + int readBytes = 0; + try { + readBytes = in.read(bytes, read, bytes.length - read); + } catch (IOException e) { + return 0; + } + if (readBytes == -1) { + return 0; + } + + read += readBytes; + while (readBytes != -1 && read != bytes.length) { + try { + readBytes = in.read(bytes, read, bytes.length - read); + } catch (IOException e) { + return 0; + } + read += readBytes; + } + + int frameCount = bytes.length / in.getFormat().getFrameSize(); + buffer.setSamplesFromBytes(bytes, 0, in.getFormat(), 0, frameCount); + + for (int i = 0, j = 0; i < buffer.getSampleCount(); i++, j += 2) { + samples[j] = buffer.getChannel(0)[i]; + samples[j + 1] = buffer.getChannel(buffer.getChannelCount() == 2 ? 1 : 0)[i]; + } + return buffer.getSampleCount() * 2; + } + + /** + * Tries to read in samples.length samples, merging stereo to a mono channel + * by averaging. Returns the number of samples actually read. Guarantees + * that samples.length samples are read in if there was enough data in the + * stream. + * + * @param samples The samples array to write the samples to + * @return The number of samples actually read + */ + @Override + public int readSamplesMergedMono(float[] samples) { + if (buffer == null || buffer.getSampleCount() < samples.length) { + buffer = new FloatSampleBuffer(in.getFormat().getChannels(), samples.length, in.getFormat().getSampleRate()); + bytes = new byte[buffer.getByteArrayBufferSize(in.getFormat())]; + } + + int read = 0; + int readBytes = 0; + try { + readBytes = in.read(bytes, read, bytes.length - read); + } catch (IOException e) { + return 0; + } + if (readBytes == -1) { + return 0; + } + + read += readBytes; + while (readBytes != -1 && read != bytes.length) { + try { + readBytes = in.read(bytes, read, bytes.length - read); + } catch (IOException e) { + return 0; + } + read += readBytes; + } + + int frameCount = bytes.length / in.getFormat().getFrameSize(); + buffer.setSamplesFromBytes(bytes, 0, in.getFormat(), 0, frameCount); + + for (int i = 0; i < buffer.getSampleCount(); i++) { + if (buffer.getChannelCount() == 2) { + samples[i] = (buffer.getChannel(0)[i] + buffer.getChannel(1)[i]) / 2; + } else { + samples[i] = buffer.getChannel(0)[i]; + } + } + return buffer.getSampleCount(); + } + + /** + * Returns the number of channels in the audio source. (This value can't be + * greater than 2) + * + * @returns The channel count + */ + @Override + public int getChannelCount() { + return channels; + } + + /** + * Returns the sampling rate in Hz of the audio source. + * + * @returns the sampling rate as float + */ + @Override + public float getSamplingRate() { + return samplingRate; + } +}