From b43b1e0165d16fa3abde8bca8dfaad4cd38d151d Mon Sep 17 00:00:00 2001 From: Mahdi Hosseinzadeh Date: Mon, 9 Oct 2017 00:58:47 +0330 Subject: [PATCH] Initial commit --- CHANGES.txt | 122 + LICENSE.txt | 504 ++++ README.txt | 81 + build-unix.sh | 42 + build-win32.bat | 42 + build.xml | 58 + ...onverter$PrintWriterProgressListener.class | Bin 0 -> 2429 bytes .../Converter$ProgressListener.class | Bin 0 -> 551 bytes classes/javazoom/jl/converter/Converter.class | Bin 0 -> 3242 bytes .../converter/RiffFile$RiffChunkHeader.class | Bin 0 -> 417 bytes classes/javazoom/jl/converter/RiffFile.class | Bin 0 -> 3887 bytes .../converter/WaveFile$WaveFileSample.class | Bin 0 -> 386 bytes .../converter/WaveFile$WaveFormat_Chunk.class | Bin 0 -> 1207 bytes .../WaveFile$WaveFormat_ChunkData.class | Bin 0 -> 725 bytes classes/javazoom/jl/converter/WaveFile.class | Bin 0 -> 2475 bytes .../jl/converter/WaveFileObuffer.class | Bin 0 -> 999 bytes .../javazoom/jl/converter/jlc$jlcArgs.class | Bin 0 -> 2073 bytes classes/javazoom/jl/converter/jlc.class | Bin 0 -> 1592 bytes classes/javazoom/jl/decoder/BitReserve.class | Bin 0 -> 997 bytes classes/javazoom/jl/decoder/Bitstream.class | Bin 0 -> 4774 bytes .../javazoom/jl/decoder/BitstreamErrors.class | Bin 0 -> 412 bytes .../jl/decoder/BitstreamException.class | Bin 0 -> 755 bytes classes/javazoom/jl/decoder/Control.class | Bin 0 -> 240 bytes classes/javazoom/jl/decoder/Crc16.class | Bin 0 -> 436 bytes .../javazoom/jl/decoder/Decoder$Params.class | Bin 0 -> 1277 bytes classes/javazoom/jl/decoder/Decoder.class | Bin 0 -> 3559 bytes .../javazoom/jl/decoder/DecoderErrors.class | Bin 0 -> 276 bytes .../jl/decoder/DecoderException.class | Bin 0 -> 749 bytes .../jl/decoder/Equalizer$EQFunction.class | Bin 0 -> 279 bytes classes/javazoom/jl/decoder/Equalizer.class | Bin 0 -> 1440 bytes .../javazoom/jl/decoder/FrameDecoder.class | Bin 0 -> 177 bytes classes/javazoom/jl/decoder/Header.class | Bin 0 -> 9487 bytes .../jl/decoder/InputStreamSource.class | Bin 0 -> 719 bytes .../javazoom/jl/decoder/JavaLayerError.class | Bin 0 -> 148 bytes .../javazoom/jl/decoder/JavaLayerErrors.class | Bin 0 -> 183 bytes .../jl/decoder/JavaLayerException.class | Bin 0 -> 670 bytes .../javazoom/jl/decoder/JavaLayerHook.class | Bin 0 -> 159 bytes .../javazoom/jl/decoder/JavaLayerUtils.class | Bin 0 -> 2602 bytes .../jl/decoder/LayerIDecoder$Subband.class | Bin 0 -> 1444 bytes .../decoder/LayerIDecoder$SubbandLayer1.class | Bin 0 -> 1960 bytes ...Decoder$SubbandLayer1IntensityStereo.class | Bin 0 -> 1394 bytes .../LayerIDecoder$SubbandLayer1Stereo.class | Bin 0 -> 1770 bytes .../javazoom/jl/decoder/LayerIDecoder.class | Bin 0 -> 2810 bytes .../LayerIIDecoder$SubbandLayer2.class | Bin 0 -> 23694 bytes ...Decoder$SubbandLayer2IntensityStereo.class | Bin 0 -> 2158 bytes .../LayerIIDecoder$SubbandLayer2Stereo.class | Bin 0 -> 2540 bytes .../javazoom/jl/decoder/LayerIIDecoder.class | Bin 0 -> 1307 bytes .../LayerIIIDecoder$III_side_info_t.class | Bin 0 -> 526 bytes .../jl/decoder/LayerIIIDecoder$SBI.class | Bin 0 -> 348 bytes .../jl/decoder/LayerIIIDecoder$Sftable.class | Bin 0 -> 511 bytes .../decoder/LayerIIIDecoder$gr_info_s.class | Bin 0 -> 810 bytes .../decoder/LayerIIIDecoder$temporaire.class | Bin 0 -> 468 bytes .../decoder/LayerIIIDecoder$temporaire2.class | Bin 0 -> 325 bytes .../javazoom/jl/decoder/LayerIIIDecoder.class | Bin 0 -> 25071 bytes classes/javazoom/jl/decoder/Manager.class | Bin 0 -> 299 bytes classes/javazoom/jl/decoder/Obuffer.class | Bin 0 -> 533 bytes .../javazoom/jl/decoder/OutputChannels.class | Bin 0 -> 1329 bytes .../javazoom/jl/decoder/SampleBuffer.class | Bin 0 -> 960 bytes classes/javazoom/jl/decoder/Source.class | Bin 0 -> 324 bytes .../javazoom/jl/decoder/SynthesisFilter.class | Bin 0 -> 15349 bytes classes/javazoom/jl/decoder/au2lin.ser | Bin 0 -> 539 bytes classes/javazoom/jl/decoder/huffcodetab.class | Bin 0 -> 49460 bytes classes/javazoom/jl/decoder/l3reorder.ser | Bin 0 -> 13925 bytes classes/javazoom/jl/decoder/lin2au.ser | Bin 0 -> 16411 bytes classes/javazoom/jl/decoder/sfd.ser | Bin 0 -> 2075 bytes classes/javazoom/jl/player/AudioDevice.class | Bin 0 -> 324 bytes .../javazoom/jl/player/AudioDeviceBase.class | Bin 0 -> 1015 bytes .../jl/player/AudioDeviceFactory.class | Bin 0 -> 783 bytes .../javazoom/jl/player/FactoryRegistry.class | Bin 0 -> 2069 bytes .../jl/player/JavaSoundAudioDevice.class | Bin 0 -> 3179 bytes .../player/JavaSoundAudioDeviceFactory.class | Bin 0 -> 1557 bytes .../javazoom/jl/player/NullAudioDevice.class | Bin 0 -> 215 bytes classes/javazoom/jl/player/Player.class | Bin 0 -> 2222 bytes classes/javazoom/jl/player/PlayerApplet.class | Bin 0 -> 2670 bytes .../jl/player/advanced/AdvancedPlayer.class | Bin 0 -> 3196 bytes .../jl/player/advanced/PlaybackEvent.class | Bin 0 -> 815 bytes .../jl/player/advanced/PlaybackListener.class | Bin 0 -> 299 bytes .../javazoom/jl/player/advanced/jlap$1.class | Bin 0 -> 872 bytes .../player/advanced/jlap$InfoListener.class | Bin 0 -> 1056 bytes .../javazoom/jl/player/advanced/jlap.class | Bin 0 -> 1970 bytes classes/javazoom/jl/player/jlp.class | Bin 0 -> 2665 bytes doc/allclasses-frame.html | 118 + doc/allclasses-noframe.html | 118 + doc/constant-values.html | 600 ++++ doc/deprecated-list.html | 140 + doc/help-doc.html | 213 ++ doc/index-all.html | 1451 ++++++++++ doc/index.html | 39 + ...Converter.PrintWriterProgressListener.html | 568 ++++ .../converter/Converter.ProgressListener.html | 390 +++ doc/javazoom/jl/converter/Converter.html | 418 +++ doc/javazoom/jl/converter/RiffFile.html | 809 ++++++ .../jl/converter/WaveFile.WaveFileSample.html | 258 ++ doc/javazoom/jl/converter/WaveFile.html | 504 ++++ .../jl/converter/WaveFileObuffer.html | 397 +++ doc/javazoom/jl/converter/jlc.html | 256 ++ doc/javazoom/jl/converter/package-frame.html | 53 + .../jl/converter/package-summary.html | 192 ++ doc/javazoom/jl/converter/package-tree.html | 157 ++ doc/javazoom/jl/decoder/Bitstream.html | 601 ++++ doc/javazoom/jl/decoder/BitstreamErrors.html | 343 +++ .../jl/decoder/BitstreamException.html | 359 +++ doc/javazoom/jl/decoder/Control.html | 325 +++ doc/javazoom/jl/decoder/Crc16.html | 279 ++ doc/javazoom/jl/decoder/Decoder.Params.html | 342 +++ doc/javazoom/jl/decoder/Decoder.html | 575 ++++ doc/javazoom/jl/decoder/DecoderErrors.html | 259 ++ doc/javazoom/jl/decoder/DecoderException.html | 348 +++ .../jl/decoder/Equalizer.EQFunction.html | 255 ++ doc/javazoom/jl/decoder/Equalizer.html | 491 ++++ doc/javazoom/jl/decoder/FrameDecoder.html | 211 ++ doc/javazoom/jl/decoder/Header.html | 1202 ++++++++ .../jl/decoder/InputStreamSource.html | 396 +++ doc/javazoom/jl/decoder/JavaLayerError.html | 242 ++ doc/javazoom/jl/decoder/JavaLayerErrors.html | 233 ++ .../jl/decoder/JavaLayerException.html | 348 +++ doc/javazoom/jl/decoder/JavaLayerHook.html | 209 ++ doc/javazoom/jl/decoder/JavaLayerUtils.html | 436 +++ doc/javazoom/jl/decoder/Manager.html | 291 ++ doc/javazoom/jl/decoder/Obuffer.html | 417 +++ doc/javazoom/jl/decoder/OutputChannels.html | 496 ++++ doc/javazoom/jl/decoder/SampleBuffer.html | 481 ++++ doc/javazoom/jl/decoder/Source.html | 348 +++ doc/javazoom/jl/decoder/package-frame.html | 105 + doc/javazoom/jl/decoder/package-summary.html | 287 ++ doc/javazoom/jl/decoder/package-tree.html | 171 ++ doc/javazoom/jl/player/AudioDevice.html | 361 +++ doc/javazoom/jl/player/AudioDeviceBase.html | 563 ++++ .../jl/player/AudioDeviceFactory.html | 311 +++ doc/javazoom/jl/player/FactoryRegistry.html | 433 +++ .../jl/player/JavaSoundAudioDevice.html | 578 ++++ .../player/JavaSoundAudioDeviceFactory.html | 319 +++ doc/javazoom/jl/player/NullAudioDevice.html | 272 ++ doc/javazoom/jl/player/Player.html | 408 +++ doc/javazoom/jl/player/PlayerApplet.html | 740 +++++ .../jl/player/advanced/AdvancedPlayer.html | 471 ++++ .../jl/player/advanced/PlaybackEvent.html | 404 +++ .../jl/player/advanced/PlaybackListener.html | 273 ++ .../jl/player/advanced/jlap.InfoListener.html | 276 ++ doc/javazoom/jl/player/advanced/jlap.html | 395 +++ .../jl/player/advanced/package-frame.html | 38 + .../jl/player/advanced/package-summary.html | 165 ++ .../jl/player/advanced/package-tree.html | 149 + doc/javazoom/jl/player/jlp.html | 420 +++ doc/javazoom/jl/player/package-frame.html | 59 + doc/javazoom/jl/player/package-summary.html | 207 ++ doc/javazoom/jl/player/package-tree.html | 168 ++ doc/overview-frame.html | 48 + doc/overview-summary.html | 158 ++ doc/overview-tree.html | 191 ++ doc/package-list | 4 + doc/packages.html | 31 + doc/resources/inherit.gif | Bin 0 -> 57 bytes doc/serialized-form.html | 295 ++ doc/stylesheet.css | 29 + jl1.0.1.jar | Bin 0 -> 105363 bytes playerapplet.html | 44 + setEnvAnt.bat | 3 + src/javazoom/jl/converter/Converter.java | 411 +++ src/javazoom/jl/converter/RiffFile.java | 495 ++++ src/javazoom/jl/converter/WaveFile.java | 522 ++++ .../jl/converter/WaveFileObuffer.java | 141 + src/javazoom/jl/converter/jlc.java | 216 ++ src/javazoom/jl/decoder/BitReserve.java | 223 ++ src/javazoom/jl/decoder/Bitstream.java | 655 +++++ src/javazoom/jl/decoder/BitstreamErrors.java | 72 + .../jl/decoder/BitstreamException.java | 71 + src/javazoom/jl/decoder/Control.java | 57 + src/javazoom/jl/decoder/Crc16.java | 70 + src/javazoom/jl/decoder/Decoder.java | 357 +++ src/javazoom/jl/decoder/DecoderErrors.java | 45 + src/javazoom/jl/decoder/DecoderException.java | 61 + src/javazoom/jl/decoder/Equalizer.java | 227 ++ src/javazoom/jl/decoder/FrameDecoder.java | 39 + src/javazoom/jl/decoder/Header.java | 762 +++++ .../jl/decoder/InputStreamSource.java | 80 + src/javazoom/jl/decoder/JavaLayerError.java | 31 + src/javazoom/jl/decoder/JavaLayerErrors.java | 40 + .../jl/decoder/JavaLayerException.java | 80 + src/javazoom/jl/decoder/JavaLayerHook.java | 36 + src/javazoom/jl/decoder/JavaLayerUtils.java | 207 ++ src/javazoom/jl/decoder/LayerIDecoder.java | 448 +++ src/javazoom/jl/decoder/LayerIIDecoder.java | 1064 +++++++ src/javazoom/jl/decoder/LayerIIIDecoder.java | 2439 +++++++++++++++++ src/javazoom/jl/decoder/Manager.java | 46 + src/javazoom/jl/decoder/Obuffer.java | 88 + src/javazoom/jl/decoder/OutputChannels.java | 143 + src/javazoom/jl/decoder/SampleBuffer.java | 132 + src/javazoom/jl/decoder/Source.java | 49 + src/javazoom/jl/decoder/SynthesisFilter.java | 1817 ++++++++++++ src/javazoom/jl/decoder/au2lin.ser | Bin 0 -> 539 bytes src/javazoom/jl/decoder/huffcodetab.java | 600 ++++ src/javazoom/jl/decoder/l3reorder.ser | Bin 0 -> 13925 bytes src/javazoom/jl/decoder/lin2au.ser | Bin 0 -> 16411 bytes src/javazoom/jl/decoder/readme.txt | 15 + src/javazoom/jl/decoder/sfd.ser | Bin 0 -> 2075 bytes src/javazoom/jl/player/AudioDevice.java | 103 + src/javazoom/jl/player/AudioDeviceBase.java | 177 ++ .../jl/player/AudioDeviceFactory.java | 87 + src/javazoom/jl/player/FactoryRegistry.java | 129 + .../jl/player/JavaSoundAudioDevice.java | 215 ++ .../player/JavaSoundAudioDeviceFactory.java | 85 + src/javazoom/jl/player/NullAudioDevice.java | 37 + src/javazoom/jl/player/Player.java | 251 ++ src/javazoom/jl/player/PlayerApplet.java | 246 ++ .../jl/player/advanced/AdvancedPlayer.java | 242 ++ .../jl/player/advanced/PlaybackEvent.java | 51 + .../jl/player/advanced/PlaybackListener.java | 30 + src/javazoom/jl/player/advanced/jlap.java | 116 + src/javazoom/jl/player/jlp.java | 176 ++ srctest/AllTests.java | 39 + .../javazoom/jl/decoder/BitstreamTest.java | 155 ++ srctest/javazoom/jl/player/jlpTest.java | 87 + srctest/test.mp3.properties | 30 + 214 files changed, 39388 insertions(+) create mode 100644 CHANGES.txt create mode 100644 LICENSE.txt create mode 100644 README.txt create mode 100644 build-unix.sh create mode 100644 build-win32.bat create mode 100644 build.xml create mode 100644 classes/javazoom/jl/converter/Converter$PrintWriterProgressListener.class create mode 100644 classes/javazoom/jl/converter/Converter$ProgressListener.class create mode 100644 classes/javazoom/jl/converter/Converter.class create mode 100644 classes/javazoom/jl/converter/RiffFile$RiffChunkHeader.class create mode 100644 classes/javazoom/jl/converter/RiffFile.class create mode 100644 classes/javazoom/jl/converter/WaveFile$WaveFileSample.class create mode 100644 classes/javazoom/jl/converter/WaveFile$WaveFormat_Chunk.class create mode 100644 classes/javazoom/jl/converter/WaveFile$WaveFormat_ChunkData.class create mode 100644 classes/javazoom/jl/converter/WaveFile.class create mode 100644 classes/javazoom/jl/converter/WaveFileObuffer.class create mode 100644 classes/javazoom/jl/converter/jlc$jlcArgs.class create mode 100644 classes/javazoom/jl/converter/jlc.class create mode 100644 classes/javazoom/jl/decoder/BitReserve.class create mode 100644 classes/javazoom/jl/decoder/Bitstream.class create mode 100644 classes/javazoom/jl/decoder/BitstreamErrors.class create mode 100644 classes/javazoom/jl/decoder/BitstreamException.class create mode 100644 classes/javazoom/jl/decoder/Control.class create mode 100644 classes/javazoom/jl/decoder/Crc16.class create mode 100644 classes/javazoom/jl/decoder/Decoder$Params.class create mode 100644 classes/javazoom/jl/decoder/Decoder.class create mode 100644 classes/javazoom/jl/decoder/DecoderErrors.class create mode 100644 classes/javazoom/jl/decoder/DecoderException.class create mode 100644 classes/javazoom/jl/decoder/Equalizer$EQFunction.class create mode 100644 classes/javazoom/jl/decoder/Equalizer.class create mode 100644 classes/javazoom/jl/decoder/FrameDecoder.class create mode 100644 classes/javazoom/jl/decoder/Header.class create mode 100644 classes/javazoom/jl/decoder/InputStreamSource.class create mode 100644 classes/javazoom/jl/decoder/JavaLayerError.class create mode 100644 classes/javazoom/jl/decoder/JavaLayerErrors.class create mode 100644 classes/javazoom/jl/decoder/JavaLayerException.class create mode 100644 classes/javazoom/jl/decoder/JavaLayerHook.class create mode 100644 classes/javazoom/jl/decoder/JavaLayerUtils.class create mode 100644 classes/javazoom/jl/decoder/LayerIDecoder$Subband.class create mode 100644 classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1.class create mode 100644 classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1IntensityStereo.class create mode 100644 classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1Stereo.class create mode 100644 classes/javazoom/jl/decoder/LayerIDecoder.class create mode 100644 classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2.class create mode 100644 classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2IntensityStereo.class create mode 100644 classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2Stereo.class create mode 100644 classes/javazoom/jl/decoder/LayerIIDecoder.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$III_side_info_t.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$SBI.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$Sftable.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$gr_info_s.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$temporaire.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder$temporaire2.class create mode 100644 classes/javazoom/jl/decoder/LayerIIIDecoder.class create mode 100644 classes/javazoom/jl/decoder/Manager.class create mode 100644 classes/javazoom/jl/decoder/Obuffer.class create mode 100644 classes/javazoom/jl/decoder/OutputChannels.class create mode 100644 classes/javazoom/jl/decoder/SampleBuffer.class create mode 100644 classes/javazoom/jl/decoder/Source.class create mode 100644 classes/javazoom/jl/decoder/SynthesisFilter.class create mode 100644 classes/javazoom/jl/decoder/au2lin.ser create mode 100644 classes/javazoom/jl/decoder/huffcodetab.class create mode 100644 classes/javazoom/jl/decoder/l3reorder.ser create mode 100644 classes/javazoom/jl/decoder/lin2au.ser create mode 100644 classes/javazoom/jl/decoder/sfd.ser create mode 100644 classes/javazoom/jl/player/AudioDevice.class create mode 100644 classes/javazoom/jl/player/AudioDeviceBase.class create mode 100644 classes/javazoom/jl/player/AudioDeviceFactory.class create mode 100644 classes/javazoom/jl/player/FactoryRegistry.class create mode 100644 classes/javazoom/jl/player/JavaSoundAudioDevice.class create mode 100644 classes/javazoom/jl/player/JavaSoundAudioDeviceFactory.class create mode 100644 classes/javazoom/jl/player/NullAudioDevice.class create mode 100644 classes/javazoom/jl/player/Player.class create mode 100644 classes/javazoom/jl/player/PlayerApplet.class create mode 100644 classes/javazoom/jl/player/advanced/AdvancedPlayer.class create mode 100644 classes/javazoom/jl/player/advanced/PlaybackEvent.class create mode 100644 classes/javazoom/jl/player/advanced/PlaybackListener.class create mode 100644 classes/javazoom/jl/player/advanced/jlap$1.class create mode 100644 classes/javazoom/jl/player/advanced/jlap$InfoListener.class create mode 100644 classes/javazoom/jl/player/advanced/jlap.class create mode 100644 classes/javazoom/jl/player/jlp.class create mode 100644 doc/allclasses-frame.html create mode 100644 doc/allclasses-noframe.html create mode 100644 doc/constant-values.html create mode 100644 doc/deprecated-list.html create mode 100644 doc/help-doc.html create mode 100644 doc/index-all.html create mode 100644 doc/index.html create mode 100644 doc/javazoom/jl/converter/Converter.PrintWriterProgressListener.html create mode 100644 doc/javazoom/jl/converter/Converter.ProgressListener.html create mode 100644 doc/javazoom/jl/converter/Converter.html create mode 100644 doc/javazoom/jl/converter/RiffFile.html create mode 100644 doc/javazoom/jl/converter/WaveFile.WaveFileSample.html create mode 100644 doc/javazoom/jl/converter/WaveFile.html create mode 100644 doc/javazoom/jl/converter/WaveFileObuffer.html create mode 100644 doc/javazoom/jl/converter/jlc.html create mode 100644 doc/javazoom/jl/converter/package-frame.html create mode 100644 doc/javazoom/jl/converter/package-summary.html create mode 100644 doc/javazoom/jl/converter/package-tree.html create mode 100644 doc/javazoom/jl/decoder/Bitstream.html create mode 100644 doc/javazoom/jl/decoder/BitstreamErrors.html create mode 100644 doc/javazoom/jl/decoder/BitstreamException.html create mode 100644 doc/javazoom/jl/decoder/Control.html create mode 100644 doc/javazoom/jl/decoder/Crc16.html create mode 100644 doc/javazoom/jl/decoder/Decoder.Params.html create mode 100644 doc/javazoom/jl/decoder/Decoder.html create mode 100644 doc/javazoom/jl/decoder/DecoderErrors.html create mode 100644 doc/javazoom/jl/decoder/DecoderException.html create mode 100644 doc/javazoom/jl/decoder/Equalizer.EQFunction.html create mode 100644 doc/javazoom/jl/decoder/Equalizer.html create mode 100644 doc/javazoom/jl/decoder/FrameDecoder.html create mode 100644 doc/javazoom/jl/decoder/Header.html create mode 100644 doc/javazoom/jl/decoder/InputStreamSource.html create mode 100644 doc/javazoom/jl/decoder/JavaLayerError.html create mode 100644 doc/javazoom/jl/decoder/JavaLayerErrors.html create mode 100644 doc/javazoom/jl/decoder/JavaLayerException.html create mode 100644 doc/javazoom/jl/decoder/JavaLayerHook.html create mode 100644 doc/javazoom/jl/decoder/JavaLayerUtils.html create mode 100644 doc/javazoom/jl/decoder/Manager.html create mode 100644 doc/javazoom/jl/decoder/Obuffer.html create mode 100644 doc/javazoom/jl/decoder/OutputChannels.html create mode 100644 doc/javazoom/jl/decoder/SampleBuffer.html create mode 100644 doc/javazoom/jl/decoder/Source.html create mode 100644 doc/javazoom/jl/decoder/package-frame.html create mode 100644 doc/javazoom/jl/decoder/package-summary.html create mode 100644 doc/javazoom/jl/decoder/package-tree.html create mode 100644 doc/javazoom/jl/player/AudioDevice.html create mode 100644 doc/javazoom/jl/player/AudioDeviceBase.html create mode 100644 doc/javazoom/jl/player/AudioDeviceFactory.html create mode 100644 doc/javazoom/jl/player/FactoryRegistry.html create mode 100644 doc/javazoom/jl/player/JavaSoundAudioDevice.html create mode 100644 doc/javazoom/jl/player/JavaSoundAudioDeviceFactory.html create mode 100644 doc/javazoom/jl/player/NullAudioDevice.html create mode 100644 doc/javazoom/jl/player/Player.html create mode 100644 doc/javazoom/jl/player/PlayerApplet.html create mode 100644 doc/javazoom/jl/player/advanced/AdvancedPlayer.html create mode 100644 doc/javazoom/jl/player/advanced/PlaybackEvent.html create mode 100644 doc/javazoom/jl/player/advanced/PlaybackListener.html create mode 100644 doc/javazoom/jl/player/advanced/jlap.InfoListener.html create mode 100644 doc/javazoom/jl/player/advanced/jlap.html create mode 100644 doc/javazoom/jl/player/advanced/package-frame.html create mode 100644 doc/javazoom/jl/player/advanced/package-summary.html create mode 100644 doc/javazoom/jl/player/advanced/package-tree.html create mode 100644 doc/javazoom/jl/player/jlp.html create mode 100644 doc/javazoom/jl/player/package-frame.html create mode 100644 doc/javazoom/jl/player/package-summary.html create mode 100644 doc/javazoom/jl/player/package-tree.html create mode 100644 doc/overview-frame.html create mode 100644 doc/overview-summary.html create mode 100644 doc/overview-tree.html create mode 100644 doc/package-list create mode 100644 doc/packages.html create mode 100644 doc/resources/inherit.gif create mode 100644 doc/serialized-form.html create mode 100644 doc/stylesheet.css create mode 100644 jl1.0.1.jar create mode 100644 playerapplet.html create mode 100644 setEnvAnt.bat create mode 100644 src/javazoom/jl/converter/Converter.java create mode 100644 src/javazoom/jl/converter/RiffFile.java create mode 100644 src/javazoom/jl/converter/WaveFile.java create mode 100644 src/javazoom/jl/converter/WaveFileObuffer.java create mode 100644 src/javazoom/jl/converter/jlc.java create mode 100644 src/javazoom/jl/decoder/BitReserve.java create mode 100644 src/javazoom/jl/decoder/Bitstream.java create mode 100644 src/javazoom/jl/decoder/BitstreamErrors.java create mode 100644 src/javazoom/jl/decoder/BitstreamException.java create mode 100644 src/javazoom/jl/decoder/Control.java create mode 100644 src/javazoom/jl/decoder/Crc16.java create mode 100644 src/javazoom/jl/decoder/Decoder.java create mode 100644 src/javazoom/jl/decoder/DecoderErrors.java create mode 100644 src/javazoom/jl/decoder/DecoderException.java create mode 100644 src/javazoom/jl/decoder/Equalizer.java create mode 100644 src/javazoom/jl/decoder/FrameDecoder.java create mode 100644 src/javazoom/jl/decoder/Header.java create mode 100644 src/javazoom/jl/decoder/InputStreamSource.java create mode 100644 src/javazoom/jl/decoder/JavaLayerError.java create mode 100644 src/javazoom/jl/decoder/JavaLayerErrors.java create mode 100644 src/javazoom/jl/decoder/JavaLayerException.java create mode 100644 src/javazoom/jl/decoder/JavaLayerHook.java create mode 100644 src/javazoom/jl/decoder/JavaLayerUtils.java create mode 100644 src/javazoom/jl/decoder/LayerIDecoder.java create mode 100644 src/javazoom/jl/decoder/LayerIIDecoder.java create mode 100644 src/javazoom/jl/decoder/LayerIIIDecoder.java create mode 100644 src/javazoom/jl/decoder/Manager.java create mode 100644 src/javazoom/jl/decoder/Obuffer.java create mode 100644 src/javazoom/jl/decoder/OutputChannels.java create mode 100644 src/javazoom/jl/decoder/SampleBuffer.java create mode 100644 src/javazoom/jl/decoder/Source.java create mode 100644 src/javazoom/jl/decoder/SynthesisFilter.java create mode 100644 src/javazoom/jl/decoder/au2lin.ser create mode 100644 src/javazoom/jl/decoder/huffcodetab.java create mode 100644 src/javazoom/jl/decoder/l3reorder.ser create mode 100644 src/javazoom/jl/decoder/lin2au.ser create mode 100644 src/javazoom/jl/decoder/readme.txt create mode 100644 src/javazoom/jl/decoder/sfd.ser create mode 100644 src/javazoom/jl/player/AudioDevice.java create mode 100644 src/javazoom/jl/player/AudioDeviceBase.java create mode 100644 src/javazoom/jl/player/AudioDeviceFactory.java create mode 100644 src/javazoom/jl/player/FactoryRegistry.java create mode 100644 src/javazoom/jl/player/JavaSoundAudioDevice.java create mode 100644 src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java create mode 100644 src/javazoom/jl/player/NullAudioDevice.java create mode 100644 src/javazoom/jl/player/Player.java create mode 100644 src/javazoom/jl/player/PlayerApplet.java create mode 100644 src/javazoom/jl/player/advanced/AdvancedPlayer.java create mode 100644 src/javazoom/jl/player/advanced/PlaybackEvent.java create mode 100644 src/javazoom/jl/player/advanced/PlaybackListener.java create mode 100644 src/javazoom/jl/player/advanced/jlap.java create mode 100644 src/javazoom/jl/player/jlp.java create mode 100644 srctest/AllTests.java create mode 100644 srctest/javazoom/jl/decoder/BitstreamTest.java create mode 100644 srctest/javazoom/jl/player/jlpTest.java create mode 100644 srctest/test.mp3.properties diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000..9605c9f --- /dev/null +++ b/CHANGES.txt @@ -0,0 +1,122 @@ + JLayer 1.0.1 + JavaZOOM 1999-2008 + + Project Homepage : + http://www.javazoom.net/javalayer/javalayer.html + + JAVA and MP3 online Forums : + http://www.javazoom.net/services/forums/index.jsp +----------------------------------------------------- + +11/16/2008: JLayer 1.0.1 +------------------------ +- Subband allocation bug fix. + + +11/28/2004: JLayer 1.0 +---------------------- +- VBRI frame header (Fraunhofer VBR) support added in Header.java. +- Frame controls improved. It fixes the following bugs : + + ArrayIndexOutOfBound Exception in t_43[] array. + + ArrayIndexOutOfBound Exception in huffman_decode() method. +- Licensing moved from GPL to LGPL : It means that you can use JLayer in + your own application without being restricted by GPL license issues. + It's more business friendly. +- JavaLayer renamed into JLayer to be compliant to SUN trademark rules. +- Tested under JRE 1.5.0. CPU usage < 1%, RAM usage < 12MB under P4/2Ghz. + + +01/02/2004: JavaLayer 0.4 +------------------------- +- XING VBR header frame support improved in Header.java : + + public boolean vbr() added. + + public int vbr_scale() added. + + public byte[] vbr_toc() added. + total_ms(), ms_per_frame(), min_number_of_frames(int), max_number_of_frames(int), + bitrate_string(), bitrate() methods check for VBR status. + +- ID3v2 frames support improved : + + public InputStream getRawID3v2() added in Bitstream.java + +- Misc : + Bug fixed in the decoder for some +320kbps stream. + Bug fixed : SYNC conflict with some ID3v2 frames. + + public int bitrate() added. + + public int bitrate_instant() added. + jUnit tests added (see srctest/ folder) + + +08/04/2003: JavaLayer 0.3.0 +--------------------------- +- Advanced threaded player classes added. + + +04/01/2002: JavaLayer 0.2.0 +--------------------------- + - MPEG 2.5 support added. + Encoded files with LAME are supported. + - Bug fixes for ms time computation with free format. + + Bench notes : + + Heap use range : 1380KB to 1900KB - 370 classes loaded. + + Footprint : ~8MB under WinNT4 + J2SE 1.3 (Hotspot). + + CPU usage : ~12% under PIII 800Mhz/WinNT4+J2SE 1.3 (Hotspot). + + CPU usage : ~11% under PIII 1Ghz/Win2K+J2SE 1.4 (Hotspot). + + +03/04/2002: JavaLayer 0.1.2 +--------------------------- + - API improved to let developers get MP3 bitrate, framelength and total time features. + - Additionnal files added (CHANGES.txt and LICENSE.txt). + + +10/01/2001: JavaLayer 0.1.1 +--------------------------- + - Bugs fixes in the decoder (Layer III). + + +07/02/2001: JavaLayer 0.1.0 +--------------------------- + - Streaming support added to the simple player (jlp). + - Bugs fixes in the simple player (too fast playback for low rate files). + + +06/04/2001: JavaLayer 0.0.9 +--------------------------- + - Bugs fixes in Layer I and Layer II decoder. + - ANT build script added. + - HTML page added to play MP3 through PlayerApplet in a JavaSound 1.0 (JDK 1.3) + compliant browser. + + +04/16/2000: JavaLayer 0.0.8 +--------------------------- +A simple player have been added and you can now play MP3 in real time with JVM +that supports JavaSound 1.0 (i.e JDK 1.3). + + - Bug fixes. + - Decoder improvements. + - Build Scripts have been added for Win32 and Unix platforms. + + +12/16/1999: JavaLayer 0.0.7 +--------------------------- +JavaLayer 0.0.7 contains significant improvements over version 0.0 : + + - API and documentation added. + - The decoder is much more faster. Fast enough for real-time decoding. + - Huffman/Layer3 tables serialization added. + - New buffers management. + - Exceptions + Utils added. + - Bugs fixes. + + +02/28/1999: JavaLayer 0.0 +------------------------- +JavaLayer V0.0 does not play any MP3 but it allows the MP3toWAV conversion. +This is the first step in this project. We do it thanks to free mp3 ressources +available on the net: + + - MAPlay for the OO MP3 decoder (C++). + - WAV format description from Microsoft. + +The MP3 decoder works now but it is too slow to allow real time implementation. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..51bb94e --- /dev/null +++ b/README.txt @@ -0,0 +1,81 @@ + JLayer 1.0.1 + JavaZOOM 1999-2008 + + Project Homepage : + http://www.javazoom.net/javalayer/javalayer.html + + JAVA and MP3 online Forums : + http://www.javazoom.net/services/forums/index.jsp +----------------------------------------------------- + +DESCRIPTION : +----------- +JLayer is a library that decodes/plays/converts MPEG 1/2/2.5 Layer 1/2/3 +(i.e. MP3) in real time for the JAVA(tm) platform. This is a non-commercial project +and anyone can add his contribution. JLayer is licensed under LGPL (see LICENSE.txt). + + +FAQ : +--- + +- How to install JLayer ? + Before running JLayer you must set PATH and CLASSPATH for JAVA + and you must add jl1.0.1.jar to the CLASSPATH. + +- Do I need JMF to run JLayer player ? + No, JMF is not required. You just need a JVM JavaSound 1.0 compliant. + (i.e. JVM1.3 or higher). + +- How to run the MP3TOWAV converter ? + java javazoom.jl.converter.jlc -v -p output.wav yourfile.mp3 + (Note : MP3TOWAV converter should work under jdk1.1.x or higher) + +- How to run the simple MP3 player ? + java javazoom.jl.player.jlp localfile.mp3 + or + java javazoom.jl.player.jlp -url http://www.aserver.com/remotefile.mp3 + Note : MP3 simple player only works under JVM that supports JavaSound 1.0 (i.e JDK1.3.x+) + +- How to run the advanced (threaded) MP3 player ? + java javazoom.jl.player.advanced.jlap localfile.mp3 + +- Does simple MP3 player support streaming ? + Yes, use the following command to play music from stream : + java javazoom.jl.player.jlp -url http://www.shoutcastserver.com:8000 + (If JLayer returns without playing SHOUTcast stream then it might mean + that the server expect a winamp like "User-Agent" in HTTP request). + +- Does JLayer support MPEG 2.5 ? + Yes, it works fine for all files generated with LAME. + +- Does JLayer support VBR ? + Yes, It supports VBRI and XING VBR header too. + +- How to get ID3v1 or ID3v2 tags from JLayer API ? + The API provides a getRawID3v2() method to get an InputStream on ID3v2 frames. + +- How to skip frames to have a seek feature ? + See javazoom.jl.player.advanced.jlap source to learn how to skip frames. + +- How much memory/CPU JLayer needs to run ? + Here are our benchmark notes : + - Heap use range : 1380KB to 1900KB - 370 classes loaded. + - Footprint : ~8MB under WinNT4/Win2K + J2SE 1.3 (Hotspot). + ~10MB under WinNT4/Win2K + J2SE 1.4.1 (Hotspot). + - CPU usage : ~12% under PIII 800Mhz/WinNT4+J2SE 1.3 (Hotspot). + ~8% under PIII 1Ghz/Win2K+J2SE 1.3.1 (Hotspot). + ~12% under PIII 1Ghz/Win2K+J2SE 1.4.1 (Hotspot). + ~1% under PIII 1Ghz/Win2K+J2SE 1.5.0 (Hotspot). + +- How to contact JLayer developers ? + Try to post a thread on Java&MP3 online forums at : + http://www.javazoom.net/services/forums/index.jsp + You can also contact us at jlayer@javazoom.net for contributions. + + +KNOWN PROBLEMS : +-------------- +99% of MP3 plays well with JLayer but some (1%) return an ArrayIndexOutOfBoundsException +while playing. It might come from invalid audio frames. +Workaround : Just try/catch ArrayIndexOutOfBoundsException in your code to skip + non-detected invalid frames. \ No newline at end of file diff --git a/build-unix.sh b/build-unix.sh new file mode 100644 index 0000000..5f50fb3 --- /dev/null +++ b/build-unix.sh @@ -0,0 +1,42 @@ +#!/bin/sh +####################################################### +# JLayer 1.0.1 Un*x Build Script +# +# Project Homepage : +# http://www.javazoom.net/javalayer/javalayer.html +# +# Java and MP3 online Forums : +# http://www.javazoom.net/services/forums/index.jsp +# +####################################################### + +# JAVA_HOME and JL must be set below +JAVA_HOME=/usr/local/java/jdk1.3.1 +JL=/home/javazoom/JLayer1.0.1 + +#--------------------------- +# Do not modify lines below +#--------------------------- +CLASSPATH=$JAVA_HOME/lib/tools.jar +PATH=$PATH:$JAVA_HOME/bin +JLDECODERSRC=$JL/src/javazoom/jl/decoder +JLCONVERTERSRC=$JL/src/javazoom/jl/converter +JLSIMPLEPLAYER=$JL/src/javazoom/jl/player +JLADVPLAYER=$JL/src/javazoom/jl/player/advanced +javac -classpath $CLASSPATH:$JL/classes -d $JL/classes $JLDECODERSRC/*.java +javac -classpath $CLASSPATH:$JL/classes -d $JL/classes $JLCONVERTERSRC/*.java +cd $JLDECODERSRC +cp *.ser $JL/classes/javazoom/jl/decoder + +# MP3 Simple + Advanced Player support : +# +# Comment both lines below for JDK1.1.x or JDK 1.2.x +cd $JLSIMPLEPLAYER +javac -classpath $JL/classes -d $JL/classes *.java +cd $JLADVPLAYER +javac -classpath $JL/classes -d $JL/classes *.java + +# Jar Generation +cd $JL/classes +jar cvf ../jl1.0.1.jar * +cd $JL diff --git a/build-win32.bat b/build-win32.bat new file mode 100644 index 0000000..bbbc7b8 --- /dev/null +++ b/build-win32.bat @@ -0,0 +1,42 @@ +rem ####################################################### +rem # JLayer 1.0.1 WIN32 Build Script +rem # +rem # Project Homepage : +rem # http://www.javazoom.net/javalayer/javalayer.html +rem # +rem # Java and MP3 online Forums : +rem # http://www.javazoom.net/services/forums/index.jsp +rem # +rem ####################################################### + +rem # JAVA_HOME and JL must be set below +set JAVA_HOME=c:\jdk1.3.1 +set JL=c:\JLayer1.0.1 + +rem #--------------------------- +rem # Do not modify lines below +rem #--------------------------- +set CLASSPATH=%JAVA_HOME%\lib\tools.jar +set PATH=%PATH%;%JAVA_HOME%\bin +set JLDECODERSRC=%JL%\src\javazoom\jl\decoder +set JLCONVERTERSRC=%JL%\src\javazoom\jl\converter +set JLSIMPLEPLAYER=%JL%\src\javazoom\jl\player +set JLADVPLAYER=%JL%\src\javazoom\jl\player\advanced +javac -classpath %CLASSPATH%;%JL%\classes -d %JL%\classes %JLDECODERSRC%\*.java +javac -classpath %CLASSPATH%;%JL%\classes -d %JL%\classes %JLCONVERTERSRC%\*.java +cd %JLDECODERSRC% +copy *.ser %JL%\classes\javazoom\jl\decoder + +rem # MP3 Simple + Advanced Player support : +rem # +rem # Comment both lines below for JDK1.1.x or JDK 1.2.x +cd %JLSIMPLEPLAYER% +javac -classpath %JL%\classes -d %JL%\classes *.java + +cd %JLADVPLAYER% +javac -classpath %JL%\classes -d %JL%\classes *.java + +rem # JAR Generation +cd %JL%\classes +jar cvf ..\jl1.0.1.jar * +cd %JL% diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..200340a --- /dev/null +++ b/build.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classes/javazoom/jl/converter/Converter$PrintWriterProgressListener.class b/classes/javazoom/jl/converter/Converter$PrintWriterProgressListener.class new file mode 100644 index 0000000000000000000000000000000000000000..540332f54296ff3e42057e875fd4dd5c11344367 GIT binary patch literal 2429 zcmcIlT~ixn6n@^2u$yFo7{CGnn_AE$6w+#~O4?dJLYtZrBz$Xamt=vZn@!x^K#L#s z!XMzRy>P}WF7!ej8)jt2AK;I2Jn!xXmXDz`&N!Jl?>Xmv-t&DnfB*C6UjVM*TLIGo z?gnuWxe$D~9|FV2A-suvkhlk&%y3XBIfv6A?09nKu$CNlJbE1T>jtv2u0#t_JOySW~c78mUXJ9#ow#lk) zTC#2}%357%p{OaEw(Rn3c5dDUawTJEU(C);6pC4o*2f@CWhWNydUOIq=)w51M-yW3 z)pi)V^IP(^oK~ypSwq#WB}26oBf}6bE0(Nkd1YJCC_r7=DO%-1-C~G&fU`z*!%$2! zubP&kD+amF>2ywNvS}(N!<|GfX?xhMRx9Z(EnTYW+loOx(v+ja4W46=BJodF%L+s5 zO;uN|+YG&lGegcL7a2s=oU-GlXXJU6q2tiuLai)Y+)yHyv%%q-Y?w-U+K?-xjwf=* z0xc^g@@u5;DKZ@yZarua@4_YLzA4^1|Mi)c3v2cDb=P$CFwE@Jl2WtOs?N~kW~#~h zMtXkJsP4#XnvzMb3V6bh;f?!`Wo76*qwNAT2^HuPK0uX|4>_qxxQc5M-ocQBF=Qls zff~aF+khQf(W24Wn5e57Rf;C9+1YYjf&r5gnwxNZombk7t9qOv5U-f=1oelXHN|i) zN0Soj*yb*F1Uw~M)2gP#RWmNro3>d)riM9Cl6_-D!gJJ=Lsk2f-L@lzNHbfjTVr-8 z&j{`YM*)vY*u{>7FL{c)_)5Un628H6hR9KFg|#iEMA2V;b+u2fLge&zTzrLU#K$nXh)ZDf_rP!&0(vosA>!YnFR%}9lbrC# zNs?0@d6?uY9(jc1QIDJ^8?;`wE!r?TMFjCKZjgufNs6PDIH2nQY~=vHmEY0g--o|% zAAw&<&;J={QC)P5tnq(_j?_L{Q^PMIr21b%{LKZ@_PW460{TeXp85k~>?a8RJ@{LG zad9_s%f+ei(+_x<3N#S>0ZXx;ZA_6U4~yIA9C(3%|2A0?8VK>@0O6H=NYSB?l|5Wf zMM8Fz!>6DZ2o~dBdyc(ndcO1jdG0;m^Ef8loWG}>1C;Z3%`EQoEXMrajQhOCdi^9h z74%{#Ok5zt~xT>K-^U~>oSQcH@ZQ0V0s84 f{)p(XgS_NEI2@h#D1#_r8M3%elYE)Zt=8bbLFPvs literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/Converter$ProgressListener.class b/classes/javazoom/jl/converter/Converter$ProgressListener.class new file mode 100644 index 0000000000000000000000000000000000000000..eb6412aa3b5eb14e701a75a8d1a333436ca86690 GIT binary patch literal 551 zcmah{O;5r=5S^+4z^QsB9!M>*2~a``2QOr47lf2uvRlyj(>(YC{87ef zsf0wMmwo$Y=FQB`?8oQZI{@55O@|X5&Iwe8{ri?{joX7(*BYD7u;&sWHi4okxC$u` zM>JTo6sib;Y7%Way^%F=F}~aHSgsYh4+xYz!8c5XOb%B*4H*HgZrgTaL?FMSQZc_R z=@QLXb-S~m8~Q55(pUtB&phEXX*@8B(2N9GiT5PDu=Rh_yT8@HW_Bj)=`=}Q*|llC zcx)BU1t(Ce$2udRd}g>$Qasa1z?zLm9jXLw_PgE54V=;Tz1MvyW|Aq@nX8a-CJB^( znhG{Yml;r{n8JuC>9(LVSuigoaQROi4VME4(X`!Lnw+*N>7-1ig`x;5 zDqiufAYPVhx%!|F@{)pGOO`LPmjA=G{1w)HCX-%5EWFr8dMzBP=Rg@ThXK984VoAq(rZL^ht%| z^4Ez9Uq*O`ChfpzC zfgufRF)U@%QfoxT8M(=5*d(19mCl(OS}?34tDzNRD$c5~ROA@e^jK-rK53nMFPKC{|?0zBt?zEY<_cC~!noltJ+OsLapeD2Cgs@0u zb5rMtF=0eAhB*}NwFz&i?fw&~svSC?6k~QeYm#UE52fZ9x{%F|Mn^JH7gAW!_5!%D zHkA6?)_g+6ID@~(u#8c{x%fZfEb=TRlEjJ?Jy=*b6u`+BhRZH~IvY)xW8*e4B#hBA z3@tMFP@yi;Si*(MWOm%NJBSZKgsd*_P;-JIkR21I<0V6L8Qz*5#Arz<9FHT$u?u@u zOmLjTd5!~UmnZvFOmbX6jG@*k5~T?@FmKt4WHagF068TiLI&#-Z!`g|%+8WW-;oe|vwj?)tB6OK>u8OP`N zf?<^tl+#BElN#1EGKVZHOO0CJJ#JI&G!_(djfN!}Q)wr1)7~NteaZ0^u5;X&=h`u} zfWohFQ^hyb^+oQaFGW;JjNF#c_$@<2`B>&UkY>ib+uZ{rB1to$?Ey;Ewo8nqtq;~N zon-44sub(U&8gdsiySS?DH;D|^lu$Ovah1Wa+R*G^HE8TL0N3I>ZMI$uC@ zq%Xx^+kdw>jicbGVV&t69~;YBwn#Z~pQ52IPiY}&l2PcE5adbq9P;t8lwnh>{-#92 z5pjop(Z%wNJE1M8j^0VSct#nPC&w*In08-!RCJ{?nKVr$x?GOX0HWELat0N{qb{$d z7>7wjSQKSrQ=;qybOmH2b>+&U@LmS(++=}4OPn1SW^$5xf#O?`B=r@qP1nwjv0_nSF3w@QzKNXCIT#TMOX}6qK zMyt{?4R%YuC(&Ja0v_je2nxJ(7HA2#GM0y@AQGn|AL&&%!fgwLeXek%oG_C&n=5>n zEc;1#M{6G58&FtROE?c-Txrpj)`;%QL(!Ey{8LyFS7uPrFLwc5nTB@v7C{HlfOQlM zu-KV>1^et8*SZP=4XwS-^h94(Ld zLW=heYAD3Ge+ISvx^J4?P-hU5sw?9aA;t4O)S6W>#TyIU#_F9~C=gP9z)yNb9(tVX z{GN3EW+W8Q`5n}Gq5JP4s`EV7_({_@1)mZN%Kam;su|Sxhk~K1)@eK%_v@sBy?6 zpeCJ5@~#Bf)NG&b{{wXrr+ErB@oKrPaJG8&U5aO=Ca%VKL<#Xwz#*c18WfoHN%A*+ zK3~LN&N{?avh_s!dbUxn2(S*8C`pq~enwCVW&Ksr>Y>%+`I(-ws_1*iEs-#lo;rPD2Z{O?)$}2ELMRm@5kt*j+D1j(Ql(l*-q;Ye*nAbKY=|6 F{0lqOaP9yA literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/RiffFile$RiffChunkHeader.class b/classes/javazoom/jl/converter/RiffFile$RiffChunkHeader.class new file mode 100644 index 0000000000000000000000000000000000000000..51208f8d54697d0906d4de681955fa615c0ab23e GIT binary patch literal 417 zcmah_O-sW-6r9(zNgG!iwSFEXU=KBd(X-+uA_fFO!Fx=%c9Xb)B=*pM<)H{3`~m(b z@vT>(vM@VucyDL+eSLp?0yx8d4;}Pf*zgQnH?ZMg;9!T)PV@MRKrz8i^9MDTOq!{x zho=PpHcMv7yewbBtO(Om&t%oeD!f;d$+arvIrm;Dt(r^1;po5Sqer%j%CQu1u_7R_ zE8w6j&_mb39^quU-O%_((^s9}$Yd-lLjR8s8dpAAe1Ji4yZ{C7Xa&{+mVx#g>t=qN L(dD~?O>6-_VzFGS literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/RiffFile.class b/classes/javazoom/jl/converter/RiffFile.class new file mode 100644 index 0000000000000000000000000000000000000000..cdddf70755b0a33c2c8a93c1f3337e1ca0585a65 GIT binary patch literal 3887 zcmb7HU2I!f5&mxOZ(O&%aqDi=q}wiCwvKJG0?!9*0CIU5; z=bV`{GiPSbcjnyw?mxf$HGosN>q89rW<)U~q+nv!2Mt$*nX^#zalG10$-IySVXv7e zSt$G9$8{l}Hc^pr(LzvJWremdrjQh1^V`qQIXll?s*k zLT+)fu&7|y&`^9jGZBv`G8qL*Qo-(cxwKf#m8zF=3rhvY26$@21If{ebV5Xmf)=q% zO=PE2!_#Alu~d3W7Mc|7k%i&pXkt2%PN&i$RTbDGO^#n07)=gM#|K77MXq_;6PZMM zdSEb>&WcojL|c4`++ZB(;j!t7@#n`=lj91Sg_}$#vk3*3%+ra1Au3gv^z@vU@X67u zxf{7#j#2w4M@ufsxs7fK2agj|;k zxzd%+Otn%hUFl28x;|McR=K4SdSTEJaFTH*-LA=FF`>bWugDX^7TT# z$_?WSag?UyY zG$IM_CM?p4?6g}11;J3VV|#5F@Njvl5|4|*_T`SG9~VF}jF0${z$pbM9`De_{)>LZ zLHKCt&uHmxN4WRKY>#gEtVRX@Ilulw;0A>YKeOuXU8w{gdh@8G+Bd=FE8q>vVJk!6}F&6mnIOGgux zN}2ZG#}5=d`M-1IEpmczK$d#(s&n4Q{vV9`92Dp0ldOc1pU)I;5go^ODEbb^K>X`B zT>zT`;H3D{^De@)ii13FfpzdXs+qZRg*eoB?o_rMS+YclCHjLe$!#DE2Or9&h880~ zm#YkT<^+efSjQHf?YUBLF5ty-vBVosmlTLc_C1UDK>&FPPqCTC*j;v`6(`yC6?}+X z6S~NEH}I#)_cZWl$Uob_f0%r41K&sfYy*Fee18M~9QpGNyzDp7z{`Gv4g49#M0_$f zO(5=!#5>0p#!UE=j*#o)y27zD{4SKRavx1$^*+?_ub@p)q~C`Tz6T>2@CJ7EAO4}T-u^Sne@crc z$0eAFGgq1zg?}m%*!?c{FfiMCVD)OPnkqruL$iJGarbZfZ8PgoL zhRK-jur)l!3}M}1IokrFSZ$$DjJ6;sHa-`BX3Qk;VisW+BlvVuGpGsn8jAc#X4X!b z-N9Sl7SKDcWc66|7)=HQ4Hh7&I zNa=30@x}!XuH5Nw6WXI4_BQ0`Zpic1Jef>9A@7^OzjY<3)9$u&I~y_&nj1J&k88)o z)3}Vh7uQ4`u3;XjB!0l@R4z>SO|C+c6ZrG-X7{%}yGykW$8M}Tu#Bnw1ZDe_HgoPS zBXBN#TmNAfiW_KubMx=Unz$p(9F*%ghU1<)emA(~QJ!EJ@)`S2^{gBzdnE8z{%TF~ zkT-u{c4*!JtM$Mdi*9R<(QUmkx~(-vAMT7%yVmJy%`qFb>)o&h=cvV<*i*giy!uuTm!sP$v73pJ` z@-Xxa%OR~L;JSM9{3@*R{Wx;|$lKHaEbQ`ZK8_bWn{Mx%j*881Yu)GwE9f0cI2P14 z@RXc%GhfU7bq}9-JP#ju*n@^o;!~c7)+6lzuw5JJD_o0>{<^Pp=0)xE^?BJ#c(I5Lyp(tOvsD zTm#eNXRGHu%YX!L7t9CNlxiQ%PH94PAqL54ST!T+1|pH#0~D#hKau+L6Y*Z3bM3WH PfKK}KaSx3xfD!%|UhX3i literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/WaveFile$WaveFileSample.class b/classes/javazoom/jl/converter/WaveFile$WaveFileSample.class new file mode 100644 index 0000000000000000000000000000000000000000..0bffdcb0440b02b442d5875b023837a9391a64fb GIT binary patch literal 386 zcmah_O-sW-5Pg#-T@%-u`gu|md#DjvJu6-cf*^P(=)uz(7n`u%ND^}JUwJ4(k^TUG zlsGwf@lY9{EWGnds@grnhq6N4_LmFckiQb}t32>= u5I`Kab{Qd#2&=xVOGJ-1SH%N z%xwj!1foa_ClkY+1m<=yAHs3bQE8Jz121=W`6&(dH8+M0DG9s`{&sbzbs= zzEIa@j#uw5#wpG3hpdX`pCHrk2@Nyv?s$g5FcA(jtflCCmQ!6#6{stvMq!hI5sa1^ zMQe{{8F!4DNsDaL3bP{ZxwFx(=5~GFdd^1TX$ix6E=}ZqSeSm@VPe|`F2atP+ z5RMA0^bkvT5gCntN1}&8fi0&TQ>EJ!Nu`Y(>FBm?A zkq)*(*k?j-q!yl9O^ewb%!b~D@EH2 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/WaveFile$WaveFormat_ChunkData.class b/classes/javazoom/jl/converter/WaveFile$WaveFormat_ChunkData.class new file mode 100644 index 0000000000000000000000000000000000000000..a93949632ca2b9d805ab9b6282c79be00a53a39f GIT binary patch literal 725 zcmaix-%iv}5XQel%XYV0p(2RNzg1SDaHBC{OGq{`(WC?}&2c?$yPQ2WZCwMe z;cIwf0-A8a1MpD9nFjU7;LY#MOwae7nd#-#`2~RI*leJQWfvY+I9g?_FMtw60z(xUxLp!IqrC-NlA#^FeZgUn1+UaCAiloPd= zYW0HdzD!M8z7kmP{O@x2K){Z&4~kS#WE(ph`_@w%y^h(__*z1 zj&X<6dBy`QIoJ@`y1BD<)nc`%cTw`$9PP?d3e5kz?Dc7Xd8B1gDB7aW-l3Le7`}Nw zQiD>!>Tvg~H$RFN{V0!qumizkP(<6mK53XLr+KQAMygJl3h;ei0OeDpSj0Wzead>U zsRC>V8)p!~PfP{Y87zj)m}b-%4x=8}{B^G3`}PmG-$}_G(8~V!S>(umODtYtn`PDo irxcxHIw8~(zpmN#x>)63>51Qd9ddBVv5Cic3j6{#E0+WS literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/WaveFile.class b/classes/javazoom/jl/converter/WaveFile.class new file mode 100644 index 0000000000000000000000000000000000000000..5eefd20405b01ebe9da50fb7069b0a9c4c45a022 GIT binary patch literal 2475 zcma)8-BTM?6#p&BW|Oc$pbZ~F(6(qH(5AHowa`ikAVErzL};vZwdzHD@ ze01#GF1ollvyc!V#09j(483eBy1AkhDyoa>)+C^Lng~=00VMU3@0vbLPHa*_TY>plj}8QpQ(&@HM`X z5yg~@7?Wwt$e3kv8Pxp#hhL(hf>R&?XCCgMR)zzxyzqbY55Tnc!cNtm!eLlBiH!3j zZm8un#nST38kJHkCLnmk`{MWG&TPb|2_cz{gtkKuck~gD?og{aXM&-JrbSlE5i`i3 zVU#hv1auw|xP~7acLb;@OW?`dQ{dvG3UFu)SoZ#H0yB-gq(W&31UGT8hE$*aALv?j z8*&UzHN#4A%eqaEZsn$KnW_a_K55pc3PxrlTF`QIk5;`7(qgt~jS=6JlG)f)%uJq9 zJl~*xPVbIN9VckWpQZsTq6cRY0S!VPxAdWEVhmY4;m}$M&(=zirqxfn1aqPjv|FI> zlR)ca_#T9?Zy!xz*FId~U*S%XNZf~qc!_!MK78Rlcsl&|(Yz0tdD3mM41OjbAWsAv z+w8%Mk!LD$)iastGm%DF)!8VgTKJV*U#2 zruNVhy2-U04&6h@v7k9*Tb!fDHj%}EYl8Iq-FMKzL7JREk5Ba8hL@W1#6+)SO#{rf z?xK~O+Dz(P+&y$TN;KdaDn0N-1F)e|r{n2`2jSZ7a3Y0sImeeVXZz@L57Aztb(mx$w4R~WO-L98 F{smfQN*VwF literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/WaveFileObuffer.class b/classes/javazoom/jl/converter/WaveFileObuffer.class new file mode 100644 index 0000000000000000000000000000000000000000..a8453593288ff0a19473d0f490e164d5af1a9633 GIT binary patch literal 999 zcmaJa{8iis#m69XnoMhGUejtiD_?d-bw^4WjD zKk$p6O#~7#`q9LnV&Y#=&+T4fBKYN;-g}KW)5zk2hU1u2aWRFd zG$a_}JS~DL!X*`#)6hDwqWHQZf+fOL6*DTXF(jY0HaB_5kXSD>sGU=TAys?s_&)cV z49uoN(27=_HfI=rwC%K=H$hOhwmqvB_-!6WJhVi0$@Ta=aqF+|ce^In}q$;?8r4nD+0tnJENCdp7%I#eG>ifRgE_yH}FZb(7x={ zxnRxe7(`CTkO(J`@A8jcTE|HY>$r}Rjyc@WaTB)~Cjal$N^iBo-?$B4BR@i`U(Fkb z`=+muUrRx_Dr{mHIRs{x%hUApv>5Whi5#-oSTEb+Qd#U9X=8$(OO_s%f`r(dz7k^j zIMe=drVS}W_(?GdMn;{cSfJAjVk(rmxesP4pS4{iir2Q`T6WT&c{ zgrx~AL(5TP-&nzn$1#9?d(CHlRwZP(BM&= z>5iX*OwS)E5GW~n6-uL(I6o-~-qW2*k2Hp}UD7=w3C*+8U1@<(Vp2?&N_)sG#M%V; nUwJ=z&Bn>NjsbbfjGAep(H@Si_8{l_kW4I^g!fA4k1F90p^DBH literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/jlc$jlcArgs.class b/classes/javazoom/jl/converter/jlc$jlcArgs.class new file mode 100644 index 0000000000000000000000000000000000000000..f2ba829bd2c3dcbf8d80ee9b9cb0b3ec3dec2599 GIT binary patch literal 2073 zcmZ`(>vI!T6#w03)7_@aE6`#sj|&2(DNStEs^uXiQVde4VnL`_wwv2z>t;9XZju(? zitpEFzMk>5 zQB_f6P@5IYtjwAWtjN&q)`MC-n60`c!LYsVi&?kn%=)Hbi+RHgT#xjwklx0d35G4P z<-BDJ$EcEZ`s{+yF!HwHl=Bw?&vME~7__zTdP8_~E=7ofZE7EF(GWI6=TXbCg5wN{ z%)mtkr4T~uu6eF0e1F_4`wYFAnFoUm5WeKJZ*SakDQJnNuI*6juAYq z<2fmf;#r11iS>r-R`UyXz9dWv=H&~XIXtQ(j~oMZJR=o5hAJwq>+s;~IF1)}1gOjF zhK>fBIu@~{;|AVQ@ve^d@IJ%dwK|-uSLcK`;d)ggIJIbsT41@3iVt*rh>sW!7M+G+ zTO}UXf`_%p@oAr`$4k_Lx*gKHH ziDyEOT*qhlT#_%Sp94C+#8)y0nupOTTNu9JeodIx{1P`D9(9(tJI9UrKzKZ;2tHKf zZkWP89be-cnu`f)|2b+uKgJn)&QMX$8cU>Ia2?7?+Kn;n;e4nuvv`%af9-VTB;?4j zzx|=jnK@^g&N@VUXK3X{BPG(?CsRGf4@!7XRr<*vgkK~NjZ=bO!D zuHEjOBLWrQGVE*L$N@0hXz5@cpno)O>VJ}6bR6LoY{T~j&EeLy7M!135N5F9D(VVN zw76b3Y*O#Ztee`%;E0^sPP1Zo<7BL4iUS3Plph#g;9s(W%Kwbw_Y@k@dn-!?nss`? zU4DJe4_})!DGscQ6dN&YTZ3D40#TN;qSXw~7j%3?Byznj%L_|>AgUBocx2lX1+m=x z6g~5R;s~Qkk9~U>XX7<(oSIa!oks+sx1OM$QZL1iSpsfEqApk-UwvZ5T{-J|@7 zzXo@YBwEXh4d{yipUMMZy}=CCq>czh_fM&%l{0ozfo4GN^`WYo9GSeM(aDO8!hsv l;3G2pp$LBZ$(UziJ`nTnm=mbJ#7f))mw1Z24Z?;4?O&}8`n~`F literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/converter/jlc.class b/classes/javazoom/jl/converter/jlc.class new file mode 100644 index 0000000000000000000000000000000000000000..78c04b74ba648a00b3b5c25297fd49682fce1123 GIT binary patch literal 1592 zcmah}-BS}+6#rebo0}|)@?pfF@?lXzP~%67HnCcy*n&ZjpcrU{Ww|iRY<4r74OO4} z&>8=N_OUO#_@dJZPBUft?BC+wpglJUkeH}Dv**q|=XcM!=bYa?Z{Pp32jB`eH1uOw zLkuGv@eoEiE@)7tO2tK~zr>Ny5XNwrG?%5g!f}=3>o6I=(Qp)F8rpGPT5d@3twbj| zQW9{J<2wyK7!Kid<-FH z6pmp~8lJmuF0o}NOxM{Ko-aJwm_xPe=$OK^j(bQm^tVP&?4Q#ygZnyWF~^Yl0(NMQ zuIev(7R8(M+)Ymu3Tdn03rd~g)Mu^Tm2@mOQHRp;0P`~Kj1&tx9)hZ{D8*weGn}u# z&$=+Fh+blvvQHb&gg5!r6nWor9UVVoo}s4_p{}NPik3|$7>?JnCG5b4VcA7bBnNc- zf+td}=valpv8KbsIzzNRYD0Y+nlih#B}~6Tm3c=H&U#n2l&Fw7SHe9^C2mSlwJp|P$#sY>+FhGh%K$Ps_LnrX{$jKY$;l|vY> z6^(<=bTktsTZ>lLs#LS*il&+72gD^ZHZqW&5EVgq)bOB@&kKiod9g*Pk)~KRqEM9@ z@YN2dK8FwaZuR{V$zshw^4Q4xYSC$MO4@1Cox}N>`9B1qk?!Ri92t-ADXU{jMEMti^k|?<$ppsKh#KGf z3*Dm;RauQk)T^1_RJQZsT^VY27r~?&RYyzUe}XG-5Go@~S}hrjs(+*H546cu-+>Ys z<7KpG%Q%{Sjbq9#IwE`*oykzN0_~Ex?r5ll<2&e2hF{}E89n6cWLLC=-e|alQze`( p;Y@&{yrR4Rir?`95xO~zM3TJ-&=~K-075j_!?;F&mj0z+_(nYdXV27cC2R z{sI$YjGJ!Um`F^F@dx-9-1tkZ=bJv9jcIbfd+y`hbMN%$pKm_^%wsx%IL1}r1m|Gj zhBP;&nUH4Ez%2t)0>;vlm5tS>4+O-j!0>Xt<_CpZuvw@cxB_M`yZz|?#zS(oIs$sV zT=w07PEZeu9v!oIP~I-S3fyh4bS$6}3MkLWHxy>PpqtPayqXs*vLZXPDWEOaOPpa; zd_Qoj)iBJScxBI(ygnhmrSIP zHZg*PiSyDVkq{W$FB}$L*Xu8G`_){@-KCI5ZpjPQUEggSQdCkF{Bm&jgq>gM^K?L`rO%K-r6CNnrErL zn6Y-!%12CDTUu%1JyvY(IBzqfW=>Tx`xb`QhNhn6+nwLNl8JvMk$gtmNwqr7#dhbH zlc7YrFTxsVoTCVZA|^u-niL@iNg1;Xj(oZt?6&&dHZr{x-f#i_^Uz|UCbg^fsUoZt zPMT{2l)M)O<57@|f_MZN5kD63wdR_gRz6@TJboK-$L2@qpMGp0>`rg3>F#YyaxGq2 ox9I6|t9KX)18IdT55C>?0l{4o$jxqB`f)xau?Hm5`!5Op0?!e&U;qFB literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Bitstream.class b/classes/javazoom/jl/decoder/Bitstream.class new file mode 100644 index 0000000000000000000000000000000000000000..1c44dd5fba6dac56469b04c9680630001496265b GIT binary patch literal 4774 zcmb7HZFEy-9sk|jo7^wz`R-@G`Pt(+9zPj>|9fxR!V2e@p8Nct=l}fQ z-|p>S{`>a30Pe+~1K5FQ8qkktW%;5kGIrb4OJj zby>cl??l#5@<@@ut5-&AlFPaq_h zw(?rLHj-^hf zx^so@z0;+M@l^VFB7b7KyuVz`rlxvH=m=F1wF#dr6sEe5O?GFpX-X}2KVqvSoi29J zBL!-@m?rt*73l|y>3icO_ZL&Aa+#i!_tESlxnikoyH9o7bNO7kU%}e;MZ=aG)NxRO zHfTGfws%O}CJU)d;$d4-Gi`SEj#;;sLdL+ZnRNCgefSQDOI6G5z85;6S`^M?~GEo6riAxsFmG(2TgVV)g zHecRbC^7SeJcH1l=wL?u!Z(mB(+9!OFFOc>6WR3fta}m8XHN-0 zm>K(6d%_9IWGa8O`@lr8a4I!EneF{QLZ#G%2gKZfhw(}yl>#B#IB5!29D#H zf#2bM1)GKM=CFOZs0{obV+KAU;hq#RAK(uL_Q-KqmOtXUh@Lj^c|2`kL~y6^q=C<& zD31Nfz)lPpcoh2#oD-5ka8$-_t6hOdux=T})tvY3wySJES@$x8T$>G8}6?uNU)DI4@TnyH^t=<`VjY2qD zpUC}=-dhH`_jV#1O7v)CcFFSqFOgZx_P=f?sE0YZHJGV*-O`X%Iqcj95};@xiU zJ@_~&*iQDI*|i}%%Z5y^4VhsZGOIRZ)7g;8Bn(Oa*^s4cLw1`D*>Hp&=_?zuwQR`l zB5b7%>JpBt^QUd?57NA%`FJXA}ahh~|ftAV7djwCg0BknlGM%Sk)+>THn&)n+t(f$8t(Ng z(BLEXaZg{T8K~k;5g+NZqKr#t7123t7@k9H*x84<4{mcWyxY93+O_Bfv|3SdVO1wp ztWsrpw~DsM=b#N=W_h$=4T~ejG_;_Na2+;cvwOCvx{VltUAPB5#9Q3S`9Y@hF`gyW zoK;*Up~qc=M;W#~=D+(pyHuZO>r#8n#4L7qX+7q{v*_>g_Lx1hh%dX3YrKqmiP7sE z;TfS{H8UpUI)SfetUqQ3#+*oHs8D01VtleV;>K(vKPsiB)`+Xu;Z-hO!Mdaz7O;M( z^AfKl2ONv8%^fa7m^5pv*f58tA=aXYLA~qRWs(9qzc|I!y2ee!=5WjvaE<~rxmAW( z#~X(zr&*hYDG^tz_=uEo^Bi{X>8fILQ1Q-Ui&TS6JBRM!yKS^~k>w>@K6hQ4!y1R$ zM$4AZUDs&7hksEfWfRlTgE--GyF4=GUArWyVttTyZ1K#pt{2eGeZYyqk~1Ee?k-a+ zoe`!cA+)$ORng%T?h=E7sYQlI=)1)Ge$rahvX!uta5LeS3s^_6mX9i>x21}%IT&_$ ztGL^a?iy^NCpSlz??Rd(B^7nOFfGqK1INXZrL*2l1)OkAKTk`%8rPz)Q8I8h zAMsXx5k8Xl4O(2AL$ei&kn6rGdg5A`&8%=35AmgVvumG4(RD3EQ6kJ|MXI>pDQX3! z+um#P!gcvqyP*$U!KP$HS-?k~%nHrPWi5;9K zJ}YU{AEE+t{VYPZDnVM>7&S*husS=V}t)=Lw%S&?9EM`a%OadTq@&Ep|w+IYaPSU2Zc=3Kmflv#>h zKrdCT?Tp5%*iM7I9Dw0iQp@yTz=qD~Gaf}fFjxC$SPOd@*(le(SlFBCpQ~Nx7JsSwY+1ZlTS2w=aK@`0<6s5gcZy QLl`}VDdRli1c-;)q%5jh6!lW%Z_)-p z8AbLjT4>yA#j_Ccd;$Yjhp4}TCU2qRPOk-u4*O4hACC5ioj62+*}kd zZuFeVRsB!!9&Nt(kg5rG^b;*C8yvWS7PPVN;BQ%bJ~H?i=UszOkb4IAkp~8!A`cBd LLq0cngje7f9Xm@R literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/BitstreamException.class b/classes/javazoom/jl/decoder/BitstreamException.class new file mode 100644 index 0000000000000000000000000000000000000000..40973016c6cce298b0be9edae9304d2b8a91a3a0 GIT binary patch literal 755 zcmaKq+fLg+5QhKB$%$D4fj}TBZ6F*R1G2bI#RUkdskkdb>ZKv8)F{}|vYh%%y=Wy) z0*MFUp-^Xo0}+(U^6q%|n}2qG@5AHmJ%BZ=*btb?VF=SU4`nkL)W?`O?lS)NuKWa$=H3^x|K^W+Dg6nJ__$R*C@x!+FO{*YmHwIRAeyHfw z-|NUmeV35h>hi%$gz6Hc=}AQ9IU7)3!Kj}d`MlnABQ zN830KIxVRTxIidw1o}uT=^s{~+p7vJV#$IdP)A9?#WG>h==_YLL+_yDwWP5@dC$pP zXZy0NgD89l{L0DO{<%~GVD0~k#(*ONch9b6{BBoxAbi5N7(#K~#*0*PNeot*id@pg^RVYW+mNPoXZX3V-m PwtRyePgk&i_Y&|IQ+Kcw literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Control.class b/classes/javazoom/jl/decoder/Control.class new file mode 100644 index 0000000000000000000000000000000000000000..dbc8adb56991fbbacbf6a60f1d2344c5019a7e05 GIT binary patch literal 240 zcmYk0I}XAy5JYDo5dP3}0jMmFfS?CaP|%sgiW~(m${Hj%8U+X7PzWbVK{c8;v!nfd zUvB^_%wkMpObH$Fy7YwhVtFJ);`vJGTiF--VO>@Sr%=1RB7|XP z{GP>n%dReO1CxIiEw-)nro@dFHNKEk*<{Q>tVFq;4X literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Crc16.class b/classes/javazoom/jl/decoder/Crc16.class new file mode 100644 index 0000000000000000000000000000000000000000..b62c4357b7063cc294ec2924b4553a27682bbc8e GIT binary patch literal 436 zcmYk0%}&Bl5QWceZ)q(R`BBs$uCbejjjN^`R;*l*n6M({w$Wl~4L=5rF@#reB`?6n zjej9=;REa-$pb7$txoO8a9$qus3x(w$I?RWLO~gZ&l^DZD;(&^46&j(5 zP2{7AKgu}UqqL_LbII=9%ro=M&OUcPe|`H7UkD3JNMzWaV-{iY2)}kjq0AF+5W6IEp7K;?jJkpr~M#Vc2PkdQ+6%8@A1@2191^ z(D-N^JI+zz&??k;)v0l}un{(HI$wxUJy1hBZuR7{>&|>pFBHeUV+^Qq${A)1qtC@B%Lx0xM~0 zz0$Cbl5BN@VX9Ybt7%y~jwws_u?0ye3d#(#gU+$x=_IpbxW*BUDAF~w3hBx%Sw^G5 z$v@Jg@$Q*nwCC!a*4Vd569ZZN*GxKE-+uds$c%cO+ckzoPaQrT^-Ie)3{sd6?*)rj z;iJOwP=9LnB9~#Tzk_Z?Qe*0hp<#wTlBI!SML5F`s2 z*IQuv7X(fb)Y}N{wGci<IrS3d*oOan|SpSOP Z2^q4d4CV%eBi--{fm8w{@f6F5{RYP2N1Olv literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Decoder.class b/classes/javazoom/jl/decoder/Decoder.class new file mode 100644 index 0000000000000000000000000000000000000000..5066962afff340baa840320afffe09b39cb91a7b GIT binary patch literal 3559 zcma)8>30)V6#q>-$&krd+EUO`s~|fx;kcYLXLAfPU4i{PRDUS z9+2aMLU>4)hc!H+qYaPB;V})5>$nV0$l*y1Pw7|>OO~ev^NfaPb!-&OMm#MVpHox+ zoP?NqUc(ClU)0fsmo&UAKD{FT@>Z{Ecum9W3ZlDB$DA%IFw*(FDIvw~&>6pE# zA`^a>KxU~(Z$)H7sFS`(Rbr)o`;=oHpSAMYQwo$cW9eguj+hLw&EUpJHtpPL%TaK7 zsN#__gM@S@NKrhO&$&5IaFUw$leA4x+ZEI&I`2}T4lyYTu1bXJ4BRZ|N(34YTkfzm zWzO1exel&ObY6%w3#Mqf6*m=J5pJ}?(J%JmemqkwIr_OjTx5r3vb6d`y%@~7Mc1*+ z>HcsptM#RioXlD?Zmy7Lz*o}OU0z`hdiAGZUAXPCyg1v;;P^sI^2tCmqfHf3HK|qh zLA#JWmSK7otjb$+LEJ0;DCkV2!`)xb%It4Xq`gS=*k=B4&)y?WVa}Yets3_aQLxgn zTqkFpumYNbL*aM7u(;Ro+)HU-fnMv?Qe}ys*PeuW#kQ>NRkDHGafd9UoFHKXr&3P_ zQn=N?7Hl=JLzXx2rh&Jx$H3cohxHgH9XJ@YfPr^K#d~<)Kp*-Ie1H!PY?ECYw;3=o zq2VI~A7jkG4Y*Om83UhS)WA3nY53GYMh>6ha|1&dHZX!=4$AWwuGD~B@vMQHz~0>u zCa`RP3I7)cZpJM&ZuZ~dW#CI;AHbl3^|jRp;V^J74jT9hW9*AC?uZ3(27dP7EI_dq5yzIVr-ed8l{a-`GppqZac znOWC!MNM=bNKuOnMbaaQ11Tx&wPDxx8;wl1yizq{6HFpn&f1pgjQbB~jRY<2K1$3v zIoGO4sGK%*rM1=|A?=Is4y{hx&|!SOfw8O#!l(HKF_lNMcZq10!{23^)M@Xji%nIZ z+DIbp@o0&3N}|s{Nxl3Jr{FpmSSyo)|L*Ffkv+(c_aOV-gX~2Qvd28g=J6mq+kzbtg~Fw4)G4lga{=AGm`@zayaE#6ODl#Puc@P?tQ1`mqJ5 z^N4gULi-WX(PY;=wB*mwN?5V8`%lEVk93z1^Hs&L3%dhVYdk}MPPr2FKM?;uFn1^R z1Uy4@N6c;Y^&6w2u8ZmfmT=Kd!Uo?;1Ffv&vC%&^%CYQ!279SU?l%Ax5yH*nY<9DwS-Fq`u^>sxJv)p_}zuO15YJzb)-Zk z0xf03_h2lbHxWu;BUIG-9XAr!{h{QwW%7XvxiOGdn_}>(Do5Xa#LA`C&>yj_pF`VN z8xwb_@2T({T*4!f^m)3M@bF0pg7YV0UT}U@`qcJs$jskae&V;t&hbm}yOeimUqn0e zf7w`f7f%iR8u_)p+{Iq%fcQDYdE;w;LbO~xo9V62=*Kw@u1D-&ulAeP literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/DecoderErrors.class b/classes/javazoom/jl/decoder/DecoderErrors.class new file mode 100644 index 0000000000000000000000000000000000000000..18fcd784b18b7d386073e603cf108aee54234aa0 GIT binary patch literal 276 zcmZvXK~BRk5Jmqa&`_Whmasz{z~TsQW1)a$S8fAh6`9sTib5>80SS)Q1qa|zs1Dt9 z!D{qo-k1LT{BFJh++v*JG{Y#v8DUha2c@4>C5+LAKt`o+tKLWm*R}nyU*5m5x?wA~^eY!w zzMCQhAJ&BP-eHYxUzvWX-LfOx{1>~AnzWxT?1F>X_^)1y6qh)_VdO#lGC>ykXpe`H KkN5Z_TG#@_gFG7m literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/DecoderException.class b/classes/javazoom/jl/decoder/DecoderException.class new file mode 100644 index 0000000000000000000000000000000000000000..5bcefb71d7689481a01108d1aac02bcdb3c62896 GIT binary patch literal 749 zcmZ{i+fLg+5QhKB$%)y9CJ=IJOHyd+m>{dyL0q&%YAWtpRqCZ7t6-Gc(PB#4XW{}R zP6CMs=tEVVO`Ixff~=h#?|$>o&g}mFbN>k79a<&?N*OGnY_h3nQ!-FBk;IEMUh4Uk ziFMSpS2yt5z=nZMLPjbTsKcNq3DhN|c0At;cL}z&f9(Enoq_B3ozJ22{C<08<;#%@ z&fJ56Y&X9W5+B9_WvlxnBKk7y=v)&tZZ$bucDgu8Kqy$<=8Qy?SKv8v0$D5ztf5FK z{(rRhr{16^l?LAs@_SNOq-y_)s|hsl)_^6@L{Y%T7GYDX{0f5a&hfzMO+uU~v@<%C z!_W(SLSqs3i9`3@pHj_$^+n)RPnUi|;JUeADR(%Oevh!dpv&_Oh^lK7ayrH2PP%?5 z`%)2>!r-GEO*@zlgQ>e}%}cdW=eHq1c*Y~9d&(~;!9KT`ZJz%si1P2Ij>$0Dl3viLEdI literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Equalizer$EQFunction.class b/classes/javazoom/jl/decoder/Equalizer$EQFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..3226c9e2acae1862418f4d6981a3404255265345 GIT binary patch literal 279 zcmaKmzskZu5X5I=;%SWk9>7Adh+lJjy;vv;R$^m+CWj=%3ntORhZ3v=3m?FT5;tOD zE-GEp%mRQ%zZU{BLf6U0^*6J%HXth!8MI)7KtrOa6h)IM>GX|ZQD&Y!Hwbl{ka`~~X$hOZPi&?a~0yK~OD=ia&Pk3U~F0h~n6kNr5^h9J)P zDV*iu91rJtxZpcqM}J~cHn zefh@CnS6<%=gPeHP+Kz1h4g$iJ*$_^S-qCdKUmbNl_kA4#Ng(-QzTY&k~f9HSJy48 zV$4xZ#~rHR8Lk)=Ym~v6NZw*_Wl4f)i8}>;JdxPFLcG<|5XXB-y-+h382a{L+HiMG zCjzxKr&|-6F`G3P4LXvQ;+7UqayP|7lDv8ajBF-~JmIcZ7Aiz=CG6)x@w}jwEwe@) zx)Mp=WBY%3n!#|nYIiN62a1F!j!1~3kB69qqda#40}@g=F3~y+crh+v0$GOWt^=2F z7+v%-IVfG#jJfo+yYqUP942<Asu3;q82cc9r_0e2{X~F2!CtbrFZrwO!o+Q)T6w=Mx<7DFGYSCtybi z=Ac|?CrnMP!`Z^d_QJZFSemiG4#G_>00Zhe+^J1jc@3YetnvF1=V&ytica+-98onD z&1}F^T6VIvzrR{K&6*jZ6X!azBDjZ}+;w=j**{zCe&M29bQesiZxB#ZRB=aVvNh@krA}*sq($J;vA8c(MXhDNh+f9T9M2;{H0|Fe2A! zb_PyH28FD|vc#(V{9OI49DRuTB7Lw97qI3cMg{?p68)USymWp4q^#8B5=I6UY`UNt g;1;kkGB7eQ0iDFaz{mo$pMeF)X9e;=G#dj00DbZ;ng9R* literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Header.class b/classes/javazoom/jl/decoder/Header.class new file mode 100644 index 0000000000000000000000000000000000000000..d6d00d56bfbcfc179e5af012ebf024b1ac40cabf GIT binary patch literal 9487 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 HctZaNolUU9 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/InputStreamSource.class b/classes/javazoom/jl/decoder/InputStreamSource.class new file mode 100644 index 0000000000000000000000000000000000000000..015b74f889f5925d467df473e76840458ff124f0 GIT binary patch literal 719 zcmaJfgc5Pcgvabuh`O&chsEg${BP7W3qE=3%QIHW=p5ebQMa-CJ!bZb|M1E{~L z9FTxYAi)ud9|gR1O@pAq(s(?c_h#PC?Drp^z5uv`whI?44pwL2xhUa!6;<4DaTB-7 zKa0n~nuB!*8v-Sj2(%szqgPR=(y*HxO|o7#lF{LoK;@oFRCZrr(Z3K8JQJ`VqzNv-qD z4udiO)A>6Aql%WvAbaVdj@tsOxm+D3gYfZ0>nEv7GC4YLXi&Zf4>bpYhdDF_HVoxB zO%KDN4*N2u=+U32?WL1ZObv}`>D~RIj5C3yi>SZx^Euv3Zuh)@eguxDRZJ}x%Au-c zuw_Ozl?kul-MCGpCvQG>S^E8|A1zHQ2izan?!Az+@30(O%XPs5x gy};Fi*I-M-vlrmJr8h#BDBw)G$y$G9m;b}XFA3w07XSbN literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/JavaLayerError.class b/classes/javazoom/jl/decoder/JavaLayerError.class new file mode 100644 index 0000000000000000000000000000000000000000..8c774f155b80ae1349803daf55c5c8464961458d GIT binary patch literal 148 zcmX^0Z`VEs1_nb0E-nUU26lD^4t54kMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvExD76w*E z2BoaTvc#(V{9OI49Q~BkWS~ruz86r;C$TcM$hD{_zlf26AEZb>CowNwA1uP4$iM_N d9|RbI5NHsPWCQX9!F&b=R;}#}j2poU7yyy}9S;Bi literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/JavaLayerErrors.class b/classes/javazoom/jl/decoder/JavaLayerErrors.class new file mode 100644 index 0000000000000000000000000000000000000000..c32689931944ed0bf211b337c67f54e2bf807e61 GIT binary patch literal 183 zcmX^0Z`VEs1_nb0ZgvJvb_Om+27V{ckl>IYS4ZD?*PtN(AVvm8Peuk_=ls0llEl1{ zu*96wRAvSSpfCfki>tH0i)#=>AyAMBD5#v3Se96opP#Frm7|}Mnw+1KTBPp<6!S@} zOf7OPD#|Y^W@HcmsnX9$%uCnzPs&P7E@1;1$OLo>6N4lJGXo2d#|q}L0r~7md=8)} F0|5A9CJ+Ds literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/JavaLayerException.class b/classes/javazoom/jl/decoder/JavaLayerException.class new file mode 100644 index 0000000000000000000000000000000000000000..186f20ab602e9e8301922c6becae9f1f04dfb0b7 GIT binary patch literal 670 zcmZuuO;5r=5Pi#6X({q;@mnM@P)!=o7%#?);a~#sUSWepXi05U{6k*VC?p=dn)suP zvr=edxXjGH_jcy(?Dx;dCx9bV704)wuqq=7O-31O3RUX@qp*QZ30o4j8D##@;Umv- zY=%;^Z{C^4z_fct``UHx&8q=#FeHvG+wx8rqP6-ZL+sS)a#Ghq@|NdXcCR65eF+{? z291SS?Q!ocaG=%dOQj5%5e@KKp4qu+yJm;xm;E`GV_eKQmzzVfph87jgp3LWDG56& zc2QALKvBY;$Z3Xs@zzJj85;e8(d8X_lWUw4)-=c54S6aAO9`Rb0BwzLJwBxEaMxWd z@t-S(P@BaHP@zwe>CYGs>wdZ6*}c8Gs`Leuc-PiG@TlJ Q&4wkOporrH((D3$0q7uzX#fBK literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/JavaLayerHook.class b/classes/javazoom/jl/decoder/JavaLayerHook.class new file mode 100644 index 0000000000000000000000000000000000000000..8c9cde9192e1a80a7d28e9b215b75452c2040518 GIT binary patch literal 159 zcmX^0Z`VEs1_nb0c6J64WF#UvPAuy z#JqHUpkQWRy0s=mC^KK*Gq0eu1ftZMkwFopvMN76S3fI9KP5FeKP9zD-wP<_lUSKr mby>PKV30)DrEH+B(J~9Ht#dUuMX*caIz!5XrR#+_x3*3U}?A zQ=|w_g}{C=6rN#~w};mrwI`COREyt2&1;*fFfSt4lFL0&1%@Mm-?MAwyObL)hsT2$ zpY6jiKpu@ar`@1(tvW>G4Rf}o$PDu7qUmcy#Ux&4I4ES5@jd5jrg_;mERQ?QDwC3m zrYrV(Do)~*gqn(bxZiN}@$ZqcN~JLTScx}wkM1ZzgsgL zUeby}bjKJv42xmNXGP!vYDA}k$^#Y4SYgmw+~UxXCNmh%LjR7G%yed0987opP zTt7P9(sZG86`$iF!${5I52|#HC|G}8E83N+Z4tI6QYGOF6<^{jhCP8fI7O=%ZbkQs zbliDdAPF=hT8K~@Z1D~Rf39Yj)FCL9HA`PKx#roLY3n6QcyLX$qbk0}Hw=s(vN%nZ zwridk7nd0JH%2-Egd@m}`~liEeR#W6soNZZ_0aWnc_ zTm6br<1yS^D4i{C0ai9~lVM-$#zrKQ6^IHoxlp4FyTj`i=spA>9e8$-ysbOJ9zr|l z{)L1FHevXS)E_0o4Z9n4U}6*(4vjJg5{s0|;kQf@L?(3Uq0M<;T2BcvN7~b?Rc@6S z((O_g>7AQoK+J|(xrtWOPfqWB$MAUDqBOEgDI66=d1{eG@53m)!;aGnnDQ;OK~D-j zQ=_5r1pV7ZGo!gHSqJ-#9)KRvR_F~a%#-M(FEE~Zf*tGVDD-#M5!* zLV6YPI(7*}hCvJy*3K=+bVWks6+)KCYBgE*3*_OBp9Q&rLjUeM_G~2Auy>wt2d82~ zu~qDAFdq`k#mfGvuA#2fFJVB>iRIyrM;J=4VfaM%p6=mCq3M7yrMJiWD$azA&QhdZ z#AuQZJvg6!g0Xds6xN{?>KN@mw2HAL{raD$VHJn#II@vW4X@#-ptc?NHJlA`PlokK zHFG#FB5lT<2r`-!8BNViP)a9)qP9wsz%W{(d}6;Nj5Z-! xUT94dC!vi|mM8l^h|`$-6URD`e~cXi$jnVpkT2v@K|nIz*rYlE+{K#b;(vb9r)2;D literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIDecoder$Subband.class b/classes/javazoom/jl/decoder/LayerIDecoder$Subband.class new file mode 100644 index 0000000000000000000000000000000000000000..cb56034296571b96e596d5b8a38aaf022754f71a GIT binary patch literal 1444 zcmbu-+fEZv6vpwjWoS#OQWna|0|xbG$)!9&5343v!YqitY}s=E1D6_h-O4Hq8ZVQXj(KanifrqrbW}Dx~MLyi|V4f zs4hAqIsy)=0&#RT3pi-+UvJ>mO&NJtEt+toi^-^WGgo*Xkd?oM$Ox`n^@(Px5>&wmVFJ&vBpclP!@x9kLtqTzonnS6k^?LQ5+tL{Ot zee_mE8;RAXkGgqS4W77u#b2&?!QY{q`ʸ-Q3xAOM#-1X6t@m@#jG( z8frG}x9zn-{J7@ub5qnOpBkeO{_zmFvy4$Et_s)I@pq)&U_hFpYqWx!tMUTZ>$tN< z>kYX<8;$Etx&@6;@y9~y73Shky@=0#2-z*ii?+tcigqiv6zx!~Xop!V+7WIo+VK#F z&@hM52uIL1ZbPFSMccU@jWOO6Kh9Vueu7V+9o&J&IgWO6C(6ud7k8m2`6POZPodr1 zjrMR4+RMFYANQgC+>f5-)94vKgP!HH=s7-z4)6dv$b;w*523?6jGpK7=m?LXqdba^ z@fdo6FQ5rdph-@m<2;UDXqK~Rj&rEN25Pd2<~fgAY@vnr;#(>-ju3}-4`&g@b(ZeXmKOO2r1xUp literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1.class b/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1.class new file mode 100644 index 0000000000000000000000000000000000000000..2371df334b17c580c86f0b81c600a5ee4cd7dac7 GIT binary patch literal 1960 zcmbtU-*XdH6#h23+1+k7O?p+ZRV_=qqnL!L#zB5^($#eeuD6!v8>cWJU%(cazl8iK8<<Pw|>Sl#*kE~{Vo;SQ^RaOWph|L~7{tp3rTMA_V=C{?qx zZdUsllw~wEv_NL2 zoVO%|E0&qh>Vnu3CkBHqz4A*2ptR7V2iI-V8Yl<;ify&$|vj4LSVa8OpTE+O77%$#}2 zs-&912IdTQnF#O_+_DaWxYGqzc+TGY~^|12m$X-Y}h*Y4K#yiw^^EjN>;`D+X> zeI(t@?!;}=S&g4ttCTN@kIkF0?sjV42$GVS&o`9<(UkWc=sO0G0_<;hdsjc{vnx1a zVp_uzh|YRieeEtkR8REMe^#9S2Q_qyW|7w|T1A$LVel-?gJ)?JJWIXvEOpqk)JD%z zpFK-mCM!dtfk+Y_rBx68srkr;W49s2dTQ{+{5AN$q%9ET7+$1fK|D`^8QHV3VdWOs zVhw>v_&UPhK{mR4KIt};`p7TPM`AY-AciXJRSd?2Wy>{m#J++i7KdvHlCL-YP$SlH z(q>cPv9E*Nhw0VV38n{B?uSC*}=Vx zJl`#Jv4)I_6izo~e)cK`)FR>UWy2p#8;tX`5#W!c4VgchHWdC?+EDqPv=Nc{UP6UG zPN?#3!Vdlfp~ia%gZxQCo$n(I@uvto`P1pIq3uxa70P`=xnC&n7s>;~l=&c`!k-~j v`2oTX9wpTH5MhwV2z5S87~%&BJNXDH>#gEusSccqdI%YqP-!YN$TRgXglOdr literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1IntensityStereo.class b/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1IntensityStereo.class new file mode 100644 index 0000000000000000000000000000000000000000..014c0b6ca45afac95f87860bcc586bb65e35eae5 GIT binary patch literal 1394 zcmbtU+fEZv6kP|Vol=I2h=La6R<#$PEefJwRSLu=#1|41@u8Vc4>HYkhRhrc_}~Zl z2m0h2FTQ955+D2kKgzfdGo^)$8e^K-XPT1rlhGxWJ!uT^x*atvLVj?M5QwNck!>u(&Vk*iy|8aJrW&8?Wi6I9$- z3Qa#H819DWO0H2@Sdv5IYx@S@m2*55cNzLmr=R0m{Gai1hW|#M-q^KxO&2=D8+cV_}x2SEJ|-_7{Fx>S8!FsJQg(E!=j4& z8XjOt!!j;u=$9se5e*NeSCr@^M;)#Y8lvJ!T6vIwvLqFhddDTC!)hx9`_h>|2U4J=NvvmG7KT0dZr1|N4pSNnL%sQ z1`+9aNlG3K!#a~EL+lk7l`6^A*E*qex1rEYXdZC1c|W4g_O{0b(f0hWX74qsoG#8( z*r*FfOC(KOil+%1Nv)sWu!*qdbBBa+y1{+)A3#jy;gc63pL9ZYkah#;pdS#;Bu>CS zlP7CQLKKzxLF!Xzjb*aaGbiZqD~2edP~9*+*Kj?+%2TY9GRe$WbiT(}<_nZ;fAkoU z{1FXk->J<>q{X1S#Uy)z*eAk~Oh$1d$iE}(D8=6T==&L3yXcA6$#hqb(3SXrd=QM* z7nQ(O>x+@;A-U6z(K9m?3A{thCzOv!v~{$~4l&$nS6XqU$*Vw2B;#JpB99n-<5}E6 F>=$zDVwC^@ literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1Stereo.class b/classes/javazoom/jl/decoder/LayerIDecoder$SubbandLayer1Stereo.class new file mode 100644 index 0000000000000000000000000000000000000000..76d8759661a38ff85834dd424d277b37aa6490e1 GIT binary patch literal 1770 zcmbtU%Tg0T6g>?Sf}zoXfMW2C8WLha1W^{hg4Es-a-k#JmD{%;i!GsA&dM*GYI;t8IH zkrNmUddvy^g{ow)x=-6ZwU*E8X3=r>PtlcBnIs$Nm06N;Wz5hmOIZTxeD`1Gz=j)K$}#Eqw*c{p9A_N?y^p9}Vhnn}h^p$z+lG`V7T0 zPPd1Hifdk&l-EK3n1BXotT{p&i^o|>UCv4pa#j+Wvy#?m4MDJO$sVCyE9&TvcoMNq zh);w-k)!A)FUQ}Yo|u7GiDY;Kb?d12ftLD?_Eh2v>M0OnpfO;_TO3R9s?Dzx@n?j2 z)3=UB!aF=1p;hw|HBM~u5;aPcULxaWx2a>)ghs6$r{4+0z4p(Lubv`FW_^nms@s{2 zHc+QjxywDG)*1EhNK@vK#EF7Qx)RAvv|Mnjq6y|~BBs~tXzlt)asDzikzUn3IyywY zOd{5s+QjZ@w{AG5y~hCIR{F_hGR=81(dA(+_72h19*uTw8)*N4=HBW?^ZBn6Bfm)p O#&Hde^v2`3fyQ6Y9k|l~ literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIDecoder.class b/classes/javazoom/jl/decoder/LayerIDecoder.class new file mode 100644 index 0000000000000000000000000000000000000000..ea084667219626da2d3adb4168309d0da27e9a27 GIT binary patch literal 2810 zcmb_eOLG)e6#i~zG95adhhWGPNJ7MJv|*}!lWlo_W;2M zTE)sL%bitmBgI13Rxv}Bly0r^KUn1gi+^GK?(LogVpk#PqR+W~&vzd8^gZ9qZ-4#t z3xH94u44$P9oUc8G`y}O7QCF4J8wvFN{Z7`yeY*Q9d98mS8r>0N9qN+^R8UIr&BCS zaaM|R((t}qeIUh$8ZtUMab9j)8nQZia9)G0qfc(OASZ<*#gY^kbmURcu&m*thN8f( zbS0a$+}ufP%_)zjeW&b{1dNpHI^~(7<#~=L(Dwi+<@%2675ue2y5#}0fEKL8f`>;ISi+1dAz`zt zK5O}YIMREouaV}kmyx#Z?R$Jsy_+dncysW{=gZa#%hu2?t4FC<+o7qz0uq+Delhl;+SYP12!mVq9_%VwPcbK;! zOi@LHc?Yq@+lX`dBMqSW6&wxWN6-L`dxPe|DjLm0RV2*ARcK~6@l9rTV--8hjzkrD z-S-$%HK;W_$n7XsMz#+-s|%-K^mWK0EpBBC_FEv;+=MuA`Zo z9ej2N;g2(1oIz(O$z@@Y-=LAHfG_FRp16U5*kmu4#!XzMYVEy)&c)u_=t^G~;)jiU z5*5FJqXCMAb>Bp12<(x--T-(v3^E?t`lM}77-Ta=l;^#m+PI|Juo+{lSk`!8({Zl~ zJ4V^aC&8zohP|r9KmK`I@^yIH7Dkb674;+}@X&OGA6F(B+)UE*V3Hd4sRVcHzU2MT z_bV3INZ&7Fld&mTPz`OpnnUXbE)xZs$pPC z0e=s7cGP&4ZbAPRyY?i$<24|NkKFEC-?-JgzVUTXn!wZYAS|kfvvGj8xQ}|6x|4c@ Kx`o<|H~kHu{_;2g literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2.class b/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2.class new file mode 100644 index 0000000000000000000000000000000000000000..1adbf04f0e669a5f9269befab1e8036c2769a8d1 GIT binary patch literal 23694 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 bb@RW7Wz7G4IK_FzvHzc4sq=>OmLLBgKZAwA literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2IntensityStereo.class b/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2IntensityStereo.class new file mode 100644 index 0000000000000000000000000000000000000000..060b6c493acd5278b8a3b808a00fc661799ba61f GIT binary patch literal 2158 zcmbVM-%}e^6#g#RP10~%ur^W(wU$y1NsthHXZlBVJZCoxOD5>p+1c-&dwzW9-m~ZI(`SD^0WgWp3@+ex zhKW-cL@7hMGD}koZ)ET$uCetk-c}giW_X8Tnhi57U1ykOm}7XC;XQ_Vh6RQj3^y4T zGk71jQurW+4+YLxo2Kh3r(E@{bU5Qv%5u+qL~! z0WD{Y-KAxrQC9+eO=Z@rrsFg$)3+P0z)Egu%lyv#q0!i$*m5T7$|A?+#Juf$J~?ks zcQxN48rAG>TWDI7*QPn?g&><}9bTsDDMwjh;_J_q_=vo}lU!i-xhUIr;RA=|@yzWV zN7YT=6d3t0%CS`n+u8N2uKM1uhM@v?az@v>E$_Mhrt)lW(RTck3fSp1wkmNMBNC&y zD)AA9Q}|fo6MQPMjA4l()_f-MIqpj2FedQ@zLdC#mnAMSyuy%2L1Kjss~oh3uOzhT$VLgQnfw^vtvSjY5reWL&`(|``w^lRVdY~;EuCH9r_VSJ)$U@EDwx0_afpor5 z96vx$W?k&rC@g=~?mIvG+dBw2`OOiq zBgkhi-{BICjvU6z?_eGYL zGxYYADjF^QiSpmb4zTz_qEw^hY@)PP(T0A;w*y*5C&i1YUvNI~I7fy7R%Ny-dJ9u* z>`zD5Y-H^XtRd-3ky4Vf7_baH#`*DphNTvM9MT?OzMZJ=Fi{JaBmPjy{4L19foYG} zxTfJbLr*#$d3J=;sSd;GFtPCb3Y9~xU9^m>8!oY2$X$B13LHZv^ Cg$sTF literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2Stereo.class b/classes/javazoom/jl/decoder/LayerIIDecoder$SubbandLayer2Stereo.class new file mode 100644 index 0000000000000000000000000000000000000000..d35474b08b453a046d05ff5b933922fc2350bd23 GIT binary patch literal 2540 zcmbVN-%}G;6#kaoY~r$!fJVfCRHSX#1PN%Pf}jcc(1&v);+d(PdL|NQ;} zz&O6t(2q+;5W!_8lT4+c3CD7)rfplLiHun)m2;+BEZY*Kw1lHgkCR(* ziW0&t2D4Uaxp>lk5TFo`l*#;1OKrsH#DbUegq9RoP+hp8iroQ^zO2ANFYybg;~ z-oP0hLrl&xSwTU^1-zqU6-6CMT-33~8DB6dG1|Hg8)ZK#5|Zs&X3l(MRnzGkUIz^? zY-F>hofp=L1uE7mQ`fh(>S-Fl>TJn$9PaAG|3#M&+=naSc)@a8+PpDdgYCa&qXTI6 z2HNf290myi2F}uOc#}mLTI;jX*DhW3ETx+Hd_C0{O^d1Y)gKnUWkv}3M5Ss~%&Jvy zrwn&`(Jn|BdFA=j>E+ZiuN3!kuuv^;R4C0gvn3jRd6^#(-Rn?$V?AqCC3K3Qh8A?Z zZ`RPywyWkqcM@dL=KgQAzAu^*wGFjP-rpnCgb{k40SyXwEJ+IYso>P0f>VzQPHieU z4T0b^2ZGZ82u>p*I86m{6%x-3(NWTF!iNsxmyO5{Btvj6xV#LDAHUc#qX-eAYE_z3e-*ALooh)fW zYM>?PPv{-+7NN<6HpS6T(PzYb0!)wZLXVSCC%uyaTAaa#Gsw;cD2;d>^lt~V4pY+K|bs*{QQ^IPWFYHguKlV$HRq1ej z3lA7T-h=&?bXiWUJ?ScZKhHkp6+Yh~zJBk!&?}3J^}3$YT&Psn6C)BI-N6ZJH&NO* z5#>j0@u(io6BIvxgq2sjL9|}F&t-d^OPsCA zN=M&tMTNx;6KMV1)iQi8h}+W=rrZ7gYS?Z&HkxM7Xt~|Q0Yq(w`=(1+47}rM+wlN= zO-Q$NLNX9nwe(_Hx+0sfVaqOj?RH_q?zbUfBO7S@_l`idM=kS_3yL!^he+{oPJ(cm z$2`Q6CxF*$e3E~OWh8$J`otR`jJbjO0}u2F|9hW5#z^!K=};xf+t3jXScH>b5P6wA zMYR5o=;QA*i3%TL+e0ZQh#g_Z2gW5Z;Q@d8Bx}BIRO(cpWN<~0`5Ln`J_<25{0Ydn#weIz`NcQbV-)>o6s=d-HxtZV8DjsCCoVGPiyUhxu+1tK K_-lu86QwVmgM709 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIIDecoder$SBI.class b/classes/javazoom/jl/decoder/LayerIIIDecoder$SBI.class new file mode 100644 index 0000000000000000000000000000000000000000..6717293bae1dcb32db7afa5ed346ef9bdf734ce8 GIT binary patch literal 348 zcma)%&q~8U5XQer(ry#iHvXv|yeJlIqp*0F9;}xI!Gq9CPHVeJLrfqkg1(gpDTw$0 zK9o2cd+5>2?9A-%oB8JZ=i>{&B@QCAupJ^m*M*+Ij=(;Fa)Os?PHIB?YEdkfV}d^% zO$ouIoLhnzraIN5sYHlKq75O@fe`2u&NB0CUd!@HWx1N$84D_PYhG-nwZ8eQ2lv-J z-*2MSMPaK+ZtB|d!q~}GZi+{B_mJ7yl5qNui8$sHT6~uWHVwfUIZNvf+vIwStCNNR v`pF8E#D|~JJG>V1+cTM9+$sdRZuV5PHdJ+pd}r6G(!ff90VFB7T4$ zCC;L#$6R*i&Aj(!c0N8|-vONBpp6!M4>mS*wyB>j2ip$13@l?XVnIp8VApp^)jwf4 znxyhUJ{84%lxERF&5MO9qltV}r4Zus8=sNjJjs*#f*}YRDF#ypYfNSgqh^X }bz z@UX(cvB%-S?n%4|w zpqD*t;Ex_1)TUFLpb>B>V|qcr_x0X{4XSXg(z`~ePuQT?4Tnpx@C8QbzIjWSp{;}U hOg-(vvHqjz5#OR(=T9-x{NsP@UFv(pZ=r)7;0qLMaJ~Ql literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIIDecoder$gr_info_s.class b/classes/javazoom/jl/decoder/LayerIIIDecoder$gr_info_s.class new file mode 100644 index 0000000000000000000000000000000000000000..5225cf6f47659078e05d0d16362710b6a1badcef GIT binary patch literal 810 zcma))OK;Oa6ot|)yZkLh%?kp2~*3(5hjR0+1`l-xNbgHFk#Q?luloH`{>PRW*2GVhf9JEaJmQVLEf z2&aPMq85Qi4ib5z1CO%4BcAJf1;6W O=^4={4e=OHvG@~|_Moc( literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIIDecoder$temporaire.class b/classes/javazoom/jl/decoder/LayerIIIDecoder$temporaire.class new file mode 100644 index 0000000000000000000000000000000000000000..b6b90c4e8eee73180ee2e826e31434756f171ec6 GIT binary patch literal 468 zcmb7=%Syvw5QWd=_BS!rw%%O{y08Ho-Kw~$n?S*ZAV?P_rhh|9n#i9Z=vxVvg0~0o zp~Q)zxU8Ew^DWMq%lpUE8-PP>IS^>tu+S1%sdUwWj;6qxzy`rAqEV3$w0^)PRs=g% zgCrZ}gM#1&SteCC4U0lD9`t+T@HV{9^NBxB{h^HVp;Ue^ypt*jg0pYl{S7!KSSLxA zl&1uJuYE}{y6kYVh$R;_*aDk`{eNY;a8M_7<}sCWa+9ktQIg>Ng+}G}(=dzu^XsvU zO2W<@f!OB%3I3}Fs@CU@gHiuds;**gFdf0*4(NC@kSAW8DKyV~g+7JhJ;KnRpk904^|=NU+mK7b5`~G!@trI3!R>h!%!TLx>l_C6{@Xw^xj3 z=eLB;tX?^V0hEG3PoWPfa756BeYDSYz1BskS8mB|UfTgPWYUJ&x}A}KXw#W{85gCVjeP05VHf0 ivsX}-j<<4yC`;1e2jXah&I{MV-vfRnYZtrNNADY)EkIrX literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/LayerIIIDecoder.class b/classes/javazoom/jl/decoder/LayerIIIDecoder.class new file mode 100644 index 0000000000000000000000000000000000000000..b3ead01a14f2e276c53682640973a7d3d665fdce GIT binary patch literal 25071 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 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Obuffer.class b/classes/javazoom/jl/decoder/Obuffer.class new file mode 100644 index 0000000000000000000000000000000000000000..5d4e0e35a2e3b3d037a644eaa1399f6fa5105ea7 GIT binary patch literal 533 zcmYjNJx?1!6rA<#*REUDc4NaOLrJzOPkMJ)rZ!ZR=+1Z&l^Y*=ceExe6U>Wmir0^+?Bxckx%gw?ze!9^G;Mkh&Uen^$zSeUBH=|fG!LZct5l)LW53PN&CzTJX^ZKRCTeyPdQtCxgHfFifoP z%KP#QUEhoEs_}x7*9%G|o~;?>nvvX*HBC{g2?m#$npnI)2GLH+(4n_LDfG0W@1-?^ zVKS5s|6g_?NmUu#b0w{0EKn6<<`{a5%1IA)M<&i03e#9RPoqh_#tXWYXEj-^5;0`f zjjOU&jAx(hDtRLje#GF}k*hmaEzewDwX0FOoP;3^OBmrI$i*mz8OHc*tSo6&Rf@8@ zSSi-_6wOFI&nso4q-zZQr=Sg^Qqqb`wUSChlyC`ghQ746FRP_OFmFvW$R|7-l(2{; zE|LcPL31jG?E^Q<|#BAW-%i+vPTJvca)`Mvra=EN%1%_DjIIJEM)@H1?wX{vk z9&9Y`?6AksEe1nR=J#rE}2TP^6CbNZ<=P z0mtp2b45O*PRZqpR3hvE$`!l1^eWQFPs% z%c3iB(M>ik6byn?moEG-g1?~kzWEZQn|J5lbI(2J&i!@v?FWGSxHAOSJP2Qko z2bIu5yn%I5%U0+HOZ58 z6=F+vPT8>oo$C1fdoa&V6tCfWq!`|W{#$IOK*tM@At13~0^LZUW%4Nzv>>lpLL)kc TWzjJh9piUA?PfyxZyNprK2)c| literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/Source.class b/classes/javazoom/jl/decoder/Source.class new file mode 100644 index 0000000000000000000000000000000000000000..256d1a9926f46d9ef90672bcfecbfe0f05700454 GIT binary patch literal 324 zcmX|-TTa6;6h!B?X##~pp*#dDNWLt#P*l+rlt`3^1Ruyvtdi8kC~*OGX?(B%76sf! z5&jv?nepTL`{(luz!{D`9C$b+>|Bkai<|M&ZFCvM_Yr|6gx8$(1oLBG)2SiAhx{re;|td_aF43N4Gdh-bM literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/SynthesisFilter.class b/classes/javazoom/jl/decoder/SynthesisFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..74e63d299217d7d7a7885d49c526903e24040581 GIT binary patch literal 15349 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 Y^-|Hlt9qG-2mHOO=2dvOUv|0qZ`clYd;kCd literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/au2lin.ser b/classes/javazoom/jl/decoder/au2lin.ser new file mode 100644 index 0000000000000000000000000000000000000000..0b20bc8bbd97303c0e82602289279017a3d51517 GIT binary patch literal 539 zcmV+$0_6Ry?EnRJasUEbQ}2T=2IXC_`T_s|cyIs!0RVykh6IWTjtr6!mKB;Ao*kkg zrY5Q?t}e1Nwl}&vzCXc2!$ieL$4SXc%T3Ks&r#7+(^b`2*IL}_?=j-U~>Fw(7>+kIF?eXsO@AUAr@ipgn^*Qyr_B!^v z_dEBz_&oTX_}%#(`Cj>+`QG{-`d|8=`rrE>`(XQ^`{4W_{9*i&{IUGe{PFz}{WASh z{c`=1{j&Yi{qp`2{xkkl{&W6|{+s@*{=5Fm{@ecR{`>z6{~Z4;|2+Rp|6KoU|9t<5 z|B(Nf|DgY<|FHkK|G@vq|Iq)~|KR`V|M36#004dfdHi+warABPY3pU@VdGujS=v?B zQPNG$Ny$aULBT%0JiI!&IJY*nG_x|XFt0AHEUPN0D5fT)B%&gqAf6u_9vdAR92pxJ z8W$NB7!?;3784Z`6cG~;5)Tm#5DX7Y4$BTp4ayBl49N^g3&;yc3dagY3C0OU2*n6Q z2gCa0Hgqv0E7T|0B`_k d0AK)E08ju(06+jZ05AY303ZMu01yBO001A}1w;S< literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/huffcodetab.class b/classes/javazoom/jl/decoder/huffcodetab.class new file mode 100644 index 0000000000000000000000000000000000000000..330d49878eb208c6a002a99216b0fb91237f4e03 GIT binary patch literal 49460 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 Zwe!8w?3Y<-szwdh7pyb~tT6cRe*g_r(2D>7 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/decoder/l3reorder.ser b/classes/javazoom/jl/decoder/l3reorder.ser new file mode 100644 index 0000000000000000000000000000000000000000..da216fcf469620b74fadec2ab33eb91cc99572d5 GIT binary patch literal 13925 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�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 Sg;}_TEfbnvLG~-#@%am{$*L^? literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/AudioDeviceFactory.class b/classes/javazoom/jl/player/AudioDeviceFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..bf7576577ef6aa636e3a3073e0064818e4741719 GIT binary patch literal 783 zcmah{T~E|N6g`*i?m(%+DhMlz3%FPW)0p_QYfK12f^L=v6W_;n+;meqq#aQFL%zZb z8XkymCj2PEono*Ofj-Qgk8{txJ?EaD9iISr3Ezdlgo{Z$a505xyK4wM6qpfsM5w)v z)7ZQrRQ#on1ZPc0ick+TC5>9$jbi;)?ZqMA&HGE;f!vedwB8N|NwAa1eU$|zOo!mE ze+|`+iFKL_JSL3BX>Md{VrC<}_X~y~k!e3zOJtsRwTx8ODP4asS)BGex7HGv6?h`h z^e~JOfjJNJSP*#Xp@jtxi+Dzuy}4mR>t?`)42{nA3F8)b(f8J;feH;_v78#IkcG>F zcMR)VT`qMXH2>xn|J>7NL+_^1{~?=6qWUsf4MUaZ*FY{cWt~fqu`7iL;j-pWr5wVm&9msgHZX*&() a2u{1&sQyB=_u{~E7F@$zx{iCe51a!CYtSVC literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/FactoryRegistry.class b/classes/javazoom/jl/player/FactoryRegistry.class new file mode 100644 index 0000000000000000000000000000000000000000..f32bdde250ad5efdf0d9afde3eb973e66ffedab2 GIT binary patch literal 2069 zcma)7Yf~Fl7=8|HvSHbz+|m+SYFZ1D3yoI6N)V+$Z86XbNX2?vl0#S~+0E>3u<2+2 zM8Eoluk{v28C%EB$c+C&e~9%xyPL2eGi7J?oZa_4@BMQA`uEpo0N#SGAb|-PlL|U8 z(SC3?;Ywj!+tD7IW;M56$<-=agIl?q zTG27B#(iGaZO3Zl8M-!IlFn_0xXY5OJ9;H|OS88eZKJ{o6Q0%$-I-zN980Y+NONY1 z6vXU??eJ<#7Q^UR>U264tyJE=A&(Tm(i=7s8Bi&xE^7HPFnBRd8> z0lA81lyh?x&9+@=^azw#ix$@$9uUlM`DBX&81i0OcvR#yM>h=$(Lk9yo4L`T$`KDH{9Ll5oO&2R}tW{jW2t&Wf;jx6MxQy3TByouxcy*3d zyp0hV_f@Q5RmCS*Q}FqhA$5h^WLrBP4R>IAzUEJBYr?{$+KGN0o0hsW=esJpyE75#Hs4y{(>Mu}nk6&y!0MWuWM z?;YlYHXX-D9MdC-F8e=_B*udlv?Nla`d#h0>eB<>t!`Q7H|}(C2a2sfrbedea+?Cq zE4<1Lhng+X(&K#x-d(oF9dX4rj&_Klqt)ujJ0iE;(^rZK|();LG-$UomkiI7xkir`n^O2(@ zOFTnAAasEKeS`@r|A-L%HxZ%rse8_dEA8_Pk#xZoOaBBZ(?l1&$^%a}Lk3wNca~5B zr}((;HfFpnE8%0JEm=(*!l)7HSU6NCN5iyhtdMR(UCJKd;y$A5`-qXfXNcC**V{y2 z6a9M_c+QqPC#B2*l5r{f>^mf~ap_uq~!#t%<>z;U}0J{tbx&srP6@ zLf2{Fp1cZ~l4WM2$E literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/JavaSoundAudioDevice.class b/classes/javazoom/jl/player/JavaSoundAudioDevice.class new file mode 100644 index 0000000000000000000000000000000000000000..0cf72b05027077d76a8985106c5c7c4acb50d495 GIT binary patch literal 3179 zcmah~`F9gl6#iZ_$)xE}y8u$!+JY=;QjMsfQY=tPHJFOf0=9LVCewCmGE-+J(BiIG zS5Vyd1(&+uf=5%a9ME6%9RC6T1^){5-kC|8Vz4JC_szU_x9{HjzWL+tpU(r>gzqD` z0fUv;f*}@nvA8=z;vO0IMsOcg7Q+#Qkml`-j1d{55maG}-*pz_EbeEKWs!@(fLR3v z6D%H(Vac#%I5P5K9FCv?N7&&cizyaILpv_)pnO1X6+FmJ9%At@zdpiGkMh%FEFKTK ziU|BA^_=boA5O4%g2j_89+Yt`f&>P`c#79)7EiNyhGRb~<2f163xsSlZ>2SXb*XXn zusWHbcO#Rq)!al@%Ov{T({9yKQ@Wvb2n0rQj=-9-$~*HJ-Rv=~oa&IKJUr!SUHK7# zilHtFv`sg3r;|KH+YSmyyUYwlt+q9%#EjC2F6o-ht4A-gyE59gq@h49nR$>HPSO}L zDHCr|l7^vKyRxcnYqr4pOZY36VjWu%O39qi41vh*$+R}%=%zuoVcttp0R@z_rKyhQ z#T2N|>DjDqYiZNS*!^Y~RmhFCWa`Pbq(EglYucLUxbldlJN~mA9qLOaxhx9dW2ZYU zOPvx3Mw4w^`zpr`!}b&tnzY-eKB0gK)b<5hcpcQP7F)3U0(r3bvv{ z!8Y8i-~}8PXel={CH<6fLcxo;Q^89tI&o6LE_BOynP#Y*?V|DutSzUrcqZBFD+*r4 zYYKLvOTlfN?CW?#!EW3t<4px`;T;7@K6@A21y-}uL{>FM6Z`Xqqvy2w<_WA^IHVD| zUmewUTb5}Fw3kbTr|5t|?)0oWoGtaUfz^+iW-c+FO=PIy8O=)Up}mwkrCB8bThgjw zm`zMT4rmjf-mqTi?0-%#@C#{ zHv$_=0Zn8Xg^P!}VPxEvd%pap6`}i@B??`tO&32x)7I^kg~rIgY(=ADy?h0_W{suM zFFF>eBWHW_&P3knv9t&BnvtgA=ezE0?i!;KYgxXT(Vk>-aFDM`6MMXv?uz3lu-W4w zZ%kZP=veZSvfGeu?{yi0Xl{^5koe7em!fXiOW&BjDcjL%Oprbq;^0~)A zUd0bI0gM%{82sD?Qp!v=S zth&@W*3bv~2Ks^rP{FiHPZi9p?n>lJ>tzsh?Y5KLL2v8mT+q5IHVY9GKca#~AXZz0 zbKxH$ouM;8V*c|j>d2yk_Cm2ZDHhL(dj0dw2)pNPu^$ll9j&nff~nXXLId#vr+7KKdQib7&Z-TTN&hFPw4Pl)$xE zNzoG2u*==G6RRk#g`@>~al2oe4SqhWo2Ch96aAZ~$4Oo>JwASXIalQaB%NP!$C~g%C;Mmq`Lki(>A@wiZzy6HID|X>_*`0^ z?A3v7jPy6u@p2X$=?Wv7duCgsS6YFA`SG~RpY~hb39pOQ)JX1Z7Z9%vzjv-O6^jSr z=L=}3LS9Axt7p(c6WuT{hs3}vuBqEpz_rxA>k7Dj7Mp1#xKUBWX(Sepz%BI7cdrT> MdQgeC@hz|a0%IKtq5uE@ literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/JavaSoundAudioDeviceFactory.class b/classes/javazoom/jl/player/JavaSoundAudioDeviceFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..c0280b03afbb92cf67f36893bc39338b0c1b4318 GIT binary patch literal 1557 zcmah}Yg5xu5IvXHriAclf%5P{0eJ;z#kYWHDMbq@ID^9seqlnJsi`69gcQY};;+CN zEi*DBe)dN>?oC=6q~LVA_vYTSXU}eS^ZU<_p8)3YMnpd*TG59|k<1h~vVds;GXiEs z2$%>X!Pg`=_qdr85yE`|4@5k~BN31BB#fur^O=D8Fc$dzqKIxh7qBGY1w+Wu4jiq( zz}_)LRx;b!bY?fLq_(zpH&VF_LsTiLhicML&0=!Pv30Y!z|fwy%mYU?oo&^qXvDIp zo4T{a5SX0WW(cOO0-Z+kwx&8-s#4Ic741;Z)7i-6luP*8vi6fDBUv`oBh60wFhnnA zKIOHtqf-!u-b*am{j$L@-JEHS)NWZ7vv85JljrF>l5ht@5(Y3RVVv*oVvM1?k?Xkx zhH-vc7hKTtl$@R9aTKoI2kdLOd!<^g=mvoqMk}VeXJ~Q9ihJqAxxcG3UT{k@AD8eF zDQ=b}q_M&kW*A}(PDM9As6{Pf+mM4D!LSTIvS}W`U~B; vnd2N65bc>cLGPJ=PtM_50KN|Y6M()cR0S`?7=`2+iaaBQ5{P+KXvo1|VMdfN literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/NullAudioDevice.class b/classes/javazoom/jl/player/NullAudioDevice.class new file mode 100644 index 0000000000000000000000000000000000000000..b471b19635109d789ef39a2249af9763f432f1ff GIT binary patch literal 215 zcmX^0Z`VEs1_nb09xeuE22OScE_McPMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9r?)21> zfc)ajlFa-(u#_hc0}BHyBZE>_Vp(EUetxcgR*rr_PGV(hk-lGPPL5+~N@l)GYFTD7 zP&YP3ND7=1i&GgC8JK|100AZjptTIFK#~o}69m$XK$=x+I|JiJkUWsf&cFec=7UNz KF|Ps3F#rHX1S+)v literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/Player.class b/classes/javazoom/jl/player/Player.class new file mode 100644 index 0000000000000000000000000000000000000000..ffc7e73271b5490c5376552fde6f4624a920228f GIT binary patch literal 2222 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 literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/advanced/jlap$1.class b/classes/javazoom/jl/player/advanced/jlap$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2a79ecf79c1286687dfa337144e445e00c15be7d GIT binary patch literal 872 zcmb7CTWb?R6#gcgW}EG5w>I%oTTO4e*;LmcK1Bp6eOO39tW@-E%ns?s&Fr!}3F;s6 zxsbG=pzr=D@k|mdB1C+cbIzPOxB0&FVC<0@8dI9jZsYQnS8zyZU${*51V+4GM+bVaJ7geq=adS4EuiU#8Mqm2i6 zsEhavJBy&`$2{F@GJwGjq!ig<%=29249;csSErfa1V-&&l?XYFbtiqykk0_~qr?wn zI#kDsiVRvoun|We zq*dHm=NalWJW)oQQl0;5%EjDUKS7OlbcGhza2!n}K$^ImYNC@~3Ut5A8wfO(q}6uhko4DSNPGxBRbDyYt*pTL;rZ+l}39#iZX#yOT=e}>ck3iD0l9LpCd ee?OxH>Pan1qzkxCvWOeFiG8vxdbLOc%fA55oZJBb literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/advanced/jlap$InfoListener.class b/classes/javazoom/jl/player/advanced/jlap$InfoListener.class new file mode 100644 index 0000000000000000000000000000000000000000..4a9c30dc6d468b1b18c0c1496d8ff8fb2a8c395b GIT binary patch literal 1056 zcma)5YflqF6g@*L+pa6EJOmVU3q^NZ%7Sk#@&O`A6F!iTnD}w%4rOs)*&Q13Uuj}7 zn)n0!QN}wh#cEA4o6OGLJ?Gqe&z<@4^Xqp28`#QY0&_YFn9t)j?r2!hk;Qxti|Tz> z$32*8S5nK8j%Ac{SkVc4UxTHg$}ldEy|lc}u(Wr=+x$Zm1sDT@p;&C4rJnmt?g6KcSXW5rxeY!m)<-|qJS122-Cni zHZ(jm@Cc7p@WjAVJk#*pzze+WGn-Km`+`b0xx8f7v8mw|L+vW-%8l?S+VfH=LRE}0 z6w>D%pQouv8CFNB^^N&0ma)3_40L`*c>;z^bSfEUx`T4O$k``DB-tW(phn5#ScEi* zT5l4AuGQ@xY1l|2+W%8tcWw;1mXN#3W~#=r8w?9pW0ZDIM!mT)Ok2Z1%0AWY^UrP= zv{?1#ht%%Bx={yFy!XhBEaj)j9Myw5>nPFHD$p%s#iBZAw9A0eVVk0Lnxb16qX*C{ z)z4s+bBukYi13)9e?5#%9EDl@gv>W&-=5>zuPm$cditu#P0 W{-$NV;6|TXp&UBpoWKLvV7~wieG)kU literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/advanced/jlap.class b/classes/javazoom/jl/player/advanced/jlap.class new file mode 100644 index 0000000000000000000000000000000000000000..bb10b2875bd9c62495d5cbde774f786cd05b71ec GIT binary patch literal 1970 zcmcIkU3VH)6x}yWGBBCehBQf$7->E#fxwvHXNc7%wv`Gd8rzEXYXTPphk?aRYU_(X z#mBzdK0ubN)gR!GGM+O)m}rwexP&!x=iYnv+2`JK_WAR#Kb`|vM@7R`WK_JRVGJ35 zy{+LLyvtwjsdzs`lT8gOvKqGVfr{%ICh?()k2GAs4K~|mo1Gv&4&r7Iw*tQ&A0PAj zZ55xW$Z43v9SyVilo#_V3L2t3iQ+RAyBZd-$FI*-d?BFc>`F6Vb6jc5wl}45$1)v9 zIsy}0HM{0s7YM{x?+GY7&9bDSVb*Mc+4zHe-F#>omT6aweYah+t69&iWtoo!X5ug2 z)^0v3$(CDd+K!5S6<-R3oFAJ%-*wC?c~==-Xk`TI0|&LHajRy@tmp2RX0u_`ErYFO z+c3)yO}iw^#vaWN%+gQ8vt(D#HNP>yF-*3z0@gpsa=CNy|CP=e(dF#cp-a~%%|`Zr zW!15a6@eHh?W}98TV_i~8Y?R9>bQsdI#!Vom>y;NBz-!*LQ%)pc%b4N9pAED>SfNC z{RPJneMeR2IUl5%*AhAmys6`R6seB9!q|*aXtAvd6@qOxB-JDYvN4&irem~6M>;uI zx^AWW<&hqi2Q8VcnAI$q7JEoHS{bHT7l;nIw+|~7*_LHrIt1p1yIg?29S-sbewplM zLm>`j)JXe0h#bgIc;0WVSFrQ2WHaeJif^gv(f@>XwI?#CUDY=Ls zh9zQTjgWjP2IgEEIGyWZvPisop@$2_WEU6Lj_}I;eiTVEoFKp&QUs<(Fo20pAQ1`l5p+0^!TaBh36x6JW@YB90J?aA3ZOaRLCdJKesguU8BlyUQ$N<>L@@LCTG#fTD}@8b0iVi9HJMxo=Z U(X&LbFu9qeXOZR$GzWrz1I)tym;e9( literal 0 HcmV?d00001 diff --git a/classes/javazoom/jl/player/jlp.class b/classes/javazoom/jl/player/jlp.class new file mode 100644 index 0000000000000000000000000000000000000000..d9b2006156826fc817ee72d7eb34ee31eb273610 GIT binary patch literal 2665 zcmbVN+jA3T6#p$**v+!E5Lzy_YA6!ZBuxs4VwFFGkS6KF{imZn7xWF&3v4@K)US}t7 zsCZL_q2iK?oPxZDotRW1m`|xFFrQ|tB9j>=mlc>AdQf6Q8I=`SDk>TxxT3(;(2FV) zM?p5<;07W7bHSM!ArhaO`5aFeqVzElQR{ zr_y-|a>*!`C2Wgccv!Xf9GxGv@}%09vxVV^k#f~B$~hABt!d!;xMo?U)Qp*`n8v)Y z>8Zj&)5UVpIV2$vWw)KtM}%W7s-a@oRdLuZR3DWZr5>zKTXSctMuF0iIhX|P_|=@K zI7O>WhFc24IeR8EQm)h-Dqa{R3EQK+jle}KIm@RV2J)Z5V z`g}TrItD=GD260#ZMFVERtnzM@eZylxS``+yr<)Re4yh)d_;A!{wm+pI~{2Z>39)` zb?nD8Iu77j9WQ`dDfiWEQ^ChNKEbCtj0&rN{($ab2Jx?*=zaB{4amgR?W#7Rj1{6;9!4$KizMu>5X|mQY)HyVM|cCCR%{7j?eK0 z&0#W`)bS<0(s3NaI$mOO0wWT3u5l6L?kw|NeBHcRo}kkYZdO9XZlSALJg70*Ej~{gW$n|Y@J-L{0`qGTZ(Z2aa6Z2I^(53{0Oa-|f|##m{-Er%hwpY(;9(=@SoZuGQ7Bd& zn^3Z?>fUin5Lp}9RvA)5wlqEizEZG@K3)6hd%BMPgir1hK@{>9iw+4)8qOC@j5oh>8>RxcgSuX+7WWCf()#lr?49f=vaoD zT|_VwkJX{w!g?ta|CJ(eE`*t$b{D-7+MzwRh>bDn9`sn?9yZ-^6(wG<)oxcR#^QCf zHMC`hT~9mYC9xqECzs80LTT@OlG5gKPXvbI_vPE@h{Xf@$df$ehF?H`{Qmmeh>$eY zUdQHJ(5Q+n3)m5h%buc4c`iU}4`ZLOn&d8fy>d3?LacMxxu zOkXE5u>GLoKsit + + + + + +All Classes + + + + + + + + + + +All Classes +
+ + + + + +
AdvancedPlayer +
+AudioDevice +
+AudioDeviceBase +
+AudioDeviceFactory +
+Bitstream +
+BitstreamErrors +
+BitstreamException +
+Control +
+Converter +
+Converter.PrintWriterProgressListener +
+Converter.ProgressListener +
+Crc16 +
+Decoder +
+Decoder.Params +
+DecoderErrors +
+DecoderException +
+Equalizer +
+Equalizer.EQFunction +
+FactoryRegistry +
+FrameDecoder +
+Header +
+InputStreamSource +
+JavaLayerError +
+JavaLayerErrors +
+JavaLayerException +
+JavaLayerHook +
+JavaLayerUtils +
+JavaSoundAudioDevice +
+JavaSoundAudioDeviceFactory +
+jlap +
+jlc +
+jlp +
+Manager +
+NullAudioDevice +
+Obuffer +
+OutputChannels +
+PlaybackEvent +
+PlaybackListener +
+Player +
+PlayerApplet +
+RiffFile +
+SampleBuffer +
+Source +
+WaveFile +
+WaveFileObuffer +
+
+ + + diff --git a/doc/allclasses-noframe.html b/doc/allclasses-noframe.html new file mode 100644 index 0000000..92bc889 --- /dev/null +++ b/doc/allclasses-noframe.html @@ -0,0 +1,118 @@ + + + + + + +All Classes + + + + + + + + + + +All Classes +
+ + + + + +
AdvancedPlayer +
+AudioDevice +
+AudioDeviceBase +
+AudioDeviceFactory +
+Bitstream +
+BitstreamErrors +
+BitstreamException +
+Control +
+Converter +
+Converter.PrintWriterProgressListener +
+Converter.ProgressListener +
+Crc16 +
+Decoder +
+Decoder.Params +
+DecoderErrors +
+DecoderException +
+Equalizer +
+Equalizer.EQFunction +
+FactoryRegistry +
+FrameDecoder +
+Header +
+InputStreamSource +
+JavaLayerError +
+JavaLayerErrors +
+JavaLayerException +
+JavaLayerHook +
+JavaLayerUtils +
+JavaSoundAudioDevice +
+JavaSoundAudioDeviceFactory +
+jlap +
+jlc +
+jlp +
+Manager +
+NullAudioDevice +
+Obuffer +
+OutputChannels +
+PlaybackEvent +
+PlaybackListener +
+Player +
+PlayerApplet +
+RiffFile +
+SampleBuffer +
+Source +
+WaveFile +
+WaveFileObuffer +
+
+ + + diff --git a/doc/constant-values.html b/doc/constant-values.html new file mode 100644 index 0000000..3ba3e67 --- /dev/null +++ b/doc/constant-values.html @@ -0,0 +1,600 @@ + + + + + + +Constant Field Values + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents + + + + + + +
+javazoom.jl.*
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.converter.Converter.PrintWriterProgressListener
+public static final intDEBUG_DETAIL7
+public static final intEXPERT_DETAIL1
+public static final intMAX_DETAIL10
+public static final intNO_DETAIL0
+public static final intVERBOSE_DETAIL2
+ +

+ +

+ + + + + + + + + + + + + + + + + +
javazoom.jl.converter.Converter.ProgressListener
+public static final intUPDATE_CONVERT_COMPLETE2
+public static final intUPDATE_FRAME_COUNT1
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.converter.RiffFile
+public static final intDDC_FAILURE1
+public static final intDDC_FILE_ERROR3
+public static final intDDC_INVALID_CALL4
+public static final intDDC_INVALID_FILE6
+public static final intDDC_OUT_OF_MEMORY2
+public static final intDDC_SUCCESS0
+public static final intDDC_USER_ABORT5
+public static final intRFM_READ2
+public static final intRFM_UNKNOWN0
+public static final intRFM_WRITE1
+ +

+ +

+ + + + + + + + + + + + +
javazoom.jl.converter.WaveFile
+public static final intMAX_WAVE_CHANNELS2
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.BitstreamErrors
+public static final intBITSTREAM_LAST511
+public static final intINVALIDFRAME261
+public static final intSTREAM_EOF260
+public static final intSTREAM_ERROR258
+public static final intUNEXPECTED_EOF259
+public static final intUNKNOWN_ERROR256
+public static final intUNKNOWN_SAMPLE_RATE257
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.DecoderErrors
+public static final intILLEGAL_SUBBAND_ALLOCATION514
+public static final intUNKNOWN_ERROR512
+public static final intUNSUPPORTED_LAYER513
+ +

+ +

+ + + + + + + + + + + + +
javazoom.jl.decoder.Equalizer
+public static final floatBAND_NOT_PRESENT-1f/0f
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.Header
+public static final intDUAL_CHANNEL2
+public static final intFOURTYEIGHT1
+public static final intFOURTYFOUR_POINT_ONE0
+public static final intJOINT_STEREO1
+public static final intMPEG11
+public static final intMPEG2_LSF0
+public static final intMPEG25_LSF2
+public static final intSINGLE_CHANNEL3
+public static final intSTEREO0
+public static final intTHIRTYTWO2
+ +

+ +

+ + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.JavaLayerErrors
+public static final intBITSTREAM_ERROR256
+public static final intDECODER_ERROR512
+ +

+ +

+ + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.Obuffer
+public static final intMAXCHANNELS2
+public static final intOBUFFERSIZE2304
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
javazoom.jl.decoder.OutputChannels
+public static final intBOTH_CHANNELS0
+public static final intDOWNMIX_CHANNELS3
+public static final intLEFT_CHANNEL1
+public static final intRIGHT_CHANNEL2
+ +

+ +

+ + + + + + + + + + + + +
javazoom.jl.decoder.Source
+public static final longLENGTH_UNKNOWN-1L
+ +

+ +

+ + + + + + + + + + + + +
javazoom.jl.player.PlayerApplet
+public static final java.lang.StringAUDIO_PARAMETER"audioURL"
+ +

+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html new file mode 100644 index 0000000..a7fed74 --- /dev/null +++ b/doc/deprecated-list.html @@ -0,0 +1,140 @@ + + + + + + +Deprecated List + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/help-doc.html b/doc/help-doc.html new file mode 100644 index 0000000..3df9fcd --- /dev/null +++ b/doc/help-doc.html @@ -0,0 +1,213 @@ + + + + + + +API Help + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Overview

+
+ +

+The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/index-all.html b/doc/index-all.html new file mode 100644 index 0000000..1cde02b --- /dev/null +++ b/doc/index-all.html @@ -0,0 +1,1451 @@ + + + + + + +Index + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +A B C D E F G H I J L M N O P R S T U V W
+

+A

+
+
add_bits(int, int) - +Method in class javazoom.jl.decoder.Crc16 +
Feed a bitstring to the crc calculation (0 < length <= 32). +
addControl(Control) - +Method in class javazoom.jl.decoder.Manager +
  +
addFactory(AudioDeviceFactory) - +Method in class javazoom.jl.player.FactoryRegistry +
Registers an AudioDeviceFactory instance + with this registry. +
AdvancedPlayer - Class in javazoom.jl.player.advanced
a hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame) + hopefully this will be included in the api
AdvancedPlayer(InputStream) - +Constructor for class javazoom.jl.player.advanced.AdvancedPlayer +
Creates a new Player instance. +
AdvancedPlayer(InputStream, AudioDevice) - +Constructor for class javazoom.jl.player.advanced.AdvancedPlayer +
  +
append(int, short) - +Method in class javazoom.jl.converter.WaveFileObuffer +
Takes a 16 Bit PCM sample. +
append(int, short) - +Method in class javazoom.jl.decoder.Obuffer +
Takes a 16 Bit PCM sample. +
append(int, short) - +Method in class javazoom.jl.decoder.SampleBuffer +
Takes a 16 Bit PCM sample. +
appendSamples(int, float[]) - +Method in class javazoom.jl.decoder.Obuffer +
Accepts 32 new PCM samples. +
appendSamples(int, float[]) - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
AUDIO_PARAMETER - +Static variable in class javazoom.jl.player.PlayerApplet +
  +
AudioDevice - Interface in javazoom.jl.player
The AudioDevice interface provides an abstraction for + a device capable of sounding audio samples.
AudioDeviceBase - Class in javazoom.jl.player
The AudioDeviceBase class provides a simple thread-safe + implementation of the AudioDevice interface.
AudioDeviceBase() - +Constructor for class javazoom.jl.player.AudioDeviceBase +
  +
AudioDeviceFactory - Class in javazoom.jl.player
An AudioDeviceFactory class is responsible for creating + a specific AudioDevice implementation.
AudioDeviceFactory() - +Constructor for class javazoom.jl.player.AudioDeviceFactory +
  +
+
+

+B

+
+
Backpatch(long, RiffFile.RiffChunkHeader, int) - +Method in class javazoom.jl.converter.RiffFile +
Write Data to specified offset. +
Backpatch(long, byte[], int) - +Method in class javazoom.jl.converter.RiffFile +
  +
BAND_NOT_PRESENT - +Static variable in class javazoom.jl.decoder.Equalizer +
Equalizer setting to denote that a given band will not be + present in the output signal. +
bitrate() - +Method in class javazoom.jl.decoder.Header +
Return Bitrate. +
bitrate_index() - +Method in class javazoom.jl.decoder.Header +
Returns bitrate index. +
bitrate_instant() - +Method in class javazoom.jl.decoder.Header +
Return Instant Bitrate. +
bitrate_str - +Static variable in class javazoom.jl.decoder.Header +
  +
bitrate_string() - +Method in class javazoom.jl.decoder.Header +
Return Bitrate. +
bitrates - +Static variable in class javazoom.jl.decoder.Header +
  +
BitsPerSample() - +Method in class javazoom.jl.converter.WaveFile +
  +
Bitstream - Class in javazoom.jl.decoder
The Bistream class is responsible for parsing + an MPEG audio bitstream.
Bitstream(InputStream) - +Constructor for class javazoom.jl.decoder.Bitstream +
Construct a IBitstream that reads data from a + given InputStream. +
BITSTREAM_ERROR - +Static variable in interface javazoom.jl.decoder.JavaLayerErrors +
The first bitstream error code. +
BITSTREAM_LAST - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
  +
BitstreamErrors - Interface in javazoom.jl.decoder
This interface describes all error codes that can be thrown + in BistreamExceptions.
BitstreamException - Exception in javazoom.jl.decoder
Instances of BitstreamException are thrown + when operations on a Bitstream fail.
BitstreamException(String, Throwable) - +Constructor for exception javazoom.jl.decoder.BitstreamException +
  +
BitstreamException(int, Throwable) - +Constructor for exception javazoom.jl.decoder.BitstreamException +
  +
BOTH - +Static variable in class javazoom.jl.decoder.OutputChannels +
  +
BOTH_CHANNELS - +Static variable in class javazoom.jl.decoder.OutputChannels +
Flag to indicate output should include both channels. +
+
+

+C

+
+
calculate_framesize() - +Method in class javazoom.jl.decoder.Header +
Calculate Frame size. +
chan - +Variable in class javazoom.jl.converter.WaveFile.WaveFileSample +
  +
checksum() - +Method in class javazoom.jl.decoder.Crc16 +
Return the calculated checksum. +
checksum - +Variable in class javazoom.jl.decoder.Header +
  +
checksum_ok() - +Method in class javazoom.jl.decoder.Header +
Returns Checksum flag. +
checksums() - +Method in class javazoom.jl.decoder.Header +
Returns Protection bit. +
clear_buffer() - +Method in class javazoom.jl.converter.WaveFileObuffer +
  +
clear_buffer() - +Method in class javazoom.jl.decoder.Obuffer +
Clears all data in the buffer (for seeking). +
clear_buffer() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
clone() - +Method in class javazoom.jl.decoder.Decoder.Params +
  +
Close() - +Method in class javazoom.jl.converter.RiffFile +
Close Riff File. +
Close() - +Method in class javazoom.jl.converter.WaveFile +
  +
close() - +Method in class javazoom.jl.converter.WaveFileObuffer +
  +
close() - +Method in class javazoom.jl.decoder.Bitstream +
Close the Bitstream. +
close() - +Method in class javazoom.jl.decoder.Obuffer +
  +
close() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
close() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
Cloases this player. +
close() - +Method in interface javazoom.jl.player.AudioDevice +
Closes this audio device. +
close() - +Method in class javazoom.jl.player.AudioDeviceBase +
Closes this audio device. +
close() - +Method in class javazoom.jl.player.Player +
Cloases this player. +
closeFrame() - +Method in class javazoom.jl.decoder.Bitstream +
Close MP3 frame. +
closeImpl() - +Method in class javazoom.jl.player.AudioDeviceBase +
Template method to provide the implementation for + closing the audio device. +
closeImpl() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
Control - Interface in javazoom.jl.decoder
Work in progress.
convert(String, String) - +Method in class javazoom.jl.converter.Converter +
  +
convert(String, String, Converter.ProgressListener) - +Method in class javazoom.jl.converter.Converter +
  +
convert(String, String, Converter.ProgressListener, Decoder.Params) - +Method in class javazoom.jl.converter.Converter +
  +
convert(InputStream, String, Converter.ProgressListener, Decoder.Params) - +Method in class javazoom.jl.converter.Converter +
  +
Converter - Class in javazoom.jl.converter
The Converter class implements the conversion of + an MPEG audio file to a .WAV file.
Converter() - +Constructor for class javazoom.jl.converter.Converter +
Creates a new converter instance. +
Converter.PrintWriterProgressListener - Class in javazoom.jl.converter
Implementation of ProgressListener that writes + notification text to a PrintWriter.
Converter.PrintWriterProgressListener(PrintWriter, int) - +Constructor for class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
Converter.ProgressListener - Interface in javazoom.jl.converter
This interface is used by the Converter to provide + notification of tasks being carried out by the converter, + and to provide new information as it becomes available.
converterException(Throwable) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
converterException(Throwable) - +Method in interface javazoom.jl.converter.Converter.ProgressListener +
Called when an exception is thrown during while converting + a frame. +
converterUpdate(int, int, int) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
converterUpdate(int, int, int) - +Method in interface javazoom.jl.converter.Converter.ProgressListener +
Notifies the listener that new information is available. +
copyright() - +Method in class javazoom.jl.decoder.Header +
Returns Copyright. +
countFrames(InputStream) - +Method in class javazoom.jl.converter.Converter +
  +
Crc16 - Class in javazoom.jl.decoder
16-Bit CRC checksum
Crc16() - +Constructor for class javazoom.jl.decoder.Crc16 +
Dummy Constructor +
createAudioDevice() - +Method in class javazoom.jl.player.AudioDeviceFactory +
Creates a new AudioDevice. +
createAudioDevice() - +Method in class javazoom.jl.player.FactoryRegistry +
  +
createAudioDevice() - +Method in class javazoom.jl.player.JavaSoundAudioDeviceFactory +
  +
createAudioDeviceImpl() - +Method in class javazoom.jl.player.JavaSoundAudioDeviceFactory +
  +
createInstance(String[]) - +Static method in class javazoom.jl.player.jlp +
  +
createPlayerThread() - +Method in class javazoom.jl.player.PlayerApplet +
Creates a new thread used to run the audio player. +
createSource() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
CurrentFileMode() - +Method in class javazoom.jl.converter.RiffFile +
Return File Mode. +
CurrentFilePosition() - +Method in class javazoom.jl.converter.RiffFile +
Return File Position. +
CurrentFilePosition() - +Method in class javazoom.jl.converter.WaveFile +
  +
+
+

+D

+
+
DDC_FAILURE - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_FILE_ERROR - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_INVALID_CALL - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_INVALID_FILE - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_OUT_OF_MEMORY - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_SUCCESS - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DDC_USER_ABORT - +Static variable in class javazoom.jl.converter.RiffFile +
  +
DEBUG_DETAIL - +Static variable in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
Debug detail. +
decodedFrame(int, Header, Obuffer) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
decodedFrame(int, Header, Obuffer) - +Method in interface javazoom.jl.converter.Converter.ProgressListener +
This method is called after a frame has been decoded. +
decodeFrame(Header, Bitstream) - +Method in class javazoom.jl.decoder.Decoder +
Decodes one frame from an MPEG audio bitstream. +
decodeFrame() - +Method in interface javazoom.jl.decoder.FrameDecoder +
Decodes one frame of MPEG audio. +
decodeFrame() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
Decodes a single frame. +
decodeFrame() - +Method in class javazoom.jl.player.Player +
Decodes a single frame. +
Decoder - Class in javazoom.jl.decoder
The Decoder class encapsulates the details of + decoding an MPEG audio frame.
Decoder() - +Constructor for class javazoom.jl.decoder.Decoder +
Creates a new Decoder instance with default + parameters. +
Decoder(Decoder.Params) - +Constructor for class javazoom.jl.decoder.Decoder +
Creates a new Decoder instance with default + parameters. +
Decoder.Params - Class in javazoom.jl.decoder
The Params class presents the customizable + aspects of the decoder.
Decoder.Params() - +Constructor for class javazoom.jl.decoder.Decoder.Params +
  +
DECODER_ERROR - +Static variable in interface javazoom.jl.decoder.JavaLayerErrors +
The first decoder error code. +
DecoderErrors - Interface in javazoom.jl.decoder
This interface provides constants describing the error + codes used by the Decoder to indicate errors.
DecoderException - Exception in javazoom.jl.decoder
The DecoderException represents the class of + errors that can occur when decoding MPEG audio.
DecoderException(String, Throwable) - +Constructor for exception javazoom.jl.decoder.DecoderException +
  +
DecoderException(int, Throwable) - +Constructor for exception javazoom.jl.decoder.DecoderException +
  +
deserialize(InputStream, Class) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
Deserializes the object contained in the given input stream. +
deserialize(InputStream) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
Deserializes an object from the given InputStream. +
deserializeArray(InputStream, Class, int) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
Deserializes an array from a given InputStream. +
deserializeArrayResource(String, Class, int) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
  +
destroy() - +Method in class javazoom.jl.player.PlayerApplet +
  +
DOWNMIX - +Static variable in class javazoom.jl.decoder.OutputChannels +
  +
DOWNMIX_CHANNELS - +Static variable in class javazoom.jl.decoder.OutputChannels +
Flag to indicate output is mono. +
DUAL_CHANNEL - +Static variable in class javazoom.jl.decoder.Header +
  +
+
+

+E

+
+
Equalizer - Class in javazoom.jl.decoder
The Equalizer class can be used to specify + equalization settings for the MPEG audio decoder.
Equalizer() - +Constructor for class javazoom.jl.decoder.Equalizer +
Creates a new Equalizer instance. +
Equalizer(float[]) - +Constructor for class javazoom.jl.decoder.Equalizer +
  +
Equalizer(Equalizer.EQFunction) - +Constructor for class javazoom.jl.decoder.Equalizer +
  +
Equalizer.EQFunction - Class in javazoom.jl.decoder
 
Equalizer.EQFunction() - +Constructor for class javazoom.jl.decoder.Equalizer.EQFunction +
  +
equals(Object) - +Method in class javazoom.jl.decoder.OutputChannels +
  +
Expect(String, int) - +Method in class javazoom.jl.converter.RiffFile +
Expect NumBytes data. +
EXPERT_DETAIL - +Static variable in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
Level of detail typically expected of expert + users. +
+
+

+F

+
+
factories - +Variable in class javazoom.jl.player.FactoryRegistry +
  +
FactoryRegistry - Class in javazoom.jl.player
The FactoryRegistry class stores the factories + for all the audio device implementations available in the system.
FactoryRegistry() - +Constructor for class javazoom.jl.player.FactoryRegistry +
  +
file - +Variable in class javazoom.jl.converter.RiffFile +
  +
flush() - +Method in interface javazoom.jl.player.AudioDevice +
Blocks until all audio samples previously written to this audio device have + been heard. +
flush() - +Method in class javazoom.jl.player.AudioDeviceBase +
Waits for any buffered audio samples to be played by the + audio device. +
flushImpl() - +Method in class javazoom.jl.player.AudioDeviceBase +
Template method to provide the implementation for + flushing any buffered audio data. +
flushImpl() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
fmode - +Variable in class javazoom.jl.converter.RiffFile +
  +
FourCC(String) - +Static method in class javazoom.jl.converter.RiffFile +
Fill the header. +
FOURTYEIGHT - +Static variable in class javazoom.jl.decoder.Header +
  +
FOURTYFOUR_POINT_ONE - +Static variable in class javazoom.jl.decoder.Header +
  +
FrameDecoder - Interface in javazoom.jl.decoder
Implementations of FrameDecoder are responsible for decoding + an MPEG audio frame.
framesize - +Variable in class javazoom.jl.decoder.Header +
  +
frequencies - +Static variable in class javazoom.jl.decoder.Header +
  +
frequency() - +Method in class javazoom.jl.decoder.Header +
Returns Frequency. +
fromInt(int) - +Static method in class javazoom.jl.decoder.OutputChannels +
Creates an OutputChannels instance + corresponding to the given channel code. +
+
+

+G

+
+
get_bits(int) - +Method in class javazoom.jl.decoder.Bitstream +
Read bits from buffer into the lower bits of an unsigned int. +
getAudioDevice() - +Method in class javazoom.jl.player.jlp +
  +
getAudioDevice() - +Method in class javazoom.jl.player.PlayerApplet +
Retrieves the AudioDevice instance that will + be used to sound the audio data. +
getAudioFileName() - +Method in class javazoom.jl.player.PlayerApplet +
  +
getAudioFormat() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
getAudioStream() - +Method in class javazoom.jl.player.PlayerApplet +
Retrieves the InputStream that provides the MPEG audio + stream data. +
getAudioURL() - +Method in class javazoom.jl.player.PlayerApplet +
  +
getBand(int) - +Method in class javazoom.jl.decoder.Equalizer.EQFunction +
Returns the setting of a band in the equalizer. +
getBand(int) - +Method in class javazoom.jl.decoder.Equalizer +
Retrieves the eq setting for a given band. +
getBandCount() - +Method in class javazoom.jl.decoder.Equalizer +
Retrieves the number of bands present in this equalizer. +
getBuffer() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
getBufferLength() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
getByteArray(int) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
getChannelCount() - +Method in class javazoom.jl.decoder.OutputChannels +
Retrieves the number of output channels represented + by this channel output type. +
getChannelCount() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
getChannelsOutputCode() - +Method in class javazoom.jl.decoder.OutputChannels +
Retrieves the code representing the desired output channels. +
getDecoder() - +Method in class javazoom.jl.player.AudioDeviceBase +
Retrieves the decoder that provides audio data to this + audio device. +
getDefaultParams() - +Static method in class javazoom.jl.decoder.Decoder +
  +
getErrorCode() - +Method in exception javazoom.jl.decoder.BitstreamException +
  +
getErrorCode() - +Method in exception javazoom.jl.decoder.DecoderException +
  +
getErrorString(int) - +Static method in exception javazoom.jl.decoder.BitstreamException +
  +
getErrorString(int) - +Static method in exception javazoom.jl.decoder.DecoderException +
  +
getException() - +Method in exception javazoom.jl.decoder.JavaLayerException +
  +
getFactoriesPriority() - +Method in class javazoom.jl.player.FactoryRegistry +
  +
getFileName() - +Method in class javazoom.jl.player.PlayerApplet +
  +
getFrame() - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
getHook() - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
  +
getId() - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
getInitialEqualizerSettings() - +Method in class javazoom.jl.decoder.Decoder.Params +
Retrieves the equalizer settings that the decoder's equalizer + will be initialized from. +
getInputStream() - +Method in class javazoom.jl.player.jlp +
Playing file from FileInputStream. +
getOutputBlockSize() - +Method in class javazoom.jl.decoder.Decoder +
Retrieves the maximum number of samples that will be written to + the output buffer when one frame is decoded. +
getOutputChannels() - +Method in class javazoom.jl.decoder.Decoder +
Retrieves the number of channels of PCM samples output by + this decoder. +
getOutputChannels() - +Method in class javazoom.jl.decoder.Decoder.Params +
  +
getOutputFrequency() - +Method in class javazoom.jl.decoder.Decoder +
Retrieves the sample frequency of the PCM samples output + by this decoder. +
getPlayBackListener() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
gets the PlaybackListener +
getPosition() - +Method in interface javazoom.jl.decoder.Control +
Retrieves the current position. +
getPosition() - +Method in interface javazoom.jl.player.AudioDevice +
Retrieves the current playback position in milliseconds. +
getPosition() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
getPosition() - +Method in class javazoom.jl.player.NullAudioDevice +
  +
getPosition() - +Method in class javazoom.jl.player.Player +
Retrieves the position in milliseconds of the current audio + sample being played. +
getRawID3v2() - +Method in class javazoom.jl.decoder.Bitstream +
Return raw ID3v2 frames + header. +
getResourceAsStream(String) - +Method in interface javazoom.jl.decoder.JavaLayerHook +
Retrieves the named resource. +
getResourceAsStream(String) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
Retrieves an InputStream for a named resource. +
getSampleFrequency() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
getSource() - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
getSourceLineInfo() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
getSyncHeader() - +Method in class javazoom.jl.decoder.Header +
Returns synchronized header. +
getURLInputStream() - +Method in class javazoom.jl.player.jlp +
Playing file from URL (Streaming). +
+
+

+H

+
+
hashCode() - +Method in class javazoom.jl.decoder.OutputChannels +
  +
Header - Class in javazoom.jl.decoder
Class for extracting information from a frame header.
header_pos() - +Method in class javazoom.jl.decoder.Bitstream +
Return position of the first audio header. +
+
+

+I

+
+
ILLEGAL_SUBBAND_ALLOCATION - +Static variable in interface javazoom.jl.decoder.DecoderErrors +
Illegal allocation in subband layer. +
init(String) - +Method in class javazoom.jl.player.jlp +
  +
init() - +Method in class javazoom.jl.player.PlayerApplet +
Initializes this applet. +
InputStreamSource - Class in javazoom.jl.decoder
Work In Progress.
InputStreamSource(InputStream) - +Constructor for class javazoom.jl.decoder.InputStreamSource +
  +
instantiate(ClassLoader, String) - +Method in class javazoom.jl.player.AudioDeviceFactory +
Creates an instance of an AudioDevice implementation. +
intensity_stereo_bound() - +Method in class javazoom.jl.decoder.Header +
Returns Intensity Stereo. +
INVALIDFRAME - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
Frame data are missing. +
isComplete() - +Method in class javazoom.jl.player.Player +
Returns the completed status of this player. +
isDetail(int) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
isOpen() - +Method in interface javazoom.jl.player.AudioDevice +
Retrieves the open state of this audio device. +
isOpen() - +Method in class javazoom.jl.player.AudioDeviceBase +
Determines if this audio device is open or not. +
isPlaying() - +Method in interface javazoom.jl.decoder.Control +
  +
isRandomAccess() - +Method in interface javazoom.jl.decoder.Control +
  +
isSeekable() - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
isSeekable() - +Method in interface javazoom.jl.decoder.Source +
  +
isSyncCurrentPosition(int) - +Method in class javazoom.jl.decoder.Bitstream +
Determines if the next 4 bytes of the stream represent a + frame header. +
isSyncMark(int, int, int) - +Method in class javazoom.jl.decoder.Bitstream +
  +
+
+

+J

+
+
JavaLayerError - Error in javazoom.jl.decoder
Work in progress.
JavaLayerError() - +Constructor for error javazoom.jl.decoder.JavaLayerError +
  +
JavaLayerErrors - Interface in javazoom.jl.decoder
Exception erorr codes for components of the JavaLayer API.
JavaLayerException - Exception in javazoom.jl.decoder
The JavaLayerException is the base class for all API-level + exceptions thrown by JavaLayer.
JavaLayerException() - +Constructor for exception javazoom.jl.decoder.JavaLayerException +
  +
JavaLayerException(String) - +Constructor for exception javazoom.jl.decoder.JavaLayerException +
  +
JavaLayerException(String, Throwable) - +Constructor for exception javazoom.jl.decoder.JavaLayerException +
  +
JavaLayerHook - Interface in javazoom.jl.decoder
The JavaLayerHooks class allows developers to change + the way the JavaLayer library uses Resources.
JavaLayerUtils - Class in javazoom.jl.decoder
The JavaLayerUtils class is not strictly part of the JavaLayer API.
JavaLayerUtils() - +Constructor for class javazoom.jl.decoder.JavaLayerUtils +
  +
JavaSoundAudioDevice - Class in javazoom.jl.player
The JavaSoundAudioDevice implements an audio + device by using the JavaSound API.
JavaSoundAudioDevice() - +Constructor for class javazoom.jl.player.JavaSoundAudioDevice +
  +
JavaSoundAudioDeviceFactory - Class in javazoom.jl.player
This class is responsible for creating instances of the + JavaSoundAudioDevice.
JavaSoundAudioDeviceFactory() - +Constructor for class javazoom.jl.player.JavaSoundAudioDeviceFactory +
  +
javazoom.jl.converter - package javazoom.jl.converter
 
javazoom.jl.decoder - package javazoom.jl.decoder
 
javazoom.jl.player - package javazoom.jl.player
 
javazoom.jl.player.advanced - package javazoom.jl.player.advanced
 
jlap - Class in javazoom.jl.player.advanced
This class implements a sample player using Playback listener.
jlap() - +Constructor for class javazoom.jl.player.advanced.jlap +
  +
jlap.InfoListener - Class in javazoom.jl.player.advanced
 
jlap.InfoListener() - +Constructor for class javazoom.jl.player.advanced.jlap.InfoListener +
  +
jlc - Class in javazoom.jl.converter
The jlc class presents the JavaLayer + Conversion functionality as a command-line program.
jlc() - +Constructor for class javazoom.jl.converter.jlc +
  +
jlp - Class in javazoom.jl.player
The jlp class implements a simple command-line + player for MPEG audio files.
jlp(String) - +Constructor for class javazoom.jl.player.jlp +
  +
JOINT_STEREO - +Static variable in class javazoom.jl.decoder.Header +
  +
+
+

+L

+
+
layer() - +Method in class javazoom.jl.decoder.Header +
Returns Layer ID. +
layer_string() - +Method in class javazoom.jl.decoder.Header +
Return Layer version. +
LEFT - +Static variable in class javazoom.jl.decoder.OutputChannels +
  +
LEFT_CHANNEL - +Static variable in class javazoom.jl.decoder.OutputChannels +
Flag to indicate output should include the left channel only. +
length() - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
length() - +Method in interface javazoom.jl.decoder.Source +
  +
LENGTH_UNKNOWN - +Static variable in interface javazoom.jl.decoder.Source +
  +
+
+

+M

+
+
main(String[]) - +Static method in class javazoom.jl.converter.jlc +
  +
main(String[]) - +Static method in class javazoom.jl.player.advanced.jlap +
  +
main(String[]) - +Static method in class javazoom.jl.player.jlp +
  +
Manager - Class in javazoom.jl.decoder
Work in progress.
Manager() - +Constructor for class javazoom.jl.decoder.Manager +
  +
MAX_DETAIL - +Static variable in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
max_number_of_frames(int) - +Method in class javazoom.jl.decoder.Header +
Returns the maximum number of frames in the stream. +
MAX_WAVE_CHANNELS - +Static variable in class javazoom.jl.converter.WaveFile +
  +
MAXCHANNELS - +Static variable in class javazoom.jl.decoder.Obuffer +
  +
millisecondsToBytes(AudioFormat, int) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
min_number_of_frames(int) - +Method in class javazoom.jl.decoder.Header +
Returns the maximum number of frames in the stream. +
mode() - +Method in class javazoom.jl.decoder.Header +
Returns Mode. +
mode_extension() - +Method in class javazoom.jl.decoder.Header +
Returns Mode Extension. +
mode_string() - +Method in class javazoom.jl.decoder.Header +
Returns Mode. +
MPEG1 - +Static variable in class javazoom.jl.decoder.Header +
Constant for MPEG-1 version +
MPEG25_LSF - +Static variable in class javazoom.jl.decoder.Header +
  +
MPEG2_LSF - +Static variable in class javazoom.jl.decoder.Header +
Constant for MPEG-2 LSF version +
ms_per_frame() - +Method in class javazoom.jl.decoder.Header +
Returns ms/frame. +
+
+

+N

+
+
newBitstreamException(int) - +Method in class javazoom.jl.decoder.Bitstream +
  +
newBitstreamException(int, Throwable) - +Method in class javazoom.jl.decoder.Bitstream +
  +
newDecoderException(int) - +Method in class javazoom.jl.decoder.Decoder +
  +
newDecoderException(int, Throwable) - +Method in class javazoom.jl.decoder.Decoder +
  +
newStdOut(int) - +Static method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
NO_DETAIL - +Static variable in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
nSlots - +Variable in class javazoom.jl.decoder.Header +
  +
NullAudioDevice - Class in javazoom.jl.player
The NullAudioDevice implements a silent, no-op + audio device.
NullAudioDevice() - +Constructor for class javazoom.jl.player.NullAudioDevice +
  +
number_of_subbands() - +Method in class javazoom.jl.decoder.Header +
Returns the number of subbands in the current frame. +
NumChannels() - +Method in class javazoom.jl.converter.WaveFile +
  +
NumSamples() - +Method in class javazoom.jl.converter.WaveFile +
  +
+
+

+O

+
+
Obuffer - Class in javazoom.jl.decoder
Base Class for audio output.
Obuffer() - +Constructor for class javazoom.jl.decoder.Obuffer +
  +
OBUFFERSIZE - +Static variable in class javazoom.jl.decoder.Obuffer +
  +
Open(String, int) - +Method in class javazoom.jl.converter.RiffFile +
Open a RIFF file. +
open(Decoder) - +Method in interface javazoom.jl.player.AudioDevice +
Prepares the AudioDevice for playback of audio samples. +
open(Decoder) - +Method in class javazoom.jl.player.AudioDeviceBase +
Opens this audio device. +
open(AudioFormat) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
OpenForWrite(String, int, short, short) - +Method in class javazoom.jl.converter.WaveFile +
  +
OpenForWrite(String, WaveFile) - +Method in class javazoom.jl.converter.WaveFile +
Open for write using another wave file's parameters... +
openImpl() - +Method in class javazoom.jl.player.AudioDeviceBase +
Template method to provide the + implementation for the opening of the audio device. +
openImpl() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
openInput(String) - +Method in class javazoom.jl.converter.Converter +
  +
original() - +Method in class javazoom.jl.decoder.Header +
Returns Original. +
OutputChannels - Class in javazoom.jl.decoder
A Type-safe representation of the the supported output channel + constants.
+
+

+P

+
+
padding() - +Method in class javazoom.jl.decoder.Header +
Returns Layer III Padding bit. +
parseArgs(String[]) - +Method in class javazoom.jl.player.jlp +
  +
parsedFrame(int, Header) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
parsedFrame(int, Header) - +Method in interface javazoom.jl.converter.Converter.ProgressListener +
If the converter wishes to make a first pass over the + audio frames, this is called as each frame is parsed. +
PASS_THRU_EQ - +Static variable in class javazoom.jl.decoder.Equalizer +
  +
pause() - +Method in interface javazoom.jl.decoder.Control +
  +
play() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
  +
play(int) - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
Plays a number of MPEG audio frames. +
play(int, int) - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
Plays a range of MPEG audio frames +
play(String) - +Method in class javazoom.jl.player.advanced.jlap +
  +
play() - +Method in class javazoom.jl.player.jlp +
  +
play() - +Method in class javazoom.jl.player.Player +
  +
play(int) - +Method in class javazoom.jl.player.Player +
Plays a number of MPEG audio frames. +
play(InputStream, AudioDevice) - +Method in class javazoom.jl.player.PlayerApplet +
Decompresses audio data from an InputStream and plays it + back through an AudioDevice. +
PlaybackEvent - Class in javazoom.jl.player.advanced
An event which indicates a Player has performed an 'playback action'
PlaybackEvent(AdvancedPlayer, int, int) - +Constructor for class javazoom.jl.player.advanced.PlaybackEvent +
  +
playbackFinished(PlaybackEvent) - +Method in class javazoom.jl.player.advanced.jlap.InfoListener +
  +
playbackFinished(PlaybackEvent) - +Method in class javazoom.jl.player.advanced.PlaybackListener +
  +
PlaybackListener - Class in javazoom.jl.player.advanced
Listener for javalayer Player playback
PlaybackListener() - +Constructor for class javazoom.jl.player.advanced.PlaybackListener +
  +
playbackStarted(PlaybackEvent) - +Method in class javazoom.jl.player.advanced.jlap.InfoListener +
  +
playbackStarted(PlaybackEvent) - +Method in class javazoom.jl.player.advanced.PlaybackListener +
  +
Player - Class in javazoom.jl.player
The Player class implements a simple player for playback + of an MPEG audio stream.
Player(InputStream) - +Constructor for class javazoom.jl.player.Player +
Creates a new Player instance. +
Player(InputStream, AudioDevice) - +Constructor for class javazoom.jl.player.Player +
  +
PlayerApplet - Class in javazoom.jl.player
A simple applet that plays an MPEG audio file.
PlayerApplet() - +Constructor for class javazoom.jl.player.PlayerApplet +
  +
playMp3(File, PlaybackListener) - +Static method in class javazoom.jl.player.advanced.jlap +
  +
playMp3(File, int, int, PlaybackListener) - +Static method in class javazoom.jl.player.advanced.jlap +
  +
playMp3(InputStream, int, int, PlaybackListener) - +Static method in class javazoom.jl.player.advanced.jlap +
  +
printStackTrace() - +Method in exception javazoom.jl.decoder.JavaLayerException +
  +
printStackTrace(PrintStream) - +Method in exception javazoom.jl.decoder.JavaLayerException +
  +
+
+

+R

+
+
Read(byte[], int) - +Method in class javazoom.jl.converter.RiffFile +
Read NumBytes data. +
read(byte[], int, int) - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
read(byte[], int, int) - +Method in interface javazoom.jl.decoder.Source +
  +
readBits(int) - +Method in class javazoom.jl.decoder.Bitstream +
  +
readCheckedBits(int) - +Method in class javazoom.jl.decoder.Bitstream +
  +
readFrame(int, Header) - +Method in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
  +
readFrame(int, Header) - +Method in interface javazoom.jl.converter.Converter.ProgressListener +
This method is called after each frame has been read, + but before it has been decoded. +
readFrame() - +Method in class javazoom.jl.decoder.Bitstream +
Reads and parses the next frame from the input source. +
registerDefaultFactories() - +Method in class javazoom.jl.player.FactoryRegistry +
  +
removeAll() - +Method in class javazoom.jl.decoder.Manager +
  +
removeControl(Control) - +Method in class javazoom.jl.decoder.Manager +
  +
removeFactory(AudioDeviceFactory) - +Method in class javazoom.jl.player.FactoryRegistry +
  +
removeFactoryType(Class) - +Method in class javazoom.jl.player.FactoryRegistry +
  +
reset() - +Method in class javazoom.jl.decoder.Equalizer +
Sets all bands to 0.0 +
retrieveDecoder(Header, Bitstream, int) - +Method in class javazoom.jl.decoder.Decoder +
  +
RFM_READ - +Static variable in class javazoom.jl.converter.RiffFile +
  +
RFM_UNKNOWN - +Static variable in class javazoom.jl.converter.RiffFile +
  +
RFM_WRITE - +Static variable in class javazoom.jl.converter.RiffFile +
  +
RiffFile - Class in javazoom.jl.converter
Class to manage RIFF files
RiffFile() - +Constructor for class javazoom.jl.converter.RiffFile +
Dummy Constructor +
RIGHT - +Static variable in class javazoom.jl.decoder.OutputChannels +
  +
RIGHT_CHANNEL - +Static variable in class javazoom.jl.decoder.OutputChannels +
Flag to indicate output should include the right channel only. +
run() - +Method in class javazoom.jl.player.PlayerApplet +
The run method for the audio player thread. +
+
+

+S

+
+
sample_frequency() - +Method in class javazoom.jl.decoder.Header +
Returns Sample Frequency. +
sample_frequency_string() - +Method in class javazoom.jl.decoder.Header +
Returns Frequency +
SampleBuffer - Class in javazoom.jl.decoder
The SampleBuffer class implements an output buffer + that provides storage for a fixed size block of samples.
SampleBuffer(int, int) - +Constructor for class javazoom.jl.decoder.SampleBuffer +
Constructor +
SamplingRate() - +Method in class javazoom.jl.converter.WaveFile +
  +
Seek(long) - +Method in class javazoom.jl.converter.RiffFile +
Seek in the File. +
seek(long) - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
seek(long) - +Method in interface javazoom.jl.decoder.Source +
  +
serialize(OutputStream, Object) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
  +
set_stop_flag() - +Method in class javazoom.jl.converter.WaveFileObuffer +
  +
set_stop_flag() - +Method in class javazoom.jl.decoder.Obuffer +
Notify the buffer that the user has stopped the stream. +
set_stop_flag() - +Method in class javazoom.jl.decoder.SampleBuffer +
  +
setAudioFormat(AudioFormat) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
setBand(int, float) - +Method in class javazoom.jl.decoder.Equalizer +
  +
setEqualizer(Equalizer) - +Method in class javazoom.jl.decoder.Decoder +
  +
setFileName(String) - +Method in class javazoom.jl.player.PlayerApplet +
Sets the URL of the audio stream to play. +
setFrame(int) - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
setFrom(float[]) - +Method in class javazoom.jl.decoder.Equalizer +
  +
setFrom(Equalizer.EQFunction) - +Method in class javazoom.jl.decoder.Equalizer +
  +
setFrom(Equalizer) - +Method in class javazoom.jl.decoder.Equalizer +
Sets the bands of this equalizer to the value the bands of + another equalizer. +
setHook(JavaLayerHook) - +Static method in class javazoom.jl.decoder.JavaLayerUtils +
Sets the system-wide JavaLayer hook. +
setId(int) - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
setOpen(boolean) - +Method in class javazoom.jl.player.AudioDeviceBase +
Sets the open state for this audio device. +
setOutputBuffer(Obuffer) - +Method in class javazoom.jl.decoder.Decoder +
Changes the output buffer. +
setOutputChannels(OutputChannels) - +Method in class javazoom.jl.decoder.Decoder.Params +
  +
setPlayBackListener(PlaybackListener) - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
sets the PlaybackListener +
setPosition(double) - +Method in interface javazoom.jl.decoder.Control +
  +
setSource(AdvancedPlayer) - +Method in class javazoom.jl.player.advanced.PlaybackEvent +
  +
showUsage() - +Method in class javazoom.jl.player.advanced.jlap +
  +
showUsage() - +Method in class javazoom.jl.player.jlp +
  +
SINGLE_CHANNEL - +Static variable in class javazoom.jl.decoder.Header +
  +
skipFrame() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
skips over a single frame +
slots() - +Method in class javazoom.jl.decoder.Header +
Returns Slots. +
Source - Interface in javazoom.jl.decoder
Work in progress.
start() - +Method in interface javazoom.jl.decoder.Control +
Starts playback of the media presented by this control. +
start() - +Method in class javazoom.jl.player.PlayerApplet +
Starts this applet. +
STARTED - +Static variable in class javazoom.jl.player.advanced.PlaybackEvent +
  +
STEREO - +Static variable in class javazoom.jl.decoder.Header +
  +
stop() - +Method in interface javazoom.jl.decoder.Control +
Stops playback of the media presented by this control. +
stop() - +Method in class javazoom.jl.player.advanced.AdvancedPlayer +
closes the player and notifies PlaybackListener +
stop() - +Method in class javazoom.jl.player.PlayerApplet +
Stops this applet. +
STOPPED - +Static variable in class javazoom.jl.player.advanced.PlaybackEvent +
  +
stopPlayer() - +Method in class javazoom.jl.player.PlayerApplet +
Stops the audio player. +
STREAM_EOF - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
The end of the stream was reached. +
STREAM_ERROR - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
A problem occurred reading from the stream. +
systemRegistry() - +Static method in class javazoom.jl.player.FactoryRegistry +
  +
+
+

+T

+
+
tell() - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
tell() - +Method in interface javazoom.jl.decoder.Source +
  +
test() - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
Runs a short test by playing a short silent sound. +
testAudioDevice() - +Method in class javazoom.jl.player.JavaSoundAudioDeviceFactory +
  +
THIRTYTWO - +Static variable in class javazoom.jl.decoder.Header +
  +
toByteArray(short[], int, int) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
toString() - +Method in class javazoom.jl.decoder.Header +
  +
total_ms(int) - +Method in class javazoom.jl.decoder.Header +
Returns total ms. +
+
+

+U

+
+
UNEXPECTED_EOF - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
The end of the stream was reached prematurely. +
UNKNOWN_ERROR - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
An undeterminable error occurred. +
UNKNOWN_ERROR - +Static variable in interface javazoom.jl.decoder.DecoderErrors +
  +
UNKNOWN_SAMPLE_RATE - +Static variable in interface javazoom.jl.decoder.BitstreamErrors +
The header describes an unknown sample rate. +
unreadFrame() - +Method in class javazoom.jl.decoder.Bitstream +
Unreads the bytes read from the frame. +
UNSUPPORTED_LAYER - +Static variable in interface javazoom.jl.decoder.DecoderErrors +
Layer not supported by the decoder. +
UPDATE_CONVERT_COMPLETE - +Static variable in interface javazoom.jl.converter.Converter.ProgressListener +
Conversion is complete. +
UPDATE_FRAME_COUNT - +Static variable in interface javazoom.jl.converter.Converter.ProgressListener +
  +
+
+

+V

+
+
vbr() - +Method in class javazoom.jl.decoder.Header +
Return VBR. +
vbr_scale() - +Method in class javazoom.jl.decoder.Header +
Return VBR scale. +
vbr_toc() - +Method in class javazoom.jl.decoder.Header +
Return VBR TOC. +
VERBOSE_DETAIL - +Static variable in class javazoom.jl.converter.Converter.PrintWriterProgressListener +
Verbose detail. +
version() - +Method in class javazoom.jl.decoder.Header +
Returns version. +
version_string() - +Method in class javazoom.jl.decoder.Header +
Returns Version. +
+
+

+W

+
+
WaveFile - Class in javazoom.jl.converter
Class allowing WaveFormat Access
WaveFile() - +Constructor for class javazoom.jl.converter.WaveFile +
Constructs a new WaveFile instance. +
WaveFile.WaveFileSample - Class in javazoom.jl.converter
 
WaveFile.WaveFileSample() - +Constructor for class javazoom.jl.converter.WaveFile.WaveFileSample +
  +
WaveFileObuffer - Class in javazoom.jl.converter
Implements an Obuffer by writing the data to + a file in RIFF WAVE format.
WaveFileObuffer(int, int, String) - +Constructor for class javazoom.jl.converter.WaveFileObuffer +
Creates a new WareFileObuffer instance. +
willReadBlock() - +Method in class javazoom.jl.decoder.InputStreamSource +
  +
willReadBlock() - +Method in interface javazoom.jl.decoder.Source +
  +
Write(byte[], int) - +Method in class javazoom.jl.converter.RiffFile +
Write NumBytes data. +
Write(short[], int) - +Method in class javazoom.jl.converter.RiffFile +
Write NumBytes data. +
Write(RiffFile.RiffChunkHeader, int) - +Method in class javazoom.jl.converter.RiffFile +
Write NumBytes data. +
Write(short, int) - +Method in class javazoom.jl.converter.RiffFile +
Write NumBytes data. +
Write(int, int) - +Method in class javazoom.jl.converter.RiffFile +
Write NumBytes data. +
write(short[], int, int) - +Method in interface javazoom.jl.player.AudioDevice +
Writes a number of samples to this AudioDevice. +
write(short[], int, int) - +Method in class javazoom.jl.player.AudioDeviceBase +
Writes audio data to this audio device. +
write_buffer(int) - +Method in class javazoom.jl.converter.WaveFileObuffer +
  +
write_buffer(int) - +Method in class javazoom.jl.decoder.Obuffer +
Write the samples to the file or directly to the audio hardware. +
write_buffer(int) - +Method in class javazoom.jl.decoder.SampleBuffer +
Write the samples to the file (Random Acces). +
WriteData(short[], int) - +Method in class javazoom.jl.converter.WaveFile +
Write 16-bit audio +
writeImpl(short[], int, int) - +Method in class javazoom.jl.player.AudioDeviceBase +
Template method to provide the implementation for + writing audio samples to the audio device. +
writeImpl(short[], int, int) - +Method in class javazoom.jl.player.JavaSoundAudioDevice +
  +
+
+A B C D E F G H I J L M N O P R S T U V W + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..46ebcbf --- /dev/null +++ b/doc/index.html @@ -0,0 +1,39 @@ + + + + + + +Generated Documentation (Untitled) + + + + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="overview-summary.html">Non-frame version.</A> + + + diff --git a/doc/javazoom/jl/converter/Converter.PrintWriterProgressListener.html b/doc/javazoom/jl/converter/Converter.PrintWriterProgressListener.html new file mode 100644 index 0000000..2108ece --- /dev/null +++ b/doc/javazoom/jl/converter/Converter.PrintWriterProgressListener.html @@ -0,0 +1,568 @@ + + + + + + +Converter.PrintWriterProgressListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class Converter.PrintWriterProgressListener

+
+java.lang.Object
+  extended by javazoom.jl.converter.Converter.PrintWriterProgressListener
+
+
+
All Implemented Interfaces:
Converter.ProgressListener
+
+
+
Enclosing class:
Converter
+
+
+
+
public static class Converter.PrintWriterProgressListener
extends java.lang.Object
implements Converter.ProgressListener
+ + +

+Implementation of ProgressListener that writes + notification text to a PrintWriter. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static intDEBUG_DETAIL + +
+          Debug detail.
+static intEXPERT_DETAIL + +
+          Level of detail typically expected of expert + users.
+static intMAX_DETAIL + +
+           
+static intNO_DETAIL + +
+           
+static intVERBOSE_DETAIL + +
+          Verbose detail.
+ + + + + + + +
Fields inherited from interface javazoom.jl.converter.Converter.ProgressListener
UPDATE_CONVERT_COMPLETE, UPDATE_FRAME_COUNT
+  + + + + + + + + + + +
+Constructor Summary
Converter.PrintWriterProgressListener(java.io.PrintWriter writer, + int detailLevel) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ booleanconverterException(java.lang.Throwable t) + +
+          Called when an exception is thrown during while converting + a frame.
+ voidconverterUpdate(int updateID, + int param1, + int param2) + +
+          Notifies the listener that new information is available.
+ voiddecodedFrame(int frameNo, + Header header, + Obuffer o) + +
+          This method is called after a frame has been decoded.
+ booleanisDetail(int detail) + +
+           
+static Converter.PrintWriterProgressListenernewStdOut(int detail) + +
+           
+ voidparsedFrame(int frameNo, + Header header) + +
+          If the converter wishes to make a first pass over the + audio frames, this is called as each frame is parsed.
+ voidreadFrame(int frameNo, + Header header) + +
+          This method is called after each frame has been read, + but before it has been decoded.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+NO_DETAIL

+
+public static final int NO_DETAIL
+
+
+
See Also:
Constant Field Values
+
+
+ +

+EXPERT_DETAIL

+
+public static final int EXPERT_DETAIL
+
+
Level of detail typically expected of expert + users. +

+

+
See Also:
Constant Field Values
+
+
+ +

+VERBOSE_DETAIL

+
+public static final int VERBOSE_DETAIL
+
+
Verbose detail. +

+

+
See Also:
Constant Field Values
+
+
+ +

+DEBUG_DETAIL

+
+public static final int DEBUG_DETAIL
+
+
Debug detail. All frame read notifications are shown. +

+

+
See Also:
Constant Field Values
+
+
+ +

+MAX_DETAIL

+
+public static final int MAX_DETAIL
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+Converter.PrintWriterProgressListener

+
+public Converter.PrintWriterProgressListener(java.io.PrintWriter writer,
+                                             int detailLevel)
+
+
+ + + + + + + + +
+Method Detail
+ +

+newStdOut

+
+public static Converter.PrintWriterProgressListener newStdOut(int detail)
+
+
+
+
+
+
+
+
+
+ +

+isDetail

+
+public boolean isDetail(int detail)
+
+
+
+
+
+
+
+
+
+ +

+converterUpdate

+
+public void converterUpdate(int updateID,
+                            int param1,
+                            int param2)
+
+
Description copied from interface: Converter.ProgressListener
+
Notifies the listener that new information is available. +

+

+
Specified by:
converterUpdate in interface Converter.ProgressListener
+
+
+
Parameters:
updateID - Code indicating the information that has been + updated.
param1 - Parameter whose value depends upon the update code.
param2 - Parameter whose value depends upon the update code. + + The updateID parameter can take these values: + + UPDATE_FRAME_COUNT: param1 is the frame count, or -1 if not known. + UPDATE_CONVERT_COMPLETE: param1 is the conversion time, param2 + is the number of frames converted.
+
+
+
+ +

+parsedFrame

+
+public void parsedFrame(int frameNo,
+                        Header header)
+
+
Description copied from interface: Converter.ProgressListener
+
If the converter wishes to make a first pass over the + audio frames, this is called as each frame is parsed. +

+

+
Specified by:
parsedFrame in interface Converter.ProgressListener
+
+
+
+
+
+
+ +

+readFrame

+
+public void readFrame(int frameNo,
+                      Header header)
+
+
Description copied from interface: Converter.ProgressListener
+
This method is called after each frame has been read, + but before it has been decoded. +

+

+
Specified by:
readFrame in interface Converter.ProgressListener
+
+
+
Parameters:
frameNo - The 0-based sequence number of the frame.
header - The Header rerpesenting the frame just read.
+
+
+
+ +

+decodedFrame

+
+public void decodedFrame(int frameNo,
+                         Header header,
+                         Obuffer o)
+
+
Description copied from interface: Converter.ProgressListener
+
This method is called after a frame has been decoded. +

+

+
Specified by:
decodedFrame in interface Converter.ProgressListener
+
+
+
Parameters:
frameNo - The 0-based sequence number of the frame.
header - The Header rerpesenting the frame just read.
o - The Obuffer the deocded data was written to.
+
+
+
+ +

+converterException

+
+public boolean converterException(java.lang.Throwable t)
+
+
Description copied from interface: Converter.ProgressListener
+
Called when an exception is thrown during while converting + a frame. +

+

+
Specified by:
converterException in interface Converter.ProgressListener
+
+
+
Parameters:
t - The Throwable instance that + was thrown. +
Returns:
true to continue processing, or false + to abort conversion. + + If this method returns false, the exception + is propagated to the caller of the convert() method. If + true is returned, the exception is silently + ignored and the converter moves onto the next frame.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/Converter.ProgressListener.html b/doc/javazoom/jl/converter/Converter.ProgressListener.html new file mode 100644 index 0000000..591a096 --- /dev/null +++ b/doc/javazoom/jl/converter/Converter.ProgressListener.html @@ -0,0 +1,390 @@ + + + + + + +Converter.ProgressListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Interface Converter.ProgressListener

+
+
All Known Implementing Classes:
Converter.PrintWriterProgressListener
+
+
+
Enclosing class:
Converter
+
+
+
+
public static interface Converter.ProgressListener
+ + +

+This interface is used by the Converter to provide + notification of tasks being carried out by the converter, + and to provide new information as it becomes available. +

+ +

+


+ +

+ + + + + + + + + + + + + + + +
+Field Summary
+static intUPDATE_CONVERT_COMPLETE + +
+          Conversion is complete.
+static intUPDATE_FRAME_COUNT + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ booleanconverterException(java.lang.Throwable t) + +
+          Called when an exception is thrown during while converting + a frame.
+ voidconverterUpdate(int updateID, + int param1, + int param2) + +
+          Notifies the listener that new information is available.
+ voiddecodedFrame(int frameNo, + Header header, + Obuffer o) + +
+          This method is called after a frame has been decoded.
+ voidparsedFrame(int frameNo, + Header header) + +
+          If the converter wishes to make a first pass over the + audio frames, this is called as each frame is parsed.
+ voidreadFrame(int frameNo, + Header header) + +
+          This method is called after each frame has been read, + but before it has been decoded.
+  +

+ + + + + + + + +
+Field Detail
+ +

+UPDATE_FRAME_COUNT

+
+static final int UPDATE_FRAME_COUNT
+
+
+
See Also:
Constant Field Values
+
+
+ +

+UPDATE_CONVERT_COMPLETE

+
+static final int UPDATE_CONVERT_COMPLETE
+
+
Conversion is complete. Param1 contains the time + to convert in milliseconds. Param2 contains the number + of MPEG audio frames converted. +

+

+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Method Detail
+ +

+converterUpdate

+
+void converterUpdate(int updateID,
+                     int param1,
+                     int param2)
+
+
Notifies the listener that new information is available. +

+

+
Parameters:
updateID - Code indicating the information that has been + updated.
param1 - Parameter whose value depends upon the update code.
param2 - Parameter whose value depends upon the update code. + + The updateID parameter can take these values: + + UPDATE_FRAME_COUNT: param1 is the frame count, or -1 if not known. + UPDATE_CONVERT_COMPLETE: param1 is the conversion time, param2 + is the number of frames converted.
+
+
+
+ +

+parsedFrame

+
+void parsedFrame(int frameNo,
+                 Header header)
+
+
If the converter wishes to make a first pass over the + audio frames, this is called as each frame is parsed. +

+

+
+
+
+
+ +

+readFrame

+
+void readFrame(int frameNo,
+               Header header)
+
+
This method is called after each frame has been read, + but before it has been decoded. +

+

+
Parameters:
frameNo - The 0-based sequence number of the frame.
header - The Header rerpesenting the frame just read.
+
+
+
+ +

+decodedFrame

+
+void decodedFrame(int frameNo,
+                  Header header,
+                  Obuffer o)
+
+
This method is called after a frame has been decoded. +

+

+
Parameters:
frameNo - The 0-based sequence number of the frame.
header - The Header rerpesenting the frame just read.
o - The Obuffer the deocded data was written to.
+
+
+
+ +

+converterException

+
+boolean converterException(java.lang.Throwable t)
+
+
Called when an exception is thrown during while converting + a frame. +

+

+
Parameters:
t - The Throwable instance that + was thrown. +
Returns:
true to continue processing, or false + to abort conversion. + + If this method returns false, the exception + is propagated to the caller of the convert() method. If + true is returned, the exception is silently + ignored and the converter moves onto the next frame.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/Converter.html b/doc/javazoom/jl/converter/Converter.html new file mode 100644 index 0000000..162093f --- /dev/null +++ b/doc/javazoom/jl/converter/Converter.html @@ -0,0 +1,418 @@ + + + + + + +Converter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class Converter

+
+java.lang.Object
+  extended by javazoom.jl.converter.Converter
+
+
+
+
public class Converter
extends java.lang.Object
+ + +

+The Converter class implements the conversion of + an MPEG audio file to a .WAV file. To convert an MPEG audio stream, + just create an instance of this class and call the convert() + method, passing in the names of the input and output files. You can + pass in optional ProgressListener and + Decoder.Params objects also to customize the conversion. +

+ +

+

+
Since:
+
0.0.7
+
+
+ +

+ + + + + + + + + + + + + + + +
+Nested Class Summary
+static classConverter.PrintWriterProgressListener + +
+          Implementation of ProgressListener that writes + notification text to a PrintWriter.
+static interfaceConverter.ProgressListener + +
+          This interface is used by the Converter to provide + notification of tasks being carried out by the converter, + and to provide new information as it becomes available.
+  + + + + + + + + + + +
+Constructor Summary
Converter() + +
+          Creates a new converter instance.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidconvert(java.io.InputStream sourceStream, + java.lang.String destName, + Converter.ProgressListener progressListener, + Decoder.Params decoderParams) + +
+           
+ voidconvert(java.lang.String sourceName, + java.lang.String destName) + +
+           
+ voidconvert(java.lang.String sourceName, + java.lang.String destName, + Converter.ProgressListener progressListener) + +
+           
+ voidconvert(java.lang.String sourceName, + java.lang.String destName, + Converter.ProgressListener progressListener, + Decoder.Params decoderParams) + +
+           
+protected  intcountFrames(java.io.InputStream in) + +
+           
+protected  java.io.InputStreamopenInput(java.lang.String fileName) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Converter

+
+public Converter()
+
+
Creates a new converter instance. +

+

+ + + + + + + + +
+Method Detail
+ +

+convert

+
+public void convert(java.lang.String sourceName,
+                    java.lang.String destName)
+             throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+convert

+
+public void convert(java.lang.String sourceName,
+                    java.lang.String destName,
+                    Converter.ProgressListener progressListener)
+             throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+convert

+
+public void convert(java.lang.String sourceName,
+                    java.lang.String destName,
+                    Converter.ProgressListener progressListener,
+                    Decoder.Params decoderParams)
+             throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+convert

+
+public void convert(java.io.InputStream sourceStream,
+                    java.lang.String destName,
+                    Converter.ProgressListener progressListener,
+                    Decoder.Params decoderParams)
+             throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+countFrames

+
+protected int countFrames(java.io.InputStream in)
+
+
+
+
+
+
+ +

+openInput

+
+protected java.io.InputStream openInput(java.lang.String fileName)
+                                 throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/RiffFile.html b/doc/javazoom/jl/converter/RiffFile.html new file mode 100644 index 0000000..c9b09d4 --- /dev/null +++ b/doc/javazoom/jl/converter/RiffFile.html @@ -0,0 +1,809 @@ + + + + + + +RiffFile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class RiffFile

+
+java.lang.Object
+  extended by javazoom.jl.converter.RiffFile
+
+
+
Direct Known Subclasses:
WaveFile
+
+
+
+
public class RiffFile
extends java.lang.Object
+ + +

+Class to manage RIFF files +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static intDDC_FAILURE + +
+           
+static intDDC_FILE_ERROR + +
+           
+static intDDC_INVALID_CALL + +
+           
+static intDDC_INVALID_FILE + +
+           
+static intDDC_OUT_OF_MEMORY + +
+           
+static intDDC_SUCCESS + +
+           
+static intDDC_USER_ABORT + +
+           
+protected  java.io.RandomAccessFilefile + +
+           
+protected  intfmode + +
+           
+static intRFM_READ + +
+           
+static intRFM_UNKNOWN + +
+           
+static intRFM_WRITE + +
+           
+  + + + + + + + + + + +
+Constructor Summary
RiffFile() + +
+          Dummy Constructor
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ intBackpatch(long FileOffset, + byte[] Data, + int NumBytes) + +
+           
+ intBackpatch(long FileOffset, + javazoom.jl.converter.RiffFile.RiffChunkHeader Data, + int NumBytes) + +
+          Write Data to specified offset.
+ intClose() + +
+          Close Riff File.
+ intCurrentFileMode() + +
+          Return File Mode.
+ longCurrentFilePosition() + +
+          Return File Position.
+ intExpect(java.lang.String Data, + int NumBytes) + +
+          Expect NumBytes data.
+static intFourCC(java.lang.String ChunkName) + +
+          Fill the header.
+ intOpen(java.lang.String Filename, + int NewMode) + +
+          Open a RIFF file.
+ intRead(byte[] Data, + int NumBytes) + +
+          Read NumBytes data.
+protected  intSeek(long offset) + +
+          Seek in the File.
+ intWrite(byte[] Data, + int NumBytes) + +
+          Write NumBytes data.
+ intWrite(int Data, + int NumBytes) + +
+          Write NumBytes data.
+ intWrite(javazoom.jl.converter.RiffFile.RiffChunkHeader Triff_header, + int NumBytes) + +
+          Write NumBytes data.
+ intWrite(short[] Data, + int NumBytes) + +
+          Write NumBytes data.
+ intWrite(short Data, + int NumBytes) + +
+          Write NumBytes data.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+DDC_SUCCESS

+
+public static final int DDC_SUCCESS
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_FAILURE

+
+public static final int DDC_FAILURE
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_OUT_OF_MEMORY

+
+public static final int DDC_OUT_OF_MEMORY
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_FILE_ERROR

+
+public static final int DDC_FILE_ERROR
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_INVALID_CALL

+
+public static final int DDC_INVALID_CALL
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_USER_ABORT

+
+public static final int DDC_USER_ABORT
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DDC_INVALID_FILE

+
+public static final int DDC_INVALID_FILE
+
+
+
See Also:
Constant Field Values
+
+
+ +

+RFM_UNKNOWN

+
+public static final int RFM_UNKNOWN
+
+
+
See Also:
Constant Field Values
+
+
+ +

+RFM_WRITE

+
+public static final int RFM_WRITE
+
+
+
See Also:
Constant Field Values
+
+
+ +

+RFM_READ

+
+public static final int RFM_READ
+
+
+
See Also:
Constant Field Values
+
+
+ +

+fmode

+
+protected int fmode
+
+
+
+
+
+ +

+file

+
+protected java.io.RandomAccessFile file
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+RiffFile

+
+public RiffFile()
+
+
Dummy Constructor +

+

+ + + + + + + + +
+Method Detail
+ +

+CurrentFileMode

+
+public int CurrentFileMode()
+
+
Return File Mode. +

+

+
+
+
+
+ +

+Open

+
+public int Open(java.lang.String Filename,
+                int NewMode)
+
+
Open a RIFF file. +

+

+
+
+
+
+ +

+Write

+
+public int Write(byte[] Data,
+                 int NumBytes)
+
+
Write NumBytes data. +

+

+
+
+
+
+ +

+Write

+
+public int Write(short[] Data,
+                 int NumBytes)
+
+
Write NumBytes data. +

+

+
+
+
+
+ +

+Write

+
+public int Write(javazoom.jl.converter.RiffFile.RiffChunkHeader Triff_header,
+                 int NumBytes)
+
+
Write NumBytes data. +

+

+
+
+
+
+ +

+Write

+
+public int Write(short Data,
+                 int NumBytes)
+
+
Write NumBytes data. +

+

+
+
+
+
+ +

+Write

+
+public int Write(int Data,
+                 int NumBytes)
+
+
Write NumBytes data. +

+

+
+
+
+
+ +

+Read

+
+public int Read(byte[] Data,
+                int NumBytes)
+
+
Read NumBytes data. +

+

+
+
+
+
+ +

+Expect

+
+public int Expect(java.lang.String Data,
+                  int NumBytes)
+
+
Expect NumBytes data. +

+

+
+
+
+
+ +

+Close

+
+public int Close()
+
+
Close Riff File. + Length is written too. +

+

+
+
+
+
+ +

+CurrentFilePosition

+
+public long CurrentFilePosition()
+
+
Return File Position. +

+

+
+
+
+
+ +

+Backpatch

+
+public int Backpatch(long FileOffset,
+                     javazoom.jl.converter.RiffFile.RiffChunkHeader Data,
+                     int NumBytes)
+
+
Write Data to specified offset. +

+

+
+
+
+
+ +

+Backpatch

+
+public int Backpatch(long FileOffset,
+                     byte[] Data,
+                     int NumBytes)
+
+
+
+
+
+
+ +

+Seek

+
+protected int Seek(long offset)
+
+
Seek in the File. +

+

+
+
+
+
+ +

+FourCC

+
+public static int FourCC(java.lang.String ChunkName)
+
+
Fill the header. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/WaveFile.WaveFileSample.html b/doc/javazoom/jl/converter/WaveFile.WaveFileSample.html new file mode 100644 index 0000000..d46f87a --- /dev/null +++ b/doc/javazoom/jl/converter/WaveFile.WaveFileSample.html @@ -0,0 +1,258 @@ + + + + + + +WaveFile.WaveFileSample + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class WaveFile.WaveFileSample

+
+java.lang.Object
+  extended by javazoom.jl.converter.WaveFile.WaveFileSample
+
+
+
Enclosing class:
WaveFile
+
+
+
+
public class WaveFile.WaveFileSample
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + +
+Field Summary
+ short[]chan + +
+           
+  + + + + + + + + + + +
+Constructor Summary
WaveFile.WaveFileSample() + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+chan

+
+public short[] chan
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+WaveFile.WaveFileSample

+
+public WaveFile.WaveFileSample()
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/WaveFile.html b/doc/javazoom/jl/converter/WaveFile.html new file mode 100644 index 0000000..ea4628e --- /dev/null +++ b/doc/javazoom/jl/converter/WaveFile.html @@ -0,0 +1,504 @@ + + + + + + +WaveFile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class WaveFile

+
+java.lang.Object
+  extended by javazoom.jl.converter.RiffFile
+      extended by javazoom.jl.converter.WaveFile
+
+
+
+
public class WaveFile
extends RiffFile
+ + +

+Class allowing WaveFormat Access +

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+ classWaveFile.WaveFileSample + +
+           
+ + + + + + + + + + +
+Field Summary
+static intMAX_WAVE_CHANNELS + +
+           
+ + + + + + + +
Fields inherited from class javazoom.jl.converter.RiffFile
DDC_FAILURE, DDC_FILE_ERROR, DDC_INVALID_CALL, DDC_INVALID_FILE, DDC_OUT_OF_MEMORY, DDC_SUCCESS, DDC_USER_ABORT, file, fmode, RFM_READ, RFM_UNKNOWN, RFM_WRITE
+  + + + + + + + + + + +
+Constructor Summary
WaveFile() + +
+          Constructs a new WaveFile instance.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ shortBitsPerSample() + +
+           
+ intClose() + +
+          Close Riff File.
+ longCurrentFilePosition() + +
+          Return File Position.
+ shortNumChannels() + +
+           
+ intNumSamples() + +
+           
+ intOpenForWrite(java.lang.String Filename, + int SamplingRate, + short BitsPerSample, + short NumChannels) + +
+           
+ intOpenForWrite(java.lang.String Filename, + WaveFile OtherWave) + +
+          Open for write using another wave file's parameters...
+ intSamplingRate() + +
+           
+ intWriteData(short[] data, + int numData) + +
+          Write 16-bit audio
+ + + + + + + +
Methods inherited from class javazoom.jl.converter.RiffFile
Backpatch, Backpatch, CurrentFileMode, Expect, FourCC, Open, Read, Seek, Write, Write, Write, Write, Write
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+MAX_WAVE_CHANNELS

+
+public static final int MAX_WAVE_CHANNELS
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+WaveFile

+
+public WaveFile()
+
+
Constructs a new WaveFile instance. +

+

+ + + + + + + + +
+Method Detail
+ +

+OpenForWrite

+
+public int OpenForWrite(java.lang.String Filename,
+                        int SamplingRate,
+                        short BitsPerSample,
+                        short NumChannels)
+
+
+
+
+
+
+ +

+WriteData

+
+public int WriteData(short[] data,
+                     int numData)
+
+
Write 16-bit audio +

+

+
+
+
+
+ +

+Close

+
+public int Close()
+
+
Description copied from class: RiffFile
+
Close Riff File. + Length is written too. +

+

+
Overrides:
Close in class RiffFile
+
+
+
+
+
+
+ +

+SamplingRate

+
+public int SamplingRate()
+
+
+
+
+
+
+ +

+BitsPerSample

+
+public short BitsPerSample()
+
+
+
+
+
+
+ +

+NumChannels

+
+public short NumChannels()
+
+
+
+
+
+
+ +

+NumSamples

+
+public int NumSamples()
+
+
+
+
+
+
+ +

+OpenForWrite

+
+public int OpenForWrite(java.lang.String Filename,
+                        WaveFile OtherWave)
+
+
Open for write using another wave file's parameters... +

+

+
+
+
+
+ +

+CurrentFilePosition

+
+public long CurrentFilePosition()
+
+
Description copied from class: RiffFile
+
Return File Position. +

+

+
Overrides:
CurrentFilePosition in class RiffFile
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/WaveFileObuffer.html b/doc/javazoom/jl/converter/WaveFileObuffer.html new file mode 100644 index 0000000..200134d --- /dev/null +++ b/doc/javazoom/jl/converter/WaveFileObuffer.html @@ -0,0 +1,397 @@ + + + + + + +WaveFileObuffer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class WaveFileObuffer

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Obuffer
+      extended by javazoom.jl.converter.WaveFileObuffer
+
+
+
+
public class WaveFileObuffer
extends Obuffer
+ + +

+Implements an Obuffer by writing the data to + a file in RIFF WAVE format. +

+ +

+

+
Since:
+
0.0
+
+
+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from class javazoom.jl.decoder.Obuffer
MAXCHANNELS, OBUFFERSIZE
+  + + + + + + + + + + +
+Constructor Summary
WaveFileObuffer(int number_of_channels, + int freq, + java.lang.String FileName) + +
+          Creates a new WareFileObuffer instance.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidappend(int channel, + short value) + +
+          Takes a 16 Bit PCM sample.
+ voidclear_buffer() + +
+          Clears all data in the buffer (for seeking).
+ voidclose() + +
+           
+ voidset_stop_flag() + +
+          Notify the buffer that the user has stopped the stream.
+ voidwrite_buffer(int val) + +
+          Write the samples to the file or directly to the audio hardware.
+ + + + + + + +
Methods inherited from class javazoom.jl.decoder.Obuffer
appendSamples
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+WaveFileObuffer

+
+public WaveFileObuffer(int number_of_channels,
+                       int freq,
+                       java.lang.String FileName)
+
+
Creates a new WareFileObuffer instance. +

+

+
Parameters:
number_of_channels - The number of channels of audio data + this buffer will receive.
freq - The sample frequency of the samples in the buffer.
fileName - The filename to write the data to.
+
+ + + + + + + + +
+Method Detail
+ +

+append

+
+public void append(int channel,
+                   short value)
+
+
Takes a 16 Bit PCM sample. +

+

+
Specified by:
append in class Obuffer
+
+
+
+
+
+
+ +

+write_buffer

+
+public void write_buffer(int val)
+
+
Description copied from class: Obuffer
+
Write the samples to the file or directly to the audio hardware. +

+

+
Specified by:
write_buffer in class Obuffer
+
+
+
+
+
+
+ +

+close

+
+public void close()
+
+
+
Specified by:
close in class Obuffer
+
+
+
+
+
+
+ +

+clear_buffer

+
+public void clear_buffer()
+
+
Description copied from class: Obuffer
+
Clears all data in the buffer (for seeking). +

+

+
Specified by:
clear_buffer in class Obuffer
+
+
+
+
+
+
+ +

+set_stop_flag

+
+public void set_stop_flag()
+
+
Description copied from class: Obuffer
+
Notify the buffer that the user has stopped the stream. +

+

+
Specified by:
set_stop_flag in class Obuffer
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/jlc.html b/doc/javazoom/jl/converter/jlc.html new file mode 100644 index 0000000..67ddbf2 --- /dev/null +++ b/doc/javazoom/jl/converter/jlc.html @@ -0,0 +1,256 @@ + + + + + + +jlc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.converter +
+Class jlc

+
+java.lang.Object
+  extended by javazoom.jl.converter.jlc
+
+
+
+
public class jlc
extends java.lang.Object
+ + +

+The jlc class presents the JavaLayer + Conversion functionality as a command-line program. +

+ +

+

+
Since:
+
0.0.7
+
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
jlc() + +
+           
+  + + + + + + + + + + + +
+Method Summary
+static voidmain(java.lang.String[] args) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+jlc

+
+public jlc()
+
+
+ + + + + + + + +
+Method Detail
+ +

+main

+
+public static void main(java.lang.String[] args)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/package-frame.html b/doc/javazoom/jl/converter/package-frame.html new file mode 100644 index 0000000..4bfc943 --- /dev/null +++ b/doc/javazoom/jl/converter/package-frame.html @@ -0,0 +1,53 @@ + + + + + + +javazoom.jl.converter + + + + + + + + + + + +javazoom.jl.converter + + + + +
+Interfaces  + +
+Converter.ProgressListener
+ + + + + + +
+Classes  + +
+Converter +
+Converter.PrintWriterProgressListener +
+jlc +
+RiffFile +
+WaveFile +
+WaveFileObuffer
+ + + + diff --git a/doc/javazoom/jl/converter/package-summary.html b/doc/javazoom/jl/converter/package-summary.html new file mode 100644 index 0000000..9bc73a4 --- /dev/null +++ b/doc/javazoom/jl/converter/package-summary.html @@ -0,0 +1,192 @@ + + + + + + +javazoom.jl.converter + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package javazoom.jl.converter +

+ + + + + + + + + +
+Interface Summary
Converter.ProgressListenerThis interface is used by the Converter to provide + notification of tasks being carried out by the converter, + and to provide new information as it becomes available.
+  + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class Summary
ConverterThe Converter class implements the conversion of + an MPEG audio file to a .WAV file.
Converter.PrintWriterProgressListenerImplementation of ProgressListener that writes + notification text to a PrintWriter.
jlcThe jlc class presents the JavaLayer + Conversion functionality as a command-line program.
RiffFileClass to manage RIFF files
WaveFileClass allowing WaveFormat Access
WaveFileObufferImplements an Obuffer by writing the data to + a file in RIFF WAVE format.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/converter/package-tree.html b/doc/javazoom/jl/converter/package-tree.html new file mode 100644 index 0000000..b2b5e68 --- /dev/null +++ b/doc/javazoom/jl/converter/package-tree.html @@ -0,0 +1,157 @@ + + + + + + +javazoom.jl.converter Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package javazoom.jl.converter +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Bitstream.html b/doc/javazoom/jl/decoder/Bitstream.html new file mode 100644 index 0000000..6a4ce40 --- /dev/null +++ b/doc/javazoom/jl/decoder/Bitstream.html @@ -0,0 +1,601 @@ + + + + + + +Bitstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Bitstream

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Bitstream
+
+
+
All Implemented Interfaces:
BitstreamErrors, JavaLayerErrors
+
+
+
+
public final class Bitstream
extends java.lang.Object
implements BitstreamErrors
+ + +

+The Bistream class is responsible for parsing + an MPEG audio bitstream. + + REVIEW: much of the parsing currently occurs in the + various decoders. This should be moved into this class and associated + inner classes. +

+ +

+


+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.BitstreamErrors
BITSTREAM_LAST, INVALIDFRAME, STREAM_EOF, STREAM_ERROR, UNEXPECTED_EOF, UNKNOWN_ERROR, UNKNOWN_SAMPLE_RATE
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  + + + + + + + + + + +
+Constructor Summary
Bitstream(java.io.InputStream in) + +
+          Construct a IBitstream that reads data from a + given InputStream.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+          Close the Bitstream.
+ voidcloseFrame() + +
+          Close MP3 frame.
+ intget_bits(int number_of_bits) + +
+          Read bits from buffer into the lower bits of an unsigned int.
+ java.io.InputStreamgetRawID3v2() + +
+          Return raw ID3v2 frames + header.
+ intheader_pos() + +
+          Return position of the first audio header.
+ booleanisSyncCurrentPosition(int syncmode) + +
+          Determines if the next 4 bytes of the stream represent a + frame header.
+ booleanisSyncMark(int headerstring, + int syncmode, + int word) + +
+           
+protected  BitstreamExceptionnewBitstreamException(int errorcode) + +
+           
+protected  BitstreamExceptionnewBitstreamException(int errorcode, + java.lang.Throwable throwable) + +
+           
+ intreadBits(int n) + +
+           
+ intreadCheckedBits(int n) + +
+           
+ HeaderreadFrame() + +
+          Reads and parses the next frame from the input source.
+ voidunreadFrame() + +
+          Unreads the bytes read from the frame.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Bitstream

+
+public Bitstream(java.io.InputStream in)
+
+
Construct a IBitstream that reads data from a + given InputStream. +

+

+
Parameters:
in - The InputStream to read from.
+
+ + + + + + + + +
+Method Detail
+ +

+header_pos

+
+public int header_pos()
+
+
Return position of the first audio header. +

+

+
+
+
+ +
Returns:
size of ID3v2 tag frames.
+
+
+
+ +

+getRawID3v2

+
+public java.io.InputStream getRawID3v2()
+
+
Return raw ID3v2 frames + header. +

+

+
+
+
+ +
Returns:
ID3v2 InputStream or null if ID3v2 frames are not available.
+
+
+
+ +

+close

+
+public void close()
+           throws BitstreamException
+
+
Close the Bitstream. +

+

+
+
+
+ +
Throws: +
BitstreamException
+
+
+
+ +

+readFrame

+
+public Header readFrame()
+                 throws BitstreamException
+
+
Reads and parses the next frame from the input source. +

+

+
+
+
+ +
Returns:
the Header describing details of the frame read, + or null if the end of the stream has been reached. +
Throws: +
BitstreamException
+
+
+
+ +

+unreadFrame

+
+public void unreadFrame()
+                 throws BitstreamException
+
+
Unreads the bytes read from the frame. +

+

+
+
+
+ +
Throws: +
BitstreamException
+
+
+
+ +

+closeFrame

+
+public void closeFrame()
+
+
Close MP3 frame. +

+

+
+
+
+
+
+
+
+ +

+isSyncCurrentPosition

+
+public boolean isSyncCurrentPosition(int syncmode)
+                              throws BitstreamException
+
+
Determines if the next 4 bytes of the stream represent a + frame header. +

+

+
+
+
+ +
Throws: +
BitstreamException
+
+
+
+ +

+readBits

+
+public int readBits(int n)
+
+
+
+
+
+
+
+
+
+ +

+readCheckedBits

+
+public int readCheckedBits(int n)
+
+
+
+
+
+
+
+
+
+ +

+newBitstreamException

+
+protected BitstreamException newBitstreamException(int errorcode)
+
+
+
+
+
+
+
+
+
+ +

+newBitstreamException

+
+protected BitstreamException newBitstreamException(int errorcode,
+                                                   java.lang.Throwable throwable)
+
+
+
+
+
+
+
+
+
+ +

+isSyncMark

+
+public boolean isSyncMark(int headerstring,
+                          int syncmode,
+                          int word)
+
+
+
+
+
+
+
+
+
+ +

+get_bits

+
+public int get_bits(int number_of_bits)
+
+
Read bits from buffer into the lower bits of an unsigned int. + The LSB contains the latest read bit of the stream. + (1 <= number_of_bits <= 16) +

+

+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/BitstreamErrors.html b/doc/javazoom/jl/decoder/BitstreamErrors.html new file mode 100644 index 0000000..0e08363 --- /dev/null +++ b/doc/javazoom/jl/decoder/BitstreamErrors.html @@ -0,0 +1,343 @@ + + + + + + +BitstreamErrors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface BitstreamErrors

+
+
All Superinterfaces:
JavaLayerErrors
+
+
+
All Known Implementing Classes:
Bitstream, BitstreamException
+
+
+
+
public interface BitstreamErrors
extends JavaLayerErrors
+ + +

+This interface describes all error codes that can be thrown + in BistreamExceptions. +

+ +

+

+
Since:
+
0.0.6
+
See Also:
BitstreamException
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static intBITSTREAM_LAST + +
+           
+static intINVALIDFRAME + +
+          Frame data are missing.
+static intSTREAM_EOF + +
+          The end of the stream was reached.
+static intSTREAM_ERROR + +
+          A problem occurred reading from the stream.
+static intUNEXPECTED_EOF + +
+          The end of the stream was reached prematurely.
+static intUNKNOWN_ERROR + +
+          An undeterminable error occurred.
+static intUNKNOWN_SAMPLE_RATE + +
+          The header describes an unknown sample rate.
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  +

+ + + + + + + + +
+Field Detail
+ +

+UNKNOWN_ERROR

+
+static final int UNKNOWN_ERROR
+
+
An undeterminable error occurred. +

+

+
See Also:
Constant Field Values
+
+
+ +

+UNKNOWN_SAMPLE_RATE

+
+static final int UNKNOWN_SAMPLE_RATE
+
+
The header describes an unknown sample rate. +

+

+
See Also:
Constant Field Values
+
+
+ +

+STREAM_ERROR

+
+static final int STREAM_ERROR
+
+
A problem occurred reading from the stream. +

+

+
See Also:
Constant Field Values
+
+
+ +

+UNEXPECTED_EOF

+
+static final int UNEXPECTED_EOF
+
+
The end of the stream was reached prematurely. +

+

+
See Also:
Constant Field Values
+
+
+ +

+STREAM_EOF

+
+static final int STREAM_EOF
+
+
The end of the stream was reached. +

+

+
See Also:
Constant Field Values
+
+
+ +

+INVALIDFRAME

+
+static final int INVALIDFRAME
+
+
Frame data are missing. +

+

+
See Also:
Constant Field Values
+
+
+ +

+BITSTREAM_LAST

+
+static final int BITSTREAM_LAST
+
+
+
See Also:
Constant Field Values
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/BitstreamException.html b/doc/javazoom/jl/decoder/BitstreamException.html new file mode 100644 index 0000000..29be600 --- /dev/null +++ b/doc/javazoom/jl/decoder/BitstreamException.html @@ -0,0 +1,359 @@ + + + + + + +BitstreamException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class BitstreamException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by javazoom.jl.decoder.JavaLayerException
+              extended by javazoom.jl.decoder.BitstreamException
+
+
+
All Implemented Interfaces:
java.io.Serializable, BitstreamErrors, JavaLayerErrors
+
+
+
+
public class BitstreamException
extends JavaLayerException
implements BitstreamErrors
+ + +

+Instances of BitstreamException are thrown + when operations on a Bitstream fail. +

+ The exception provides details of the exception condition + in two ways: +

  1. + as an error-code describing the nature of the error +


  2. + as the Throwable instance, if any, that was thrown + indicating that an exceptional condition has occurred. +

+

+ +

+

+
Since:
+
0.0.6
+
See Also:
Serialized Form
+
+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.BitstreamErrors
BITSTREAM_LAST, INVALIDFRAME, STREAM_EOF, STREAM_ERROR, UNEXPECTED_EOF, UNKNOWN_ERROR, UNKNOWN_SAMPLE_RATE
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  + + + + + + + + + + + + + +
+Constructor Summary
BitstreamException(int errorcode, + java.lang.Throwable t) + +
+           
BitstreamException(java.lang.String msg, + java.lang.Throwable t) + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ intgetErrorCode() + +
+           
+static java.lang.StringgetErrorString(int errorcode) + +
+           
+ + + + + + + +
Methods inherited from class javazoom.jl.decoder.JavaLayerException
getException, printStackTrace, printStackTrace
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+BitstreamException

+
+public BitstreamException(java.lang.String msg,
+                          java.lang.Throwable t)
+
+
+
+ +

+BitstreamException

+
+public BitstreamException(int errorcode,
+                          java.lang.Throwable t)
+
+
+ + + + + + + + +
+Method Detail
+ +

+getErrorCode

+
+public int getErrorCode()
+
+
+
+
+
+
+
+
+
+ +

+getErrorString

+
+public static java.lang.String getErrorString(int errorcode)
+
+
+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Control.html b/doc/javazoom/jl/decoder/Control.html new file mode 100644 index 0000000..f457c6d --- /dev/null +++ b/doc/javazoom/jl/decoder/Control.html @@ -0,0 +1,325 @@ + + + + + + +Control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface Control

+
+
+
public interface Control
+ + +

+Work in progress. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ doublegetPosition() + +
+          Retrieves the current position.
+ booleanisPlaying() + +
+           
+ booleanisRandomAccess() + +
+           
+ voidpause() + +
+           
+ voidsetPosition(double d) + +
+           
+ voidstart() + +
+          Starts playback of the media presented by this control.
+ voidstop() + +
+          Stops playback of the media presented by this control.
+  +

+ + + + + + + + +
+Method Detail
+ +

+start

+
+void start()
+
+
Starts playback of the media presented by this control. +

+

+
+
+
+
+ +

+stop

+
+void stop()
+
+
Stops playback of the media presented by this control. +

+

+
+
+
+
+ +

+isPlaying

+
+boolean isPlaying()
+
+
+
+
+
+
+ +

+pause

+
+void pause()
+
+
+
+
+
+
+ +

+isRandomAccess

+
+boolean isRandomAccess()
+
+
+
+
+
+
+ +

+getPosition

+
+double getPosition()
+
+
Retrieves the current position. +

+

+
+
+
+
+ +

+setPosition

+
+void setPosition(double d)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Crc16.html b/doc/javazoom/jl/decoder/Crc16.html new file mode 100644 index 0000000..7a85bda --- /dev/null +++ b/doc/javazoom/jl/decoder/Crc16.html @@ -0,0 +1,279 @@ + + + + + + +Crc16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Crc16

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Crc16
+
+
+
+
public final class Crc16
extends java.lang.Object
+ + +

+16-Bit CRC checksum +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Crc16() + +
+          Dummy Constructor
+  + + + + + + + + + + + + + + + +
+Method Summary
+ voidadd_bits(int bitstring, + int length) + +
+          Feed a bitstring to the crc calculation (0 < length <= 32).
+ shortchecksum() + +
+          Return the calculated checksum.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Crc16

+
+public Crc16()
+
+
Dummy Constructor +

+

+ + + + + + + + +
+Method Detail
+ +

+add_bits

+
+public void add_bits(int bitstring,
+                     int length)
+
+
Feed a bitstring to the crc calculation (0 < length <= 32). +

+

+
+
+
+
+ +

+checksum

+
+public short checksum()
+
+
Return the calculated checksum. + Erase it for next calls to add_bits(). +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Decoder.Params.html b/doc/javazoom/jl/decoder/Decoder.Params.html new file mode 100644 index 0000000..22915e8 --- /dev/null +++ b/doc/javazoom/jl/decoder/Decoder.Params.html @@ -0,0 +1,342 @@ + + + + + + +Decoder.Params + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Decoder.Params

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Decoder.Params
+
+
+
All Implemented Interfaces:
java.lang.Cloneable
+
+
+
Enclosing class:
Decoder
+
+
+
+
public static class Decoder.Params
extends java.lang.Object
implements java.lang.Cloneable
+ + +

+The Params class presents the customizable + aspects of the decoder. +

+ Instances of this class are not thread safe. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Decoder.Params() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ java.lang.Objectclone() + +
+           
+ EqualizergetInitialEqualizerSettings() + +
+          Retrieves the equalizer settings that the decoder's equalizer + will be initialized from.
+ OutputChannelsgetOutputChannels() + +
+           
+ voidsetOutputChannels(OutputChannels out) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Decoder.Params

+
+public Decoder.Params()
+
+
+ + + + + + + + +
+Method Detail
+ +

+clone

+
+public java.lang.Object clone()
+
+
+
Overrides:
clone in class java.lang.Object
+
+
+
+
+
+
+ +

+setOutputChannels

+
+public void setOutputChannels(OutputChannels out)
+
+
+
+
+
+
+
+
+
+ +

+getOutputChannels

+
+public OutputChannels getOutputChannels()
+
+
+
+
+
+
+
+
+
+ +

+getInitialEqualizerSettings

+
+public Equalizer getInitialEqualizerSettings()
+
+
Retrieves the equalizer settings that the decoder's equalizer + will be initialized from. +

+ The Equalizer instance returned + cannot be changed in real time to affect the + decoder output as it is used only to initialize the decoders + EQ settings. To affect the decoder's output in realtime, + use the Equalizer returned from the getEqualizer() method on + the decoder. +

+

+
+
+
+ +
Returns:
The Equalizer used to initialize the + EQ settings of the decoder.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Decoder.html b/doc/javazoom/jl/decoder/Decoder.html new file mode 100644 index 0000000..cabfc58 --- /dev/null +++ b/doc/javazoom/jl/decoder/Decoder.html @@ -0,0 +1,575 @@ + + + + + + +Decoder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Decoder

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Decoder
+
+
+
All Implemented Interfaces:
DecoderErrors, JavaLayerErrors
+
+
+
+
public class Decoder
extends java.lang.Object
implements DecoderErrors
+ + +

+The Decoder class encapsulates the details of + decoding an MPEG audio frame. +

+ +

+

+
Since:
+
0.0.5
+
Version:
+
0.0.7 12/12/99
+
+
+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classDecoder.Params + +
+          The Params class presents the customizable + aspects of the decoder.
+ + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.DecoderErrors
ILLEGAL_SUBBAND_ALLOCATION, UNKNOWN_ERROR, UNSUPPORTED_LAYER
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  + + + + + + + + + + + + + +
+Constructor Summary
Decoder() + +
+          Creates a new Decoder instance with default + parameters.
Decoder(Decoder.Params params0) + +
+          Creates a new Decoder instance with default + parameters.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ ObufferdecodeFrame(Header header, + Bitstream stream) + +
+          Decodes one frame from an MPEG audio bitstream.
+static Decoder.ParamsgetDefaultParams() + +
+           
+ intgetOutputBlockSize() + +
+          Retrieves the maximum number of samples that will be written to + the output buffer when one frame is decoded.
+ intgetOutputChannels() + +
+          Retrieves the number of channels of PCM samples output by + this decoder.
+ intgetOutputFrequency() + +
+          Retrieves the sample frequency of the PCM samples output + by this decoder.
+protected  DecoderExceptionnewDecoderException(int errorcode) + +
+           
+protected  DecoderExceptionnewDecoderException(int errorcode, + java.lang.Throwable throwable) + +
+           
+protected  FrameDecoderretrieveDecoder(Header header, + Bitstream stream, + int layer) + +
+           
+ voidsetEqualizer(Equalizer eq) + +
+           
+ voidsetOutputBuffer(Obuffer out) + +
+          Changes the output buffer.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Decoder

+
+public Decoder()
+
+
Creates a new Decoder instance with default + parameters. +

+

+
+ +

+Decoder

+
+public Decoder(Decoder.Params params0)
+
+
Creates a new Decoder instance with default + parameters. +

+

+
Parameters:
params - The Params instance that describes + the customizable aspects of the decoder.
+
+ + + + + + + + +
+Method Detail
+ +

+getDefaultParams

+
+public static Decoder.Params getDefaultParams()
+
+
+
+
+
+
+
+
+
+ +

+setEqualizer

+
+public void setEqualizer(Equalizer eq)
+
+
+
+
+
+
+
+
+
+ +

+decodeFrame

+
+public Obuffer decodeFrame(Header header,
+                           Bitstream stream)
+                    throws DecoderException
+
+
Decodes one frame from an MPEG audio bitstream. +

+

+
+
+
+
Parameters:
header - The header describing the frame to decode.
bitstream - The bistream that provides the bits for te body of the frame. +
Returns:
A SampleBuffer containing the decoded samples. +
Throws: +
DecoderException
+
+
+
+ +

+setOutputBuffer

+
+public void setOutputBuffer(Obuffer out)
+
+
Changes the output buffer. This will take effect the next time + decodeFrame() is called. +

+

+
+
+
+
+
+
+
+ +

+getOutputFrequency

+
+public int getOutputFrequency()
+
+
Retrieves the sample frequency of the PCM samples output + by this decoder. This typically corresponds to the sample + rate encoded in the MPEG audio stream. +

+

+
+
+
+
Parameters:
the - sample rate (in Hz) of the samples written to the + output buffer when decoding.
+
+
+
+ +

+getOutputChannels

+
+public int getOutputChannels()
+
+
Retrieves the number of channels of PCM samples output by + this decoder. This usually corresponds to the number of + channels in the MPEG audio stream, although it may differ. +

+

+
+
+
+ +
Returns:
The number of output channels in the decoded samples: 1 + for mono, or 2 for stereo.
+
+
+
+ +

+getOutputBlockSize

+
+public int getOutputBlockSize()
+
+
Retrieves the maximum number of samples that will be written to + the output buffer when one frame is decoded. This can be used to + help calculate the size of other buffers whose size is based upon + the number of samples written to the output buffer. NB: this is + an upper bound and fewer samples may actually be written, depending + upon the sample rate and number of channels. +

+

+
+
+
+ +
Returns:
The maximum number of samples that are written to the + output buffer when decoding a single frame of MPEG audio.
+
+
+
+ +

+newDecoderException

+
+protected DecoderException newDecoderException(int errorcode)
+
+
+
+
+
+
+
+
+
+ +

+newDecoderException

+
+protected DecoderException newDecoderException(int errorcode,
+                                               java.lang.Throwable throwable)
+
+
+
+
+
+
+
+
+
+ +

+retrieveDecoder

+
+protected FrameDecoder retrieveDecoder(Header header,
+                                       Bitstream stream,
+                                       int layer)
+                                throws DecoderException
+
+
+
+
+
+ +
Throws: +
DecoderException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/DecoderErrors.html b/doc/javazoom/jl/decoder/DecoderErrors.html new file mode 100644 index 0000000..953a9a7 --- /dev/null +++ b/doc/javazoom/jl/decoder/DecoderErrors.html @@ -0,0 +1,259 @@ + + + + + + +DecoderErrors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface DecoderErrors

+
+
All Superinterfaces:
JavaLayerErrors
+
+
+
All Known Implementing Classes:
Decoder, DecoderException
+
+
+
+
public interface DecoderErrors
extends JavaLayerErrors
+ + +

+This interface provides constants describing the error + codes used by the Decoder to indicate errors. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + +
+Field Summary
+static intILLEGAL_SUBBAND_ALLOCATION + +
+          Illegal allocation in subband layer.
+static intUNKNOWN_ERROR + +
+           
+static intUNSUPPORTED_LAYER + +
+          Layer not supported by the decoder.
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  +

+ + + + + + + + +
+Field Detail
+ +

+UNKNOWN_ERROR

+
+static final int UNKNOWN_ERROR
+
+
+
See Also:
Constant Field Values
+
+
+ +

+UNSUPPORTED_LAYER

+
+static final int UNSUPPORTED_LAYER
+
+
Layer not supported by the decoder. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ILLEGAL_SUBBAND_ALLOCATION

+
+static final int ILLEGAL_SUBBAND_ALLOCATION
+
+
Illegal allocation in subband layer. Indicates a corrupt stream. +

+

+
See Also:
Constant Field Values
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/DecoderException.html b/doc/javazoom/jl/decoder/DecoderException.html new file mode 100644 index 0000000..afbc5fc --- /dev/null +++ b/doc/javazoom/jl/decoder/DecoderException.html @@ -0,0 +1,348 @@ + + + + + + +DecoderException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class DecoderException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by javazoom.jl.decoder.JavaLayerException
+              extended by javazoom.jl.decoder.DecoderException
+
+
+
All Implemented Interfaces:
java.io.Serializable, DecoderErrors, JavaLayerErrors
+
+
+
+
public class DecoderException
extends JavaLayerException
implements DecoderErrors
+ + +

+The DecoderException represents the class of + errors that can occur when decoding MPEG audio. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.DecoderErrors
ILLEGAL_SUBBAND_ALLOCATION, UNKNOWN_ERROR, UNSUPPORTED_LAYER
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.JavaLayerErrors
BITSTREAM_ERROR, DECODER_ERROR
+  + + + + + + + + + + + + + +
+Constructor Summary
DecoderException(int errorcode, + java.lang.Throwable t) + +
+           
DecoderException(java.lang.String msg, + java.lang.Throwable t) + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ intgetErrorCode() + +
+           
+static java.lang.StringgetErrorString(int errorcode) + +
+           
+ + + + + + + +
Methods inherited from class javazoom.jl.decoder.JavaLayerException
getException, printStackTrace, printStackTrace
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+DecoderException

+
+public DecoderException(java.lang.String msg,
+                        java.lang.Throwable t)
+
+
+
+ +

+DecoderException

+
+public DecoderException(int errorcode,
+                        java.lang.Throwable t)
+
+
+ + + + + + + + +
+Method Detail
+ +

+getErrorCode

+
+public int getErrorCode()
+
+
+
+
+
+
+
+
+
+ +

+getErrorString

+
+public static java.lang.String getErrorString(int errorcode)
+
+
+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Equalizer.EQFunction.html b/doc/javazoom/jl/decoder/Equalizer.EQFunction.html new file mode 100644 index 0000000..13a7b4e --- /dev/null +++ b/doc/javazoom/jl/decoder/Equalizer.EQFunction.html @@ -0,0 +1,255 @@ + + + + + + +Equalizer.EQFunction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Equalizer.EQFunction

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Equalizer.EQFunction
+
+
+
Enclosing class:
Equalizer
+
+
+
+
public abstract static class Equalizer.EQFunction
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Equalizer.EQFunction() + +
+           
+  + + + + + + + + + + + +
+Method Summary
+ floatgetBand(int band) + +
+          Returns the setting of a band in the equalizer.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Equalizer.EQFunction

+
+public Equalizer.EQFunction()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getBand

+
+public float getBand(int band)
+
+
Returns the setting of a band in the equalizer. +

+

+
Parameters:
band - The index of the band to retrieve the setting + for. +
Returns:
the setting of the specified band. This is a value between + -1 and +1.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Equalizer.html b/doc/javazoom/jl/decoder/Equalizer.html new file mode 100644 index 0000000..39bd1c8 --- /dev/null +++ b/doc/javazoom/jl/decoder/Equalizer.html @@ -0,0 +1,491 @@ + + + + + + +Equalizer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Equalizer

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Equalizer
+
+
+
+
public final class Equalizer
extends java.lang.Object
+ + +

+The Equalizer class can be used to specify + equalization settings for the MPEG audio decoder. +

+ The equalizer consists of 32 band-pass filters. + Each band of the equalizer can take on a fractional value between + -1.0 and +1.0. + At -1.0, the input signal is attenuated by 6dB, at +1.0 the signal is + amplified by 6dB. +

+ +

+

+
See Also:
Decoder
+
+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classEqualizer.EQFunction + +
+           
+ + + + + + + + + + + + + + +
+Field Summary
+static floatBAND_NOT_PRESENT + +
+          Equalizer setting to denote that a given band will not be + present in the output signal.
+static EqualizerPASS_THRU_EQ + +
+           
+  + + + + + + + + + + + + + + + + +
+Constructor Summary
Equalizer() + +
+          Creates a new Equalizer instance.
Equalizer(Equalizer.EQFunction eq) + +
+           
Equalizer(float[] settings) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ floatgetBand(int band) + +
+          Retrieves the eq setting for a given band.
+ intgetBandCount() + +
+          Retrieves the number of bands present in this equalizer.
+ voidreset() + +
+          Sets all bands to 0.0
+ floatsetBand(int band, + float neweq) + +
+           
+ voidsetFrom(Equalizer.EQFunction eq) + +
+           
+ voidsetFrom(Equalizer eq) + +
+          Sets the bands of this equalizer to the value the bands of + another equalizer.
+ voidsetFrom(float[] eq) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+BAND_NOT_PRESENT

+
+public static final float BAND_NOT_PRESENT
+
+
Equalizer setting to denote that a given band will not be + present in the output signal. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PASS_THRU_EQ

+
+public static final Equalizer PASS_THRU_EQ
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+Equalizer

+
+public Equalizer()
+
+
Creates a new Equalizer instance. +

+

+
+ +

+Equalizer

+
+public Equalizer(float[] settings)
+
+
+
+ +

+Equalizer

+
+public Equalizer(Equalizer.EQFunction eq)
+
+
+ + + + + + + + +
+Method Detail
+ +

+setFrom

+
+public void setFrom(float[] eq)
+
+
+
+
+
+
+ +

+setFrom

+
+public void setFrom(Equalizer.EQFunction eq)
+
+
+
+
+
+
+ +

+setFrom

+
+public void setFrom(Equalizer eq)
+
+
Sets the bands of this equalizer to the value the bands of + another equalizer. Bands that are not present in both equalizers are ignored. +

+

+
+
+
+
+ +

+reset

+
+public void reset()
+
+
Sets all bands to 0.0 +

+

+
+
+
+
+ +

+getBandCount

+
+public int getBandCount()
+
+
Retrieves the number of bands present in this equalizer. +

+

+
+
+
+
+ +

+setBand

+
+public float setBand(int band,
+                     float neweq)
+
+
+
+
+
+
+ +

+getBand

+
+public float getBand(int band)
+
+
Retrieves the eq setting for a given band. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/FrameDecoder.html b/doc/javazoom/jl/decoder/FrameDecoder.html new file mode 100644 index 0000000..d3f54dd --- /dev/null +++ b/doc/javazoom/jl/decoder/FrameDecoder.html @@ -0,0 +1,211 @@ + + + + + + +FrameDecoder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface FrameDecoder

+
+
+
public interface FrameDecoder
+ + +

+Implementations of FrameDecoder are responsible for decoding + an MPEG audio frame. +

+ +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ voiddecodeFrame() + +
+          Decodes one frame of MPEG audio.
+  +

+ + + + + + + + +
+Method Detail
+ +

+decodeFrame

+
+void decodeFrame()
+                 throws DecoderException
+
+
Decodes one frame of MPEG audio. +

+

+ +
Throws: +
DecoderException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Header.html b/doc/javazoom/jl/decoder/Header.html new file mode 100644 index 0000000..a922c16 --- /dev/null +++ b/doc/javazoom/jl/decoder/Header.html @@ -0,0 +1,1202 @@ + + + + + + +Header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Header

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Header
+
+
+
+
public final class Header
extends java.lang.Object
+ + +

+Class for extracting information from a frame header. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static java.lang.String[][][]bitrate_str + +
+           
+static int[][][]bitrates + +
+           
+ shortchecksum + +
+           
+static intDUAL_CHANNEL + +
+           
+static intFOURTYEIGHT + +
+           
+static intFOURTYFOUR_POINT_ONE + +
+           
+ intframesize + +
+           
+static int[][]frequencies + +
+           
+static intJOINT_STEREO + +
+           
+static intMPEG1 + +
+          Constant for MPEG-1 version
+static intMPEG2_LSF + +
+          Constant for MPEG-2 LSF version
+static intMPEG25_LSF + +
+           
+ intnSlots + +
+           
+static intSINGLE_CHANNEL + +
+           
+static intSTEREO + +
+           
+static intTHIRTYTWO + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ intbitrate_index() + +
+          Returns bitrate index.
+ intbitrate_instant() + +
+          Return Instant Bitrate.
+ java.lang.Stringbitrate_string() + +
+          Return Bitrate.
+ intbitrate() + +
+          Return Bitrate.
+ intcalculate_framesize() + +
+          Calculate Frame size.
+ booleanchecksum_ok() + +
+          Returns Checksum flag.
+ booleanchecksums() + +
+          Returns Protection bit.
+ booleancopyright() + +
+          Returns Copyright.
+ intfrequency() + +
+          Returns Frequency.
+ intgetSyncHeader() + +
+          Returns synchronized header.
+ intintensity_stereo_bound() + +
+          Returns Intensity Stereo.
+ java.lang.Stringlayer_string() + +
+          Return Layer version.
+ intlayer() + +
+          Returns Layer ID.
+ intmax_number_of_frames(int streamsize) + +
+          Returns the maximum number of frames in the stream.
+ intmin_number_of_frames(int streamsize) + +
+          Returns the maximum number of frames in the stream.
+ intmode_extension() + +
+          Returns Mode Extension.
+ java.lang.Stringmode_string() + +
+          Returns Mode.
+ intmode() + +
+          Returns Mode.
+ floatms_per_frame() + +
+          Returns ms/frame.
+ intnumber_of_subbands() + +
+          Returns the number of subbands in the current frame.
+ booleanoriginal() + +
+          Returns Original.
+ booleanpadding() + +
+          Returns Layer III Padding bit.
+ java.lang.Stringsample_frequency_string() + +
+          Returns Frequency
+ intsample_frequency() + +
+          Returns Sample Frequency.
+ intslots() + +
+          Returns Slots.
+ java.lang.StringtoString() + +
+           
+ floattotal_ms(int streamsize) + +
+          Returns total ms.
+ intvbr_scale() + +
+          Return VBR scale.
+ byte[]vbr_toc() + +
+          Return VBR TOC.
+ booleanvbr() + +
+          Return VBR.
+ java.lang.Stringversion_string() + +
+          Returns Version.
+ intversion() + +
+          Returns version.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+frequencies

+
+public static final int[][] frequencies
+
+
+
+
+
+ +

+MPEG2_LSF

+
+public static final int MPEG2_LSF
+
+
Constant for MPEG-2 LSF version +

+

+
See Also:
Constant Field Values
+
+
+ +

+MPEG25_LSF

+
+public static final int MPEG25_LSF
+
+
+
See Also:
Constant Field Values
+
+
+ +

+MPEG1

+
+public static final int MPEG1
+
+
Constant for MPEG-1 version +

+

+
See Also:
Constant Field Values
+
+
+ +

+STEREO

+
+public static final int STEREO
+
+
+
See Also:
Constant Field Values
+
+
+ +

+JOINT_STEREO

+
+public static final int JOINT_STEREO
+
+
+
See Also:
Constant Field Values
+
+
+ +

+DUAL_CHANNEL

+
+public static final int DUAL_CHANNEL
+
+
+
See Also:
Constant Field Values
+
+
+ +

+SINGLE_CHANNEL

+
+public static final int SINGLE_CHANNEL
+
+
+
See Also:
Constant Field Values
+
+
+ +

+FOURTYFOUR_POINT_ONE

+
+public static final int FOURTYFOUR_POINT_ONE
+
+
+
See Also:
Constant Field Values
+
+
+ +

+FOURTYEIGHT

+
+public static final int FOURTYEIGHT
+
+
+
See Also:
Constant Field Values
+
+
+ +

+THIRTYTWO

+
+public static final int THIRTYTWO
+
+
+
See Also:
Constant Field Values
+
+
+ +

+checksum

+
+public short checksum
+
+
+
+
+
+ +

+framesize

+
+public int framesize
+
+
+
+
+
+ +

+nSlots

+
+public int nSlots
+
+
+
+
+
+ +

+bitrates

+
+public static final int[][][] bitrates
+
+
+
+
+
+ +

+bitrate_str

+
+public static final java.lang.String[][][] bitrate_str
+
+
+
+
+ + + + + + + + +
+Method Detail
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+
+ +

+version

+
+public int version()
+
+
Returns version. +

+

+
+
+
+
+ +

+layer

+
+public int layer()
+
+
Returns Layer ID. +

+

+
+
+
+
+ +

+bitrate_index

+
+public int bitrate_index()
+
+
Returns bitrate index. +

+

+
+
+
+
+ +

+sample_frequency

+
+public int sample_frequency()
+
+
Returns Sample Frequency. +

+

+
+
+
+
+ +

+frequency

+
+public int frequency()
+
+
Returns Frequency. +

+

+
+
+
+
+ +

+mode

+
+public int mode()
+
+
Returns Mode. +

+

+
+
+
+
+ +

+checksums

+
+public boolean checksums()
+
+
Returns Protection bit. +

+

+
+
+
+
+ +

+copyright

+
+public boolean copyright()
+
+
Returns Copyright. +

+

+
+
+
+
+ +

+original

+
+public boolean original()
+
+
Returns Original. +

+

+
+
+
+
+ +

+vbr

+
+public boolean vbr()
+
+
Return VBR. +

+

+ +
Returns:
true if VBR header is found
+
+
+
+ +

+vbr_scale

+
+public int vbr_scale()
+
+
Return VBR scale. +

+

+ +
Returns:
scale of -1 if not available
+
+
+
+ +

+vbr_toc

+
+public byte[] vbr_toc()
+
+
Return VBR TOC. +

+

+ +
Returns:
vbr toc ot null if not available
+
+
+
+ +

+checksum_ok

+
+public boolean checksum_ok()
+
+
Returns Checksum flag. + Compares computed checksum with stream checksum. +

+

+
+
+
+
+ +

+padding

+
+public boolean padding()
+
+
Returns Layer III Padding bit. +

+

+
+
+
+
+ +

+slots

+
+public int slots()
+
+
Returns Slots. +

+

+
+
+
+
+ +

+mode_extension

+
+public int mode_extension()
+
+
Returns Mode Extension. +

+

+
+
+
+
+ +

+calculate_framesize

+
+public int calculate_framesize()
+
+
Calculate Frame size. + Calculates framesize in bytes excluding header size. +

+

+
+
+
+
+ +

+max_number_of_frames

+
+public int max_number_of_frames(int streamsize)
+
+
Returns the maximum number of frames in the stream. +

+

+
Parameters:
streamsize - +
Returns:
number of frames
+
+
+
+ +

+min_number_of_frames

+
+public int min_number_of_frames(int streamsize)
+
+
Returns the maximum number of frames in the stream. +

+

+
Parameters:
streamsize - +
Returns:
number of frames
+
+
+
+ +

+ms_per_frame

+
+public float ms_per_frame()
+
+
Returns ms/frame. +

+

+ +
Returns:
milliseconds per frame
+
+
+
+ +

+total_ms

+
+public float total_ms(int streamsize)
+
+
Returns total ms. +

+

+
Parameters:
streamsize - +
Returns:
total milliseconds
+
+
+
+ +

+getSyncHeader

+
+public int getSyncHeader()
+
+
Returns synchronized header. +

+

+
+
+
+
+ +

+layer_string

+
+public java.lang.String layer_string()
+
+
Return Layer version. +

+

+
+
+
+
+ +

+bitrate_string

+
+public java.lang.String bitrate_string()
+
+
Return Bitrate. +

+

+ +
Returns:
bitrate in bps
+
+
+
+ +

+bitrate

+
+public int bitrate()
+
+
Return Bitrate. +

+

+ +
Returns:
bitrate in bps and average bitrate for VBR header
+
+
+
+ +

+bitrate_instant

+
+public int bitrate_instant()
+
+
Return Instant Bitrate. + Bitrate for VBR is not constant. +

+

+ +
Returns:
bitrate in bps
+
+
+
+ +

+sample_frequency_string

+
+public java.lang.String sample_frequency_string()
+
+
Returns Frequency +

+

+ +
Returns:
frequency string in kHz
+
+
+
+ +

+mode_string

+
+public java.lang.String mode_string()
+
+
Returns Mode. +

+

+
+
+
+
+ +

+version_string

+
+public java.lang.String version_string()
+
+
Returns Version. +

+

+ +
Returns:
MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF
+
+
+
+ +

+number_of_subbands

+
+public int number_of_subbands()
+
+
Returns the number of subbands in the current frame. +

+

+ +
Returns:
number of subbands
+
+
+
+ +

+intensity_stereo_bound

+
+public int intensity_stereo_bound()
+
+
Returns Intensity Stereo. + (Layer II joint stereo only). + Returns the number of subbands which are in stereo mode, + subbands above that limit are in intensity stereo mode. +

+

+ +
Returns:
intensity
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/InputStreamSource.html b/doc/javazoom/jl/decoder/InputStreamSource.html new file mode 100644 index 0000000..621d3dc --- /dev/null +++ b/doc/javazoom/jl/decoder/InputStreamSource.html @@ -0,0 +1,396 @@ + + + + + + +InputStreamSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class InputStreamSource

+
+java.lang.Object
+  extended by javazoom.jl.decoder.InputStreamSource
+
+
+
All Implemented Interfaces:
Source
+
+
+
+
public class InputStreamSource
extends java.lang.Object
implements Source
+ + +

+Work In Progress. + + An instance of InputStreamSource implements a + Source that provides data from an InputStream + . Seeking functionality is not supported. +

+ +

+


+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from interface javazoom.jl.decoder.Source
LENGTH_UNKNOWN
+  + + + + + + + + + + +
+Constructor Summary
InputStreamSource(java.io.InputStream in) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ booleanisSeekable() + +
+           
+ longlength() + +
+           
+ intread(byte[] b, + int offs, + int len) + +
+           
+ longseek(long to) + +
+           
+ longtell() + +
+           
+ booleanwillReadBlock() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+InputStreamSource

+
+public InputStreamSource(java.io.InputStream in)
+
+
+ + + + + + + + +
+Method Detail
+ +

+read

+
+public int read(byte[] b,
+                int offs,
+                int len)
+         throws java.io.IOException
+
+
+
Specified by:
read in interface Source
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+willReadBlock

+
+public boolean willReadBlock()
+
+
+
Specified by:
willReadBlock in interface Source
+
+
+
+
+
+
+ +

+isSeekable

+
+public boolean isSeekable()
+
+
+
Specified by:
isSeekable in interface Source
+
+
+
+
+
+
+ +

+tell

+
+public long tell()
+
+
+
Specified by:
tell in interface Source
+
+
+
+
+
+
+ +

+seek

+
+public long seek(long to)
+
+
+
Specified by:
seek in interface Source
+
+
+
+
+
+
+ +

+length

+
+public long length()
+
+
+
Specified by:
length in interface Source
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/JavaLayerError.html b/doc/javazoom/jl/decoder/JavaLayerError.html new file mode 100644 index 0000000..caad212 --- /dev/null +++ b/doc/javazoom/jl/decoder/JavaLayerError.html @@ -0,0 +1,242 @@ + + + + + + +JavaLayerError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class JavaLayerError

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Error
+          extended by javazoom.jl.decoder.JavaLayerError
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public class JavaLayerError
extends java.lang.Error
+ + +

+Work in progress. + + API usage errors may be handled by throwing an instance of this + class, as per JMF 2.0. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
JavaLayerError() + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+JavaLayerError

+
+public JavaLayerError()
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/JavaLayerErrors.html b/doc/javazoom/jl/decoder/JavaLayerErrors.html new file mode 100644 index 0000000..87b559f --- /dev/null +++ b/doc/javazoom/jl/decoder/JavaLayerErrors.html @@ -0,0 +1,233 @@ + + + + + + +JavaLayerErrors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface JavaLayerErrors

+
+
All Known Subinterfaces:
BitstreamErrors, DecoderErrors
+
+
+
All Known Implementing Classes:
Bitstream, BitstreamException, Decoder, DecoderException
+
+
+
+
public interface JavaLayerErrors
+ + +

+Exception erorr codes for components of the JavaLayer API. +

+ +

+


+ +

+ + + + + + + + + + + + + + + +
+Field Summary
+static intBITSTREAM_ERROR + +
+          The first bitstream error code.
+static intDECODER_ERROR + +
+          The first decoder error code.
+  +

+ + + + + + + + +
+Field Detail
+ +

+BITSTREAM_ERROR

+
+static final int BITSTREAM_ERROR
+
+
The first bitstream error code. See the DecoderErrors + interface for other bitstream error codes. +

+

+
See Also:
Constant Field Values
+
+
+ +

+DECODER_ERROR

+
+static final int DECODER_ERROR
+
+
The first decoder error code. See the DecoderErrors + interface for other decoder error codes. +

+

+
See Also:
Constant Field Values
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/JavaLayerException.html b/doc/javazoom/jl/decoder/JavaLayerException.html new file mode 100644 index 0000000..5e71fa1 --- /dev/null +++ b/doc/javazoom/jl/decoder/JavaLayerException.html @@ -0,0 +1,348 @@ + + + + + + +JavaLayerException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class JavaLayerException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by javazoom.jl.decoder.JavaLayerException
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
Direct Known Subclasses:
BitstreamException, DecoderException
+
+
+
+
public class JavaLayerException
extends java.lang.Exception
+ + +

+The JavaLayerException is the base class for all API-level + exceptions thrown by JavaLayer. To facilitate conversion and + common handling of exceptions from other domains, the class + can delegate some functionality to a contained Throwable instance. +

+

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + + + + + + + +
+Constructor Summary
JavaLayerException() + +
+           
JavaLayerException(java.lang.String msg) + +
+           
JavaLayerException(java.lang.String msg, + java.lang.Throwable t) + +
+           
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ java.lang.ThrowablegetException() + +
+           
+ voidprintStackTrace() + +
+           
+ voidprintStackTrace(java.io.PrintStream ps) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+JavaLayerException

+
+public JavaLayerException()
+
+
+
+ +

+JavaLayerException

+
+public JavaLayerException(java.lang.String msg)
+
+
+
+ +

+JavaLayerException

+
+public JavaLayerException(java.lang.String msg,
+                          java.lang.Throwable t)
+
+
+ + + + + + + + +
+Method Detail
+ +

+getException

+
+public java.lang.Throwable getException()
+
+
+
+
+
+
+ +

+printStackTrace

+
+public void printStackTrace()
+
+
+
Overrides:
printStackTrace in class java.lang.Throwable
+
+
+
+
+
+
+ +

+printStackTrace

+
+public void printStackTrace(java.io.PrintStream ps)
+
+
+
Overrides:
printStackTrace in class java.lang.Throwable
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/JavaLayerHook.html b/doc/javazoom/jl/decoder/JavaLayerHook.html new file mode 100644 index 0000000..cbac229 --- /dev/null +++ b/doc/javazoom/jl/decoder/JavaLayerHook.html @@ -0,0 +1,209 @@ + + + + + + +JavaLayerHook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface JavaLayerHook

+
+
+
public interface JavaLayerHook
+ + +

+The JavaLayerHooks class allows developers to change + the way the JavaLayer library uses Resources. +

+ +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ java.io.InputStreamgetResourceAsStream(java.lang.String name) + +
+          Retrieves the named resource.
+  +

+ + + + + + + + +
+Method Detail
+ +

+getResourceAsStream

+
+java.io.InputStream getResourceAsStream(java.lang.String name)
+
+
Retrieves the named resource. This allows resources to be + obtained without specifying how they are retrieved. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/JavaLayerUtils.html b/doc/javazoom/jl/decoder/JavaLayerUtils.html new file mode 100644 index 0000000..361dec5 --- /dev/null +++ b/doc/javazoom/jl/decoder/JavaLayerUtils.html @@ -0,0 +1,436 @@ + + + + + + +JavaLayerUtils + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class JavaLayerUtils

+
+java.lang.Object
+  extended by javazoom.jl.decoder.JavaLayerUtils
+
+
+
+
public class JavaLayerUtils
extends java.lang.Object
+ + +

+The JavaLayerUtils class is not strictly part of the JavaLayer API. + It serves to provide useful methods and system-wide hooks. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
JavaLayerUtils() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static java.lang.Objectdeserialize(java.io.InputStream in) + +
+          Deserializes an object from the given InputStream.
+static java.lang.Objectdeserialize(java.io.InputStream in, + java.lang.Class cls) + +
+          Deserializes the object contained in the given input stream.
+static java.lang.ObjectdeserializeArray(java.io.InputStream in, + java.lang.Class elemType, + int length) + +
+          Deserializes an array from a given InputStream.
+static java.lang.ObjectdeserializeArrayResource(java.lang.String name, + java.lang.Class elemType, + int length) + +
+           
+static JavaLayerHookgetHook() + +
+           
+static java.io.InputStreamgetResourceAsStream(java.lang.String name) + +
+          Retrieves an InputStream for a named resource.
+static voidserialize(java.io.OutputStream out, + java.lang.Object obj) + +
+           
+static voidsetHook(JavaLayerHook hook0) + +
+          Sets the system-wide JavaLayer hook.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+JavaLayerUtils

+
+public JavaLayerUtils()
+
+
+ + + + + + + + +
+Method Detail
+ +

+deserialize

+
+public static java.lang.Object deserialize(java.io.InputStream in,
+                                           java.lang.Class cls)
+                                    throws java.io.IOException
+
+
Deserializes the object contained in the given input stream. +

+

+
Parameters:
in - The input stream to deserialize an object from.
cls - The expected class of the deserialized object. +
Throws: +
java.io.IOException
+
+
+
+ +

+deserialize

+
+public static java.lang.Object deserialize(java.io.InputStream in)
+                                    throws java.io.IOException
+
+
Deserializes an object from the given InputStream. + The deserialization is delegated to an + ObjectInputStream instance. +

+

+
Parameters:
in - The InputStream to deserialize an object + from. +
Returns:
The object deserialized from the stream. +
Throws: +
java.io.IOException - is thrown if there was a problem reading + the underlying stream, or an object could not be deserialized + from the stream.
See Also:
ObjectInputStream
+
+
+
+ +

+deserializeArray

+
+public static java.lang.Object deserializeArray(java.io.InputStream in,
+                                                java.lang.Class elemType,
+                                                int length)
+                                         throws java.io.IOException
+
+
Deserializes an array from a given InputStream. +

+

+
Parameters:
in - The InputStream to + deserialize an object from.
elemType - The class denoting the type of the array + elements.
length - The expected length of the array, or -1 if + any length is expected. +
Throws: +
java.io.IOException
+
+
+
+ +

+deserializeArrayResource

+
+public static java.lang.Object deserializeArrayResource(java.lang.String name,
+                                                        java.lang.Class elemType,
+                                                        int length)
+                                                 throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+serialize

+
+public static void serialize(java.io.OutputStream out,
+                             java.lang.Object obj)
+                      throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+setHook

+
+public static void setHook(JavaLayerHook hook0)
+
+
Sets the system-wide JavaLayer hook. +

+

+
+
+
+
+ +

+getHook

+
+public static JavaLayerHook getHook()
+
+
+
+
+
+
+ +

+getResourceAsStream

+
+public static java.io.InputStream getResourceAsStream(java.lang.String name)
+
+
Retrieves an InputStream for a named resource. +

+

+
Parameters:
name - The name of the resource. This must be a simple + name, and not a qualified package name. +
Returns:
The InputStream for the named resource, or null if + the resource has not been found. If a hook has been + provided, its getResourceAsStream() method is called + to retrieve the resource.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Manager.html b/doc/javazoom/jl/decoder/Manager.html new file mode 100644 index 0000000..4a34d70 --- /dev/null +++ b/doc/javazoom/jl/decoder/Manager.html @@ -0,0 +1,291 @@ + + + + + + +Manager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Manager

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Manager
+
+
+
+
public class Manager
extends java.lang.Object
+ + +

+Work in progress. + + Manages a number of controls. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Manager() + +
+           
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidaddControl(Control c) + +
+           
+ voidremoveAll() + +
+           
+ voidremoveControl(Control c) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Manager

+
+public Manager()
+
+
+ + + + + + + + +
+Method Detail
+ +

+addControl

+
+public void addControl(Control c)
+
+
+
+
+
+
+ +

+removeControl

+
+public void removeControl(Control c)
+
+
+
+
+
+
+ +

+removeAll

+
+public void removeAll()
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Obuffer.html b/doc/javazoom/jl/decoder/Obuffer.html new file mode 100644 index 0000000..38a0993 --- /dev/null +++ b/doc/javazoom/jl/decoder/Obuffer.html @@ -0,0 +1,417 @@ + + + + + + +Obuffer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class Obuffer

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Obuffer
+
+
+
Direct Known Subclasses:
SampleBuffer, WaveFileObuffer
+
+
+
+
public abstract class Obuffer
extends java.lang.Object
+ + +

+Base Class for audio output. +

+ +

+


+ +

+ + + + + + + + + + + + + + + +
+Field Summary
+static intMAXCHANNELS + +
+           
+static intOBUFFERSIZE + +
+           
+  + + + + + + + + + + +
+Constructor Summary
Obuffer() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+abstract  voidappend(int channel, + short value) + +
+          Takes a 16 Bit PCM sample.
+ voidappendSamples(int channel, + float[] f) + +
+          Accepts 32 new PCM samples.
+abstract  voidclear_buffer() + +
+          Clears all data in the buffer (for seeking).
+abstract  voidclose() + +
+           
+abstract  voidset_stop_flag() + +
+          Notify the buffer that the user has stopped the stream.
+abstract  voidwrite_buffer(int val) + +
+          Write the samples to the file or directly to the audio hardware.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+OBUFFERSIZE

+
+public static final int OBUFFERSIZE
+
+
+
See Also:
Constant Field Values
+
+
+ +

+MAXCHANNELS

+
+public static final int MAXCHANNELS
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+Obuffer

+
+public Obuffer()
+
+
+ + + + + + + + +
+Method Detail
+ +

+append

+
+public abstract void append(int channel,
+                            short value)
+
+
Takes a 16 Bit PCM sample. +

+

+
+
+
+
+ +

+appendSamples

+
+public void appendSamples(int channel,
+                          float[] f)
+
+
Accepts 32 new PCM samples. +

+

+
+
+
+
+ +

+write_buffer

+
+public abstract void write_buffer(int val)
+
+
Write the samples to the file or directly to the audio hardware. +

+

+
+
+
+
+ +

+close

+
+public abstract void close()
+
+
+
+
+
+
+ +

+clear_buffer

+
+public abstract void clear_buffer()
+
+
Clears all data in the buffer (for seeking). +

+

+
+
+
+
+ +

+set_stop_flag

+
+public abstract void set_stop_flag()
+
+
Notify the buffer that the user has stopped the stream. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/OutputChannels.html b/doc/javazoom/jl/decoder/OutputChannels.html new file mode 100644 index 0000000..da35697 --- /dev/null +++ b/doc/javazoom/jl/decoder/OutputChannels.html @@ -0,0 +1,496 @@ + + + + + + +OutputChannels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class OutputChannels

+
+java.lang.Object
+  extended by javazoom.jl.decoder.OutputChannels
+
+
+
+
public class OutputChannels
extends java.lang.Object
+ + +

+A Type-safe representation of the the supported output channel + constants. + + This class is immutable and, hence, is thread safe. +

+ +

+

+
Since:
+
0.0.7
+
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static OutputChannelsBOTH + +
+           
+static intBOTH_CHANNELS + +
+          Flag to indicate output should include both channels.
+static OutputChannelsDOWNMIX + +
+           
+static intDOWNMIX_CHANNELS + +
+          Flag to indicate output is mono.
+static OutputChannelsLEFT + +
+           
+static intLEFT_CHANNEL + +
+          Flag to indicate output should include the left channel only.
+static OutputChannelsRIGHT + +
+           
+static intRIGHT_CHANNEL + +
+          Flag to indicate output should include the right channel only.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ booleanequals(java.lang.Object o) + +
+           
+static OutputChannelsfromInt(int code) + +
+          Creates an OutputChannels instance + corresponding to the given channel code.
+ intgetChannelCount() + +
+          Retrieves the number of output channels represented + by this channel output type.
+ intgetChannelsOutputCode() + +
+          Retrieves the code representing the desired output channels.
+ inthashCode() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+BOTH_CHANNELS

+
+public static final int BOTH_CHANNELS
+
+
Flag to indicate output should include both channels. +

+

+
See Also:
Constant Field Values
+
+
+ +

+LEFT_CHANNEL

+
+public static final int LEFT_CHANNEL
+
+
Flag to indicate output should include the left channel only. +

+

+
See Also:
Constant Field Values
+
+
+ +

+RIGHT_CHANNEL

+
+public static final int RIGHT_CHANNEL
+
+
Flag to indicate output should include the right channel only. +

+

+
See Also:
Constant Field Values
+
+
+ +

+DOWNMIX_CHANNELS

+
+public static final int DOWNMIX_CHANNELS
+
+
Flag to indicate output is mono. +

+

+
See Also:
Constant Field Values
+
+
+ +

+LEFT

+
+public static final OutputChannels LEFT
+
+
+
+
+
+ +

+RIGHT

+
+public static final OutputChannels RIGHT
+
+
+
+
+
+ +

+BOTH

+
+public static final OutputChannels BOTH
+
+
+
+
+
+ +

+DOWNMIX

+
+public static final OutputChannels DOWNMIX
+
+
+
+
+ + + + + + + + +
+Method Detail
+ +

+fromInt

+
+public static OutputChannels fromInt(int code)
+
+
Creates an OutputChannels instance + corresponding to the given channel code. +

+

+
Parameters:
code - one of the OutputChannels channel code constants. +
Throws: +
java.lang.IllegalArgumentException - if code is not a valid + channel code.
+
+
+
+ +

+getChannelsOutputCode

+
+public int getChannelsOutputCode()
+
+
Retrieves the code representing the desired output channels. + Will be one of LEFT_CHANNEL, RIGHT_CHANNEL, BOTH_CHANNELS + or DOWNMIX_CHANNELS. +

+

+ +
Returns:
the channel code represented by this instance.
+
+
+
+ +

+getChannelCount

+
+public int getChannelCount()
+
+
Retrieves the number of output channels represented + by this channel output type. +

+

+ +
Returns:
The number of output channels for this channel output + type. This will be 2 for BOTH_CHANNELS only, and 1 + for all other types.
+
+
+
+ +

+equals

+
+public boolean equals(java.lang.Object o)
+
+
+
Overrides:
equals in class java.lang.Object
+
+
+
+
+
+
+ +

+hashCode

+
+public int hashCode()
+
+
+
Overrides:
hashCode in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/SampleBuffer.html b/doc/javazoom/jl/decoder/SampleBuffer.html new file mode 100644 index 0000000..e802e5f --- /dev/null +++ b/doc/javazoom/jl/decoder/SampleBuffer.html @@ -0,0 +1,481 @@ + + + + + + +SampleBuffer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Class SampleBuffer

+
+java.lang.Object
+  extended by javazoom.jl.decoder.Obuffer
+      extended by javazoom.jl.decoder.SampleBuffer
+
+
+
+
public class SampleBuffer
extends Obuffer
+ + +

+The SampleBuffer class implements an output buffer + that provides storage for a fixed size block of samples. +

+ +

+


+ +

+ + + + + + + +
+Field Summary
+ + + + + + + +
Fields inherited from class javazoom.jl.decoder.Obuffer
MAXCHANNELS, OBUFFERSIZE
+  + + + + + + + + + + +
+Constructor Summary
SampleBuffer(int sample_frequency, + int number_of_channels) + +
+          Constructor
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidappend(int channel, + short value) + +
+          Takes a 16 Bit PCM sample.
+ voidappendSamples(int channel, + float[] f) + +
+          Accepts 32 new PCM samples.
+ voidclear_buffer() + +
+          Clears all data in the buffer (for seeking).
+ voidclose() + +
+           
+ short[]getBuffer() + +
+           
+ intgetBufferLength() + +
+           
+ intgetChannelCount() + +
+           
+ intgetSampleFrequency() + +
+           
+ voidset_stop_flag() + +
+          Notify the buffer that the user has stopped the stream.
+ voidwrite_buffer(int val) + +
+          Write the samples to the file (Random Acces).
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+SampleBuffer

+
+public SampleBuffer(int sample_frequency,
+                    int number_of_channels)
+
+
Constructor +

+

+ + + + + + + + +
+Method Detail
+ +

+getChannelCount

+
+public int getChannelCount()
+
+
+
+
+
+
+ +

+getSampleFrequency

+
+public int getSampleFrequency()
+
+
+
+
+
+
+ +

+getBuffer

+
+public short[] getBuffer()
+
+
+
+
+
+
+ +

+getBufferLength

+
+public int getBufferLength()
+
+
+
+
+
+
+ +

+append

+
+public void append(int channel,
+                   short value)
+
+
Takes a 16 Bit PCM sample. +

+

+
Specified by:
append in class Obuffer
+
+
+
+
+
+
+ +

+appendSamples

+
+public void appendSamples(int channel,
+                          float[] f)
+
+
Description copied from class: Obuffer
+
Accepts 32 new PCM samples. +

+

+
Overrides:
appendSamples in class Obuffer
+
+
+
+
+
+
+ +

+write_buffer

+
+public void write_buffer(int val)
+
+
Write the samples to the file (Random Acces). +

+

+
Specified by:
write_buffer in class Obuffer
+
+
+
+
+
+
+ +

+close

+
+public void close()
+
+
+
Specified by:
close in class Obuffer
+
+
+
+
+
+
+ +

+clear_buffer

+
+public void clear_buffer()
+
+
Description copied from class: Obuffer
+
Clears all data in the buffer (for seeking). +

+

+
Specified by:
clear_buffer in class Obuffer
+
+
+
+
+
+
+ +

+set_stop_flag

+
+public void set_stop_flag()
+
+
Description copied from class: Obuffer
+
Notify the buffer that the user has stopped the stream. +

+

+
Specified by:
set_stop_flag in class Obuffer
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/Source.html b/doc/javazoom/jl/decoder/Source.html new file mode 100644 index 0000000..7fa2c4f --- /dev/null +++ b/doc/javazoom/jl/decoder/Source.html @@ -0,0 +1,348 @@ + + + + + + +Source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.decoder +
+Interface Source

+
+
All Known Implementing Classes:
InputStreamSource
+
+
+
+
public interface Source
+ + +

+Work in progress. + + Class to describe a seekable data source. +

+ +

+


+ +

+ + + + + + + + + + + +
+Field Summary
+static longLENGTH_UNKNOWN + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ booleanisSeekable() + +
+           
+ longlength() + +
+           
+ intread(byte[] b, + int offs, + int len) + +
+           
+ longseek(long pos) + +
+           
+ longtell() + +
+           
+ booleanwillReadBlock() + +
+           
+  +

+ + + + + + + + +
+Field Detail
+ +

+LENGTH_UNKNOWN

+
+static final long LENGTH_UNKNOWN
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Method Detail
+ +

+read

+
+int read(byte[] b,
+         int offs,
+         int len)
+         throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+willReadBlock

+
+boolean willReadBlock()
+
+
+
+
+
+
+ +

+isSeekable

+
+boolean isSeekable()
+
+
+
+
+
+
+ +

+length

+
+long length()
+
+
+
+
+
+
+ +

+tell

+
+long tell()
+
+
+
+
+
+
+ +

+seek

+
+long seek(long pos)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/package-frame.html b/doc/javazoom/jl/decoder/package-frame.html new file mode 100644 index 0000000..bf35c2a --- /dev/null +++ b/doc/javazoom/jl/decoder/package-frame.html @@ -0,0 +1,105 @@ + + + + + + +javazoom.jl.decoder + + + + + + + + + + + +javazoom.jl.decoder + + + + +
+Interfaces  + +
+BitstreamErrors +
+Control +
+DecoderErrors +
+FrameDecoder +
+JavaLayerErrors +
+JavaLayerHook +
+Source
+ + + + + + +
+Classes  + +
+Bitstream +
+Crc16 +
+Decoder +
+Decoder.Params +
+Equalizer +
+Equalizer.EQFunction +
+Header +
+InputStreamSource +
+JavaLayerUtils +
+Manager +
+Obuffer +
+OutputChannels +
+SampleBuffer
+ + + + + + +
+Exceptions  + +
+BitstreamException +
+DecoderException +
+JavaLayerException
+ + + + + + +
+Errors  + +
+JavaLayerError
+ + + + diff --git a/doc/javazoom/jl/decoder/package-summary.html b/doc/javazoom/jl/decoder/package-summary.html new file mode 100644 index 0000000..f5b1c5a --- /dev/null +++ b/doc/javazoom/jl/decoder/package-summary.html @@ -0,0 +1,287 @@ + + + + + + +javazoom.jl.decoder + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package javazoom.jl.decoder +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Interface Summary
BitstreamErrorsThis interface describes all error codes that can be thrown + in BistreamExceptions.
ControlWork in progress.
DecoderErrorsThis interface provides constants describing the error + codes used by the Decoder to indicate errors.
FrameDecoderImplementations of FrameDecoder are responsible for decoding + an MPEG audio frame.
JavaLayerErrorsException erorr codes for components of the JavaLayer API.
JavaLayerHookThe JavaLayerHooks class allows developers to change + the way the JavaLayer library uses Resources.
SourceWork in progress.
+  + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class Summary
BitstreamThe Bistream class is responsible for parsing + an MPEG audio bitstream.
Crc1616-Bit CRC checksum
DecoderThe Decoder class encapsulates the details of + decoding an MPEG audio frame.
Decoder.ParamsThe Params class presents the customizable + aspects of the decoder.
EqualizerThe Equalizer class can be used to specify + equalization settings for the MPEG audio decoder.
Equalizer.EQFunction 
HeaderClass for extracting information from a frame header.
InputStreamSourceWork In Progress.
JavaLayerUtilsThe JavaLayerUtils class is not strictly part of the JavaLayer API.
ManagerWork in progress.
ObufferBase Class for audio output.
OutputChannelsA Type-safe representation of the the supported output channel + constants.
SampleBufferThe SampleBuffer class implements an output buffer + that provides storage for a fixed size block of samples.
+  + +

+ + + + + + + + + + + + + + + + + +
+Exception Summary
BitstreamExceptionInstances of BitstreamException are thrown + when operations on a Bitstream fail.
DecoderExceptionThe DecoderException represents the class of + errors that can occur when decoding MPEG audio.
JavaLayerExceptionThe JavaLayerException is the base class for all API-level + exceptions thrown by JavaLayer.
+  + +

+ + + + + + + + + +
+Error Summary
JavaLayerErrorWork in progress.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/decoder/package-tree.html b/doc/javazoom/jl/decoder/package-tree.html new file mode 100644 index 0000000..cdbcb67 --- /dev/null +++ b/doc/javazoom/jl/decoder/package-tree.html @@ -0,0 +1,171 @@ + + + + + + +javazoom.jl.decoder Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package javazoom.jl.decoder +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/AudioDevice.html b/doc/javazoom/jl/player/AudioDevice.html new file mode 100644 index 0000000..6757acb --- /dev/null +++ b/doc/javazoom/jl/player/AudioDevice.html @@ -0,0 +1,361 @@ + + + + + + +AudioDevice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Interface AudioDevice

+
+
All Known Implementing Classes:
AudioDeviceBase, JavaSoundAudioDevice, NullAudioDevice
+
+
+
+
public interface AudioDevice
+ + +

+The AudioDevice interface provides an abstraction for + a device capable of sounding audio samples. Samples are written to + the device wia the write() method. The device assumes + that these samples are signed 16-bit samples taken at the output frequency + of the decoder. If the decoder outputs more than one channel, the samples for + each channel are assumed to appear consecutively, with the lower numbered + channels preceeding higher-numbered channels. E.g. if there are two + channels, the samples will appear in this order: +


+ 
+                l0, r0, l1, r1, l2, r2...
+ 
+ where 
+        lx indicates the xth sample on channel 0
+  rx indicates the xth sample on channel 1
+ 
+

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+          Closes this audio device.
+ voidflush() + +
+          Blocks until all audio samples previously written to this audio device have + been heard.
+ intgetPosition() + +
+          Retrieves the current playback position in milliseconds.
+ booleanisOpen() + +
+          Retrieves the open state of this audio device.
+ voidopen(Decoder decoder) + +
+          Prepares the AudioDevice for playback of audio samples.
+ voidwrite(short[] samples, + int offs, + int len) + +
+          Writes a number of samples to this AudioDevice.
+  +

+ + + + + + + + +
+Method Detail
+ +

+open

+
+void open(Decoder decoder)
+          throws JavaLayerException
+
+
Prepares the AudioDevice for playback of audio samples. +

+

+
Parameters:
decoder - The decoder that will be providing the audio + samples. + + If the audio device is already open, this method returns silently. +
Throws: +
JavaLayerException
+
+
+
+ +

+isOpen

+
+boolean isOpen()
+
+
Retrieves the open state of this audio device. +

+

+ +
Returns:
true if this audio device is open and playing + audio samples, or false otherwise.
+
+
+
+ +

+write

+
+void write(short[] samples,
+           int offs,
+           int len)
+           throws JavaLayerException
+
+
Writes a number of samples to this AudioDevice. +

+

+
Parameters:
samples - The array of signed 16-bit samples to write + to the audio device.
offs - The offset of the first sample.
len - The number of samples to write. + + This method may return prior to the samples actually being played + by the audio device. +
Throws: +
JavaLayerException
+
+
+
+ +

+close

+
+void close()
+
+
Closes this audio device. Any currently playing audio is stopped + as soon as possible. Any previously written audio data that has not been heard + is discarded. + + The implementation should ensure that any threads currently blocking + on the device (e.g. during a write or flush + operation should be unblocked by this method. +

+

+
+
+
+
+ +

+flush

+
+void flush()
+
+
Blocks until all audio samples previously written to this audio device have + been heard. +

+

+
+
+
+
+ +

+getPosition

+
+int getPosition()
+
+
Retrieves the current playback position in milliseconds. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/AudioDeviceBase.html b/doc/javazoom/jl/player/AudioDeviceBase.html new file mode 100644 index 0000000..ff7ca2d --- /dev/null +++ b/doc/javazoom/jl/player/AudioDeviceBase.html @@ -0,0 +1,563 @@ + + + + + + +AudioDeviceBase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class AudioDeviceBase

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceBase
+
+
+
All Implemented Interfaces:
AudioDevice
+
+
+
Direct Known Subclasses:
JavaSoundAudioDevice, NullAudioDevice
+
+
+
+
public abstract class AudioDeviceBase
extends java.lang.Object
implements AudioDevice
+ + +

+The AudioDeviceBase class provides a simple thread-safe + implementation of the AudioDevice interface. + Template methods are provided for subclasses to override and + in doing so provide the implementation for the main operations + of the AudioDevice interface. +

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
AudioDeviceBase() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+          Closes this audio device.
+protected  voidcloseImpl() + +
+          Template method to provide the implementation for + closing the audio device.
+ voidflush() + +
+          Waits for any buffered audio samples to be played by the + audio device.
+protected  voidflushImpl() + +
+          Template method to provide the implementation for + flushing any buffered audio data.
+protected  DecodergetDecoder() + +
+          Retrieves the decoder that provides audio data to this + audio device.
+ booleanisOpen() + +
+          Determines if this audio device is open or not.
+ voidopen(Decoder decoder) + +
+          Opens this audio device.
+protected  voidopenImpl() + +
+          Template method to provide the + implementation for the opening of the audio device.
+protected  voidsetOpen(boolean open) + +
+          Sets the open state for this audio device.
+ voidwrite(short[] samples, + int offs, + int len) + +
+          Writes audio data to this audio device.
+protected  voidwriteImpl(short[] samples, + int offs, + int len) + +
+          Template method to provide the implementation for + writing audio samples to the audio device.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+ + + + + + + +
Methods inherited from interface javazoom.jl.player.AudioDevice
getPosition
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+AudioDeviceBase

+
+public AudioDeviceBase()
+
+
+ + + + + + + + +
+Method Detail
+ +

+open

+
+public void open(Decoder decoder)
+          throws JavaLayerException
+
+
Opens this audio device. +

+

+
Specified by:
open in interface AudioDevice
+
+
+
Parameters:
decoder - The decoder that will provide audio data + to this audio device. +
Throws: +
JavaLayerException
+
+
+
+ +

+openImpl

+
+protected void openImpl()
+                 throws JavaLayerException
+
+
Template method to provide the + implementation for the opening of the audio device. +

+

+
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+setOpen

+
+protected void setOpen(boolean open)
+
+
Sets the open state for this audio device. +

+

+
+
+
+
+
+
+
+ +

+isOpen

+
+public boolean isOpen()
+
+
Determines if this audio device is open or not. +

+

+
Specified by:
isOpen in interface AudioDevice
+
+
+ +
Returns:
true if the audio device is open, + false if it is not.
+
+
+
+ +

+close

+
+public void close()
+
+
Closes this audio device. If the device is currently playing + audio, playback is stopped immediately without flushing + any buffered audio data. +

+

+
Specified by:
close in interface AudioDevice
+
+
+
+
+
+
+ +

+closeImpl

+
+protected void closeImpl()
+
+
Template method to provide the implementation for + closing the audio device. +

+

+
+
+
+
+
+
+
+ +

+write

+
+public void write(short[] samples,
+                  int offs,
+                  int len)
+           throws JavaLayerException
+
+
Writes audio data to this audio device. Audio data is + assumed to be in the output format of the decoder. This + method may return before the data has actually been sounded + by the device if the device buffers audio samples. +

+

+
Specified by:
write in interface AudioDevice
+
+
+
Parameters:
samples - The samples to write to the audio device.
offs - The offset into the array of the first sample to write.
len - The number of samples from the array to write. +
Throws: +
JavaLayerException - if the audio data could not be + written to the audio device. + If the audio device is not open, this method does nthing.
+
+
+
+ +

+writeImpl

+
+protected void writeImpl(short[] samples,
+                         int offs,
+                         int len)
+                  throws JavaLayerException
+
+
Template method to provide the implementation for + writing audio samples to the audio device. +

+

+
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+flush

+
+public void flush()
+
+
Waits for any buffered audio samples to be played by the + audio device. This method should only be called prior + to closing the device. +

+

+
Specified by:
flush in interface AudioDevice
+
+
+
+
+
+
+ +

+flushImpl

+
+protected void flushImpl()
+
+
Template method to provide the implementation for + flushing any buffered audio data. +

+

+
+
+
+
+
+
+
+ +

+getDecoder

+
+protected Decoder getDecoder()
+
+
Retrieves the decoder that provides audio data to this + audio device. +

+

+
+
+
+ +
Returns:
The associated decoder.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/AudioDeviceFactory.html b/doc/javazoom/jl/player/AudioDeviceFactory.html new file mode 100644 index 0000000..035092c --- /dev/null +++ b/doc/javazoom/jl/player/AudioDeviceFactory.html @@ -0,0 +1,311 @@ + + + + + + +AudioDeviceFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class AudioDeviceFactory

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceFactory
+
+
+
Direct Known Subclasses:
FactoryRegistry, JavaSoundAudioDeviceFactory
+
+
+
+
public abstract class AudioDeviceFactory
extends java.lang.Object
+ + +

+An AudioDeviceFactory class is responsible for creating + a specific AudioDevice implementation. A factory implementation + can be as simple or complex as desired and may support just one implementation + or may return several implementations depending upon the execution + environment. +

+ When implementing a factory that provides an AudioDevice that uses + class that may not be present, the factory should dynamically link to any + specific implementation classes required to instantiate or test the audio + implementation. This is so that the application as a whole + can run without these classes being present. The audio + device implementation, however, will usually statically link to the classes + required. (See the JavaSound deivce and factory for an example + of this.) +

+ +

+

+
Since:
+
0.0.8
+
See Also:
FactoryRegistry
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
AudioDeviceFactory() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+abstract  AudioDevicecreateAudioDevice() + +
+          Creates a new AudioDevice.
+protected  AudioDeviceinstantiate(java.lang.ClassLoader loader, + java.lang.String name) + +
+          Creates an instance of an AudioDevice implementation.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+AudioDeviceFactory

+
+public AudioDeviceFactory()
+
+
+ + + + + + + + +
+Method Detail
+ +

+createAudioDevice

+
+public abstract AudioDevice createAudioDevice()
+                                       throws JavaLayerException
+
+
Creates a new AudioDevice. +

+

+ +
Returns:
a new instance of a specific class of AudioDevice. +
Throws: +
JavaLayerException - if an instance of AudioDevice could not + be created.
+
+
+
+ +

+instantiate

+
+protected AudioDevice instantiate(java.lang.ClassLoader loader,
+                                  java.lang.String name)
+                           throws java.lang.ClassNotFoundException,
+                                  java.lang.IllegalAccessException,
+                                  java.lang.InstantiationException
+
+
Creates an instance of an AudioDevice implementation. +

+

+
Parameters:
loader - The ClassLoader to use to + load the named class, or null to use the + system class loader.
name - The name of the class to load. +
Returns:
A newly-created instance of the audio device class. +
Throws: +
java.lang.ClassNotFoundException +
java.lang.IllegalAccessException +
java.lang.InstantiationException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/FactoryRegistry.html b/doc/javazoom/jl/player/FactoryRegistry.html new file mode 100644 index 0000000..794671e --- /dev/null +++ b/doc/javazoom/jl/player/FactoryRegistry.html @@ -0,0 +1,433 @@ + + + + + + +FactoryRegistry + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class FactoryRegistry

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceFactory
+      extended by javazoom.jl.player.FactoryRegistry
+
+
+
+
public class FactoryRegistry
extends AudioDeviceFactory
+ + +

+The FactoryRegistry class stores the factories + for all the audio device implementations available in the system. +

+ Instances of this class are thread-safe. +

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + +
+Field Summary
+protected  java.util.Hashtablefactories + +
+           
+  + + + + + + + + + + +
+Constructor Summary
FactoryRegistry() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidaddFactory(AudioDeviceFactory factory) + +
+          Registers an AudioDeviceFactory instance + with this registry.
+ AudioDevicecreateAudioDevice() + +
+          Creates a new AudioDevice.
+protected  AudioDeviceFactory[]getFactoriesPriority() + +
+           
+protected  voidregisterDefaultFactories() + +
+           
+ voidremoveFactory(AudioDeviceFactory factory) + +
+           
+ voidremoveFactoryType(java.lang.Class cls) + +
+           
+static FactoryRegistrysystemRegistry() + +
+           
+ + + + + + + +
Methods inherited from class javazoom.jl.player.AudioDeviceFactory
instantiate
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+factories

+
+protected java.util.Hashtable factories
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+FactoryRegistry

+
+public FactoryRegistry()
+
+
+ + + + + + + + +
+Method Detail
+ +

+systemRegistry

+
+public static FactoryRegistry systemRegistry()
+
+
+
+
+
+
+ +

+addFactory

+
+public void addFactory(AudioDeviceFactory factory)
+
+
Registers an AudioDeviceFactory instance + with this registry. +

+

+
+
+
+
+ +

+removeFactoryType

+
+public void removeFactoryType(java.lang.Class cls)
+
+
+
+
+
+
+ +

+removeFactory

+
+public void removeFactory(AudioDeviceFactory factory)
+
+
+
+
+
+
+ +

+createAudioDevice

+
+public AudioDevice createAudioDevice()
+                              throws JavaLayerException
+
+
Description copied from class: AudioDeviceFactory
+
Creates a new AudioDevice. +

+

+
Specified by:
createAudioDevice in class AudioDeviceFactory
+
+
+ +
Returns:
a new instance of a specific class of AudioDevice. +
Throws: +
JavaLayerException - if an instance of AudioDevice could not + be created.
+
+
+
+ +

+getFactoriesPriority

+
+protected AudioDeviceFactory[] getFactoriesPriority()
+
+
+
+
+
+
+ +

+registerDefaultFactories

+
+protected void registerDefaultFactories()
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/JavaSoundAudioDevice.html b/doc/javazoom/jl/player/JavaSoundAudioDevice.html new file mode 100644 index 0000000..259b7ac --- /dev/null +++ b/doc/javazoom/jl/player/JavaSoundAudioDevice.html @@ -0,0 +1,578 @@ + + + + + + +JavaSoundAudioDevice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class JavaSoundAudioDevice

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceBase
+      extended by javazoom.jl.player.JavaSoundAudioDevice
+
+
+
All Implemented Interfaces:
AudioDevice
+
+
+
+
public class JavaSoundAudioDevice
extends AudioDeviceBase
+ + +

+The JavaSoundAudioDevice implements an audio + device by using the JavaSound API. +

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
JavaSoundAudioDevice() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+protected  voidcloseImpl() + +
+          Template method to provide the implementation for + closing the audio device.
+protected  voidcreateSource() + +
+           
+protected  voidflushImpl() + +
+          Template method to provide the implementation for + flushing any buffered audio data.
+protected  javax.sound.sampled.AudioFormatgetAudioFormat() + +
+           
+protected  byte[]getByteArray(int length) + +
+           
+ intgetPosition() + +
+          Retrieves the current playback position in milliseconds.
+protected  javax.sound.sampled.DataLine.InfogetSourceLineInfo() + +
+           
+ intmillisecondsToBytes(javax.sound.sampled.AudioFormat fmt, + int time) + +
+           
+ voidopen(javax.sound.sampled.AudioFormat fmt) + +
+           
+protected  voidopenImpl() + +
+          Template method to provide the + implementation for the opening of the audio device.
+protected  voidsetAudioFormat(javax.sound.sampled.AudioFormat fmt0) + +
+           
+ voidtest() + +
+          Runs a short test by playing a short silent sound.
+protected  byte[]toByteArray(short[] samples, + int offs, + int len) + +
+           
+protected  voidwriteImpl(short[] samples, + int offs, + int len) + +
+          Template method to provide the implementation for + writing audio samples to the audio device.
+ + + + + + + +
Methods inherited from class javazoom.jl.player.AudioDeviceBase
close, flush, getDecoder, isOpen, open, setOpen, write
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+JavaSoundAudioDevice

+
+public JavaSoundAudioDevice()
+
+
+ + + + + + + + +
+Method Detail
+ +

+setAudioFormat

+
+protected void setAudioFormat(javax.sound.sampled.AudioFormat fmt0)
+
+
+
+
+
+
+ +

+getAudioFormat

+
+protected javax.sound.sampled.AudioFormat getAudioFormat()
+
+
+
+
+
+
+ +

+getSourceLineInfo

+
+protected javax.sound.sampled.DataLine.Info getSourceLineInfo()
+
+
+
+
+
+
+ +

+open

+
+public void open(javax.sound.sampled.AudioFormat fmt)
+          throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+openImpl

+
+protected void openImpl()
+                 throws JavaLayerException
+
+
Description copied from class: AudioDeviceBase
+
Template method to provide the + implementation for the opening of the audio device. +

+

+
Overrides:
openImpl in class AudioDeviceBase
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+createSource

+
+protected void createSource()
+                     throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+millisecondsToBytes

+
+public int millisecondsToBytes(javax.sound.sampled.AudioFormat fmt,
+                               int time)
+
+
+
+
+
+
+ +

+closeImpl

+
+protected void closeImpl()
+
+
Description copied from class: AudioDeviceBase
+
Template method to provide the implementation for + closing the audio device. +

+

+
Overrides:
closeImpl in class AudioDeviceBase
+
+
+
+
+
+
+ +

+writeImpl

+
+protected void writeImpl(short[] samples,
+                         int offs,
+                         int len)
+                  throws JavaLayerException
+
+
Description copied from class: AudioDeviceBase
+
Template method to provide the implementation for + writing audio samples to the audio device. +

+

+
Overrides:
writeImpl in class AudioDeviceBase
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+getByteArray

+
+protected byte[] getByteArray(int length)
+
+
+
+
+
+
+ +

+toByteArray

+
+protected byte[] toByteArray(short[] samples,
+                             int offs,
+                             int len)
+
+
+
+
+
+
+ +

+flushImpl

+
+protected void flushImpl()
+
+
Description copied from class: AudioDeviceBase
+
Template method to provide the implementation for + flushing any buffered audio data. +

+

+
Overrides:
flushImpl in class AudioDeviceBase
+
+
+
+
+
+
+ +

+getPosition

+
+public int getPosition()
+
+
Description copied from interface: AudioDevice
+
Retrieves the current playback position in milliseconds. +

+

+
+
+
+
+ +

+test

+
+public void test()
+          throws JavaLayerException
+
+
Runs a short test by playing a short silent sound. +

+

+ +
Throws: +
JavaLayerException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/JavaSoundAudioDeviceFactory.html b/doc/javazoom/jl/player/JavaSoundAudioDeviceFactory.html new file mode 100644 index 0000000..7893744 --- /dev/null +++ b/doc/javazoom/jl/player/JavaSoundAudioDeviceFactory.html @@ -0,0 +1,319 @@ + + + + + + +JavaSoundAudioDeviceFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class JavaSoundAudioDeviceFactory

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceFactory
+      extended by javazoom.jl.player.JavaSoundAudioDeviceFactory
+
+
+
+
public class JavaSoundAudioDeviceFactory
extends AudioDeviceFactory
+ + +

+This class is responsible for creating instances of the + JavaSoundAudioDevice. The audio device implementation is loaded + and tested dynamically as not all systems will have support + for JavaSound, or they may have the incorrect version. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
JavaSoundAudioDeviceFactory() + +
+           
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ AudioDevicecreateAudioDevice() + +
+          Creates a new AudioDevice.
+protected  JavaSoundAudioDevicecreateAudioDeviceImpl() + +
+           
+ voidtestAudioDevice() + +
+           
+ + + + + + + +
Methods inherited from class javazoom.jl.player.AudioDeviceFactory
instantiate
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+JavaSoundAudioDeviceFactory

+
+public JavaSoundAudioDeviceFactory()
+
+
+ + + + + + + + +
+Method Detail
+ +

+createAudioDevice

+
+public AudioDevice createAudioDevice()
+                              throws JavaLayerException
+
+
Description copied from class: AudioDeviceFactory
+
Creates a new AudioDevice. +

+

+
Specified by:
createAudioDevice in class AudioDeviceFactory
+
+
+ +
Returns:
a new instance of a specific class of AudioDevice. +
Throws: +
JavaLayerException - if an instance of AudioDevice could not + be created.
+
+
+
+ +

+createAudioDeviceImpl

+
+protected JavaSoundAudioDevice createAudioDeviceImpl()
+                                              throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+testAudioDevice

+
+public void testAudioDevice()
+                     throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/NullAudioDevice.html b/doc/javazoom/jl/player/NullAudioDevice.html new file mode 100644 index 0000000..fdafc04 --- /dev/null +++ b/doc/javazoom/jl/player/NullAudioDevice.html @@ -0,0 +1,272 @@ + + + + + + +NullAudioDevice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class NullAudioDevice

+
+java.lang.Object
+  extended by javazoom.jl.player.AudioDeviceBase
+      extended by javazoom.jl.player.NullAudioDevice
+
+
+
All Implemented Interfaces:
AudioDevice
+
+
+
+
public class NullAudioDevice
extends AudioDeviceBase
+ + +

+The NullAudioDevice implements a silent, no-op + audio device. This is useful for testing purposes. +

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
NullAudioDevice() + +
+           
+  + + + + + + + + + + + +
+Method Summary
+ intgetPosition() + +
+          Retrieves the current playback position in milliseconds.
+ + + + + + + +
Methods inherited from class javazoom.jl.player.AudioDeviceBase
close, closeImpl, flush, flushImpl, getDecoder, isOpen, open, openImpl, setOpen, write, writeImpl
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+NullAudioDevice

+
+public NullAudioDevice()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getPosition

+
+public int getPosition()
+
+
Description copied from interface: AudioDevice
+
Retrieves the current playback position in milliseconds. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/Player.html b/doc/javazoom/jl/player/Player.html new file mode 100644 index 0000000..8cbc263 --- /dev/null +++ b/doc/javazoom/jl/player/Player.html @@ -0,0 +1,408 @@ + + + + + + +Player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class Player

+
+java.lang.Object
+  extended by javazoom.jl.player.Player
+
+
+
+
public class Player
extends java.lang.Object
+ + +

+The Player class implements a simple player for playback + of an MPEG audio stream. +

+ +

+

+
Since:
+
0.0.8
+
+
+ +

+ + + + + + + + + + + + + + +
+Constructor Summary
Player(java.io.InputStream stream) + +
+          Creates a new Player instance.
Player(java.io.InputStream stream, + AudioDevice device) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+          Cloases this player.
+protected  booleandecodeFrame() + +
+          Decodes a single frame.
+ intgetPosition() + +
+          Retrieves the position in milliseconds of the current audio + sample being played.
+ booleanisComplete() + +
+          Returns the completed status of this player.
+ voidplay() + +
+           
+ booleanplay(int frames) + +
+          Plays a number of MPEG audio frames.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Player

+
+public Player(java.io.InputStream stream)
+       throws JavaLayerException
+
+
Creates a new Player instance. +

+

+ +
Throws: +
JavaLayerException
+
+
+ +

+Player

+
+public Player(java.io.InputStream stream,
+              AudioDevice device)
+       throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+ + + + + + + + +
+Method Detail
+ +

+play

+
+public void play()
+          throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+play

+
+public boolean play(int frames)
+             throws JavaLayerException
+
+
Plays a number of MPEG audio frames. +

+

+
Parameters:
frames - The number of frames to play. +
Returns:
true if the last frame was played, or false if there are + more frames. +
Throws: +
JavaLayerException
+
+
+
+ +

+close

+
+public void close()
+
+
Cloases this player. Any audio currently playing is stopped + immediately. +

+

+
+
+
+
+ +

+isComplete

+
+public boolean isComplete()
+
+
Returns the completed status of this player. +

+

+ +
Returns:
true if all available MPEG audio frames have been + decoded, or false otherwise.
+
+
+
+ +

+getPosition

+
+public int getPosition()
+
+
Retrieves the position in milliseconds of the current audio + sample being played. This method delegates to the + AudioDevice that is used by this player to sound + the decoded audio samples. +

+

+
+
+
+
+ +

+decodeFrame

+
+protected boolean decodeFrame()
+                       throws JavaLayerException
+
+
Decodes a single frame. +

+

+ +
Returns:
true if there are no more frames to decode, false otherwise. +
Throws: +
JavaLayerException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/PlayerApplet.html b/doc/javazoom/jl/player/PlayerApplet.html new file mode 100644 index 0000000..9a55f98 --- /dev/null +++ b/doc/javazoom/jl/player/PlayerApplet.html @@ -0,0 +1,740 @@ + + + + + + +PlayerApplet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class PlayerApplet

+
+java.lang.Object
+  extended by java.awt.Component
+      extended by java.awt.Container
+          extended by java.awt.Panel
+              extended by java.applet.Applet
+                  extended by javazoom.jl.player.PlayerApplet
+
+
+
All Implemented Interfaces:
java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, java.lang.Runnable, javax.accessibility.Accessible
+
+
+
+
public class PlayerApplet
extends java.applet.Applet
implements java.lang.Runnable
+ + +

+A simple applet that plays an MPEG audio file. + The URL (relative to the document base) + is passed as the "audioURL" parameter. +

+ +

+

+
Since:
+
0.0.8
+
See Also:
Serialized Form
+
+ +

+ + + + + + + +
+Nested Class Summary
+ + + + + + + +
Nested classes/interfaces inherited from class java.applet.Applet
java.applet.Applet.AccessibleApplet
+  + + + + + + + + +
Nested classes/interfaces inherited from class java.awt.Panel
java.awt.Panel.AccessibleAWTPanel
+  + + + + + + + + +
Nested classes/interfaces inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
+  + + + + + + + + +
Nested classes/interfaces inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
+  + + + + + + + + + + + +
+Field Summary
+static java.lang.StringAUDIO_PARAMETER + +
+           
+ + + + + + + +
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
+ + + + + + + +
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
+  + + + + + + + + + + +
+Constructor Summary
PlayerApplet() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+protected  java.lang.ThreadcreatePlayerThread() + +
+          Creates a new thread used to run the audio player.
+ voiddestroy() + +
+           
+protected  AudioDevicegetAudioDevice() + +
+          Retrieves the AudioDevice instance that will + be used to sound the audio data.
+protected  java.lang.StringgetAudioFileName() + +
+           
+protected  java.io.InputStreamgetAudioStream() + +
+          Retrieves the InputStream that provides the MPEG audio + stream data.
+protected  java.net.URLgetAudioURL() + +
+           
+ java.lang.StringgetFileName() + +
+           
+ voidinit() + +
+          Initializes this applet.
+protected  voidplay(java.io.InputStream in, + AudioDevice dev) + +
+          Decompresses audio data from an InputStream and plays it + back through an AudioDevice.
+ voidrun() + +
+          The run method for the audio player thread.
+ voidsetFileName(java.lang.String name) + +
+          Sets the URL of the audio stream to play.
+ voidstart() + +
+          Starts this applet.
+ voidstop() + +
+          Stops this applet.
+protected  voidstopPlayer() + +
+          Stops the audio player.
+ + + + + + + +
Methods inherited from class java.applet.Applet
getAccessibleContext, getAppletContext, getAppletInfo, getAudioClip, getAudioClip, getCodeBase, getDocumentBase, getImage, getImage, getLocale, getParameter, getParameterInfo, isActive, newAudioClip, play, play, resize, resize, setStub, showStatus
+ + + + + + + +
Methods inherited from class java.awt.Panel
addNotify
+ + + + + + + +
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getInsets, getLayout, getListeners, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paint, paintComponents, paramString, preferredSize, print, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, removeNotify, setComponentZOrder, setFocusCycleRoot, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, setLayout, transferFocusBackward, transferFocusDownCycle, update, validate, validateTree
+ + + + + + + +
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusUpCycle
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+AUDIO_PARAMETER

+
+public static final java.lang.String AUDIO_PARAMETER
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+PlayerApplet

+
+public PlayerApplet()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getAudioDevice

+
+protected AudioDevice getAudioDevice()
+                              throws JavaLayerException
+
+
Retrieves the AudioDevice instance that will + be used to sound the audio data. +

+

+
+
+
+ +
Returns:
an audio device instance that will be used to + sound the audio stream. +
Throws: +
JavaLayerException
+
+
+
+ +

+getAudioStream

+
+protected java.io.InputStream getAudioStream()
+
+
Retrieves the InputStream that provides the MPEG audio + stream data. +

+

+
+
+
+ +
Returns:
an InputStream from which the MPEG audio data + is read, or null if an error occurs.
+
+
+
+ +

+getAudioFileName

+
+protected java.lang.String getAudioFileName()
+
+
+
+
+
+
+
+
+
+ +

+getAudioURL

+
+protected java.net.URL getAudioURL()
+
+
+
+
+
+
+
+
+
+ +

+setFileName

+
+public void setFileName(java.lang.String name)
+
+
Sets the URL of the audio stream to play. +

+

+
+
+
+
+
+
+
+ +

+getFileName

+
+public java.lang.String getFileName()
+
+
+
+
+
+
+
+
+
+ +

+stopPlayer

+
+protected void stopPlayer()
+                   throws JavaLayerException
+
+
Stops the audio player. If the player is already stopped + this method is a no-op. +

+

+
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+play

+
+protected void play(java.io.InputStream in,
+                    AudioDevice dev)
+             throws JavaLayerException
+
+
Decompresses audio data from an InputStream and plays it + back through an AudioDevice. The playback is run on a newly + created thread. +

+

+
+
+
+
Parameters:
in - The InputStream that provides the MPEG audio data.
dev - The AudioDevice to use to sound the decompressed data. +
Throws: +
JavaLayerException - if there was a problem decoding + or playing the audio data.
+
+
+
+ +

+createPlayerThread

+
+protected java.lang.Thread createPlayerThread()
+
+
Creates a new thread used to run the audio player. +

+

+
+
+
+ +
Returns:
A new Thread that, once started, runs the audio player.
+
+
+
+ +

+init

+
+public void init()
+
+
Initializes this applet. +

+

+
Overrides:
init in class java.applet.Applet
+
+
+
+
+
+
+ +

+start

+
+public void start()
+
+
Starts this applet. An input stream and audio device + are created and passed to the play() method. +

+

+
Overrides:
start in class java.applet.Applet
+
+
+
+
+
+
+ +

+stop

+
+public void stop()
+
+
Stops this applet. If audio is currently playing, it is + stopped. +

+

+
Overrides:
stop in class java.applet.Applet
+
+
+
+
+
+
+ +

+destroy

+
+public void destroy()
+
+
+
Overrides:
destroy in class java.applet.Applet
+
+
+
+
+
+
+ +

+run

+
+public void run()
+
+
The run method for the audio player thread. Simply calls + play() on the player to play the entire stream. +

+

+
Specified by:
run in interface java.lang.Runnable
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/AdvancedPlayer.html b/doc/javazoom/jl/player/advanced/AdvancedPlayer.html new file mode 100644 index 0000000..f243e68 --- /dev/null +++ b/doc/javazoom/jl/player/advanced/AdvancedPlayer.html @@ -0,0 +1,471 @@ + + + + + + +AdvancedPlayer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player.advanced +
+Class AdvancedPlayer

+
+java.lang.Object
+  extended by javazoom.jl.player.advanced.AdvancedPlayer
+
+
+
+
public class AdvancedPlayer
extends java.lang.Object
+ + +

+a hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame) + hopefully this will be included in the api +

+ +

+


+ +

+ + + + + + + + + + + + + + +
+Constructor Summary
AdvancedPlayer(java.io.InputStream stream) + +
+          Creates a new Player instance.
AdvancedPlayer(java.io.InputStream stream, + AudioDevice device) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+          Cloases this player.
+protected  booleandecodeFrame() + +
+          Decodes a single frame.
+ PlaybackListenergetPlayBackListener() + +
+          gets the PlaybackListener
+ voidplay() + +
+           
+ booleanplay(int frames) + +
+          Plays a number of MPEG audio frames.
+ booleanplay(int start, + int end) + +
+          Plays a range of MPEG audio frames
+ voidsetPlayBackListener(PlaybackListener listener) + +
+          sets the PlaybackListener
+protected  booleanskipFrame() + +
+          skips over a single frame
+ voidstop() + +
+          closes the player and notifies PlaybackListener
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+AdvancedPlayer

+
+public AdvancedPlayer(java.io.InputStream stream)
+               throws JavaLayerException
+
+
Creates a new Player instance. +

+

+ +
Throws: +
JavaLayerException
+
+
+ +

+AdvancedPlayer

+
+public AdvancedPlayer(java.io.InputStream stream,
+                      AudioDevice device)
+               throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+ + + + + + + + +
+Method Detail
+ +

+play

+
+public void play()
+          throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+play

+
+public boolean play(int frames)
+             throws JavaLayerException
+
+
Plays a number of MPEG audio frames. +

+

+
Parameters:
frames - The number of frames to play. +
Returns:
true if the last frame was played, or false if there are + more frames. +
Throws: +
JavaLayerException
+
+
+
+ +

+close

+
+public void close()
+
+
Cloases this player. Any audio currently playing is stopped + immediately. +

+

+
+
+
+
+ +

+decodeFrame

+
+protected boolean decodeFrame()
+                       throws JavaLayerException
+
+
Decodes a single frame. +

+

+ +
Returns:
true if there are no more frames to decode, false otherwise. +
Throws: +
JavaLayerException
+
+
+
+ +

+skipFrame

+
+protected boolean skipFrame()
+                     throws JavaLayerException
+
+
skips over a single frame +

+

+ +
Returns:
false if there are no more frames to decode, true otherwise. +
Throws: +
JavaLayerException
+
+
+
+ +

+play

+
+public boolean play(int start,
+                    int end)
+             throws JavaLayerException
+
+
Plays a range of MPEG audio frames +

+

+
Parameters:
start - The first frame to play
end - The last frame to play +
Returns:
true if the last frame was played, or false if there are more frames. +
Throws: +
JavaLayerException
+
+
+
+ +

+setPlayBackListener

+
+public void setPlayBackListener(PlaybackListener listener)
+
+
sets the PlaybackListener +

+

+
+
+
+
+ +

+getPlayBackListener

+
+public PlaybackListener getPlayBackListener()
+
+
gets the PlaybackListener +

+

+
+
+
+
+ +

+stop

+
+public void stop()
+
+
closes the player and notifies PlaybackListener +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/PlaybackEvent.html b/doc/javazoom/jl/player/advanced/PlaybackEvent.html new file mode 100644 index 0000000..781208e --- /dev/null +++ b/doc/javazoom/jl/player/advanced/PlaybackEvent.html @@ -0,0 +1,404 @@ + + + + + + +PlaybackEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player.advanced +
+Class PlaybackEvent

+
+java.lang.Object
+  extended by javazoom.jl.player.advanced.PlaybackEvent
+
+
+
+
public class PlaybackEvent
extends java.lang.Object
+ + +

+An event which indicates a Player has performed an 'playback action' +

+ +

+


+ +

+ + + + + + + + + + + + + + + +
+Field Summary
+static intSTARTED + +
+           
+static intSTOPPED + +
+           
+  + + + + + + + + + + +
+Constructor Summary
PlaybackEvent(AdvancedPlayer source, + int id, + int frame) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ intgetFrame() + +
+           
+ intgetId() + +
+           
+ AdvancedPlayergetSource() + +
+           
+ voidsetFrame(int frame) + +
+           
+ voidsetId(int id) + +
+           
+ voidsetSource(AdvancedPlayer source) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+STOPPED

+
+public static int STOPPED
+
+
+
+
+
+ +

+STARTED

+
+public static int STARTED
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+PlaybackEvent

+
+public PlaybackEvent(AdvancedPlayer source,
+                     int id,
+                     int frame)
+
+
+ + + + + + + + +
+Method Detail
+ +

+getId

+
+public int getId()
+
+
+
+
+
+
+ +

+setId

+
+public void setId(int id)
+
+
+
+
+
+
+ +

+getFrame

+
+public int getFrame()
+
+
+
+
+
+
+ +

+setFrame

+
+public void setFrame(int frame)
+
+
+
+
+
+
+ +

+getSource

+
+public AdvancedPlayer getSource()
+
+
+
+
+
+
+ +

+setSource

+
+public void setSource(AdvancedPlayer source)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/PlaybackListener.html b/doc/javazoom/jl/player/advanced/PlaybackListener.html new file mode 100644 index 0000000..dcce366 --- /dev/null +++ b/doc/javazoom/jl/player/advanced/PlaybackListener.html @@ -0,0 +1,273 @@ + + + + + + +PlaybackListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player.advanced +
+Class PlaybackListener

+
+java.lang.Object
+  extended by javazoom.jl.player.advanced.PlaybackListener
+
+
+
Direct Known Subclasses:
jlap.InfoListener
+
+
+
+
public abstract class PlaybackListener
extends java.lang.Object
+ + +

+Listener for javalayer Player playback +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
PlaybackListener() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ voidplaybackFinished(PlaybackEvent evt) + +
+           
+ voidplaybackStarted(PlaybackEvent evt) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+PlaybackListener

+
+public PlaybackListener()
+
+
+ + + + + + + + +
+Method Detail
+ +

+playbackStarted

+
+public void playbackStarted(PlaybackEvent evt)
+
+
+
+
+
+
+ +

+playbackFinished

+
+public void playbackFinished(PlaybackEvent evt)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/jlap.InfoListener.html b/doc/javazoom/jl/player/advanced/jlap.InfoListener.html new file mode 100644 index 0000000..2a37dec --- /dev/null +++ b/doc/javazoom/jl/player/advanced/jlap.InfoListener.html @@ -0,0 +1,276 @@ + + + + + + +jlap.InfoListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player.advanced +
+Class jlap.InfoListener

+
+java.lang.Object
+  extended by javazoom.jl.player.advanced.PlaybackListener
+      extended by javazoom.jl.player.advanced.jlap.InfoListener
+
+
+
Enclosing class:
jlap
+
+
+
+
public class jlap.InfoListener
extends PlaybackListener
+ + +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
jlap.InfoListener() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ voidplaybackFinished(PlaybackEvent evt) + +
+           
+ voidplaybackStarted(PlaybackEvent evt) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+jlap.InfoListener

+
+public jlap.InfoListener()
+
+
+ + + + + + + + +
+Method Detail
+ +

+playbackStarted

+
+public void playbackStarted(PlaybackEvent evt)
+
+
+
Overrides:
playbackStarted in class PlaybackListener
+
+
+
+
+
+
+ +

+playbackFinished

+
+public void playbackFinished(PlaybackEvent evt)
+
+
+
Overrides:
playbackFinished in class PlaybackListener
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/jlap.html b/doc/javazoom/jl/player/advanced/jlap.html new file mode 100644 index 0000000..5304c1e --- /dev/null +++ b/doc/javazoom/jl/player/advanced/jlap.html @@ -0,0 +1,395 @@ + + + + + + +jlap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player.advanced +
+Class jlap

+
+java.lang.Object
+  extended by javazoom.jl.player.advanced.jlap
+
+
+
+
public class jlap
extends java.lang.Object
+ + +

+This class implements a sample player using Playback listener. +

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+ classjlap.InfoListener + +
+           
+  + + + + + + + + + + +
+Constructor Summary
jlap() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static voidmain(java.lang.String[] args) + +
+           
+ voidplay(java.lang.String filename) + +
+           
+static AdvancedPlayerplayMp3(java.io.File mp3, + int start, + int end, + PlaybackListener listener) + +
+           
+static AdvancedPlayerplayMp3(java.io.File mp3, + PlaybackListener listener) + +
+           
+static AdvancedPlayerplayMp3(java.io.InputStream is, + int start, + int end, + PlaybackListener listener) + +
+           
+ voidshowUsage() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+jlap

+
+public jlap()
+
+
+ + + + + + + + +
+Method Detail
+ +

+main

+
+public static void main(java.lang.String[] args)
+
+
+
+
+
+
+ +

+play

+
+public void play(java.lang.String filename)
+          throws JavaLayerException,
+                 java.io.IOException
+
+
+ +
Throws: +
JavaLayerException +
java.io.IOException
+
+
+
+ +

+showUsage

+
+public void showUsage()
+
+
+
+
+
+
+ +

+playMp3

+
+public static AdvancedPlayer playMp3(java.io.File mp3,
+                                     PlaybackListener listener)
+                              throws java.io.IOException,
+                                     JavaLayerException
+
+
+ +
Throws: +
java.io.IOException +
JavaLayerException
+
+
+
+ +

+playMp3

+
+public static AdvancedPlayer playMp3(java.io.File mp3,
+                                     int start,
+                                     int end,
+                                     PlaybackListener listener)
+                              throws java.io.IOException,
+                                     JavaLayerException
+
+
+ +
Throws: +
java.io.IOException +
JavaLayerException
+
+
+
+ +

+playMp3

+
+public static AdvancedPlayer playMp3(java.io.InputStream is,
+                                     int start,
+                                     int end,
+                                     PlaybackListener listener)
+                              throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/package-frame.html b/doc/javazoom/jl/player/advanced/package-frame.html new file mode 100644 index 0000000..63df5d9 --- /dev/null +++ b/doc/javazoom/jl/player/advanced/package-frame.html @@ -0,0 +1,38 @@ + + + + + + +javazoom.jl.player.advanced + + + + + + + + + + + +javazoom.jl.player.advanced + + + + +
+Classes  + +
+AdvancedPlayer +
+jlap +
+PlaybackEvent +
+PlaybackListener
+ + + + diff --git a/doc/javazoom/jl/player/advanced/package-summary.html b/doc/javazoom/jl/player/advanced/package-summary.html new file mode 100644 index 0000000..cbceab7 --- /dev/null +++ b/doc/javazoom/jl/player/advanced/package-summary.html @@ -0,0 +1,165 @@ + + + + + + +javazoom.jl.player.advanced + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package javazoom.jl.player.advanced +

+ + + + + + + + + + + + + + + + + + + + + +
+Class Summary
AdvancedPlayera hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame) + hopefully this will be included in the api
jlapThis class implements a sample player using Playback listener.
PlaybackEventAn event which indicates a Player has performed an 'playback action'
PlaybackListenerListener for javalayer Player playback
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/advanced/package-tree.html b/doc/javazoom/jl/player/advanced/package-tree.html new file mode 100644 index 0000000..702e8f3 --- /dev/null +++ b/doc/javazoom/jl/player/advanced/package-tree.html @@ -0,0 +1,149 @@ + + + + + + +javazoom.jl.player.advanced Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package javazoom.jl.player.advanced +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/jlp.html b/doc/javazoom/jl/player/jlp.html new file mode 100644 index 0000000..a12bb40 --- /dev/null +++ b/doc/javazoom/jl/player/jlp.html @@ -0,0 +1,420 @@ + + + + + + +jlp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +javazoom.jl.player +
+Class jlp

+
+java.lang.Object
+  extended by javazoom.jl.player.jlp
+
+
+
+
public class jlp
extends java.lang.Object
+ + +

+The jlp class implements a simple command-line + player for MPEG audio files. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
jlp(java.lang.String filename) + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static jlpcreateInstance(java.lang.String[] args) + +
+           
+protected  AudioDevicegetAudioDevice() + +
+           
+protected  java.io.InputStreamgetInputStream() + +
+          Playing file from FileInputStream.
+protected  java.io.InputStreamgetURLInputStream() + +
+          Playing file from URL (Streaming).
+protected  voidinit(java.lang.String filename) + +
+           
+static voidmain(java.lang.String[] args) + +
+           
+protected  booleanparseArgs(java.lang.String[] args) + +
+           
+ voidplay() + +
+           
+ voidshowUsage() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+jlp

+
+public jlp(java.lang.String filename)
+
+
+ + + + + + + + +
+Method Detail
+ +

+main

+
+public static void main(java.lang.String[] args)
+
+
+
+
+
+
+ +

+createInstance

+
+public static jlp createInstance(java.lang.String[] args)
+
+
+
+
+
+
+ +

+init

+
+protected void init(java.lang.String filename)
+
+
+
+
+
+
+ +

+parseArgs

+
+protected boolean parseArgs(java.lang.String[] args)
+
+
+
+
+
+
+ +

+showUsage

+
+public void showUsage()
+
+
+
+
+
+
+ +

+play

+
+public void play()
+          throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+
+ +

+getURLInputStream

+
+protected java.io.InputStream getURLInputStream()
+                                         throws java.lang.Exception
+
+
Playing file from URL (Streaming). +

+

+ +
Throws: +
java.lang.Exception
+
+
+
+ +

+getInputStream

+
+protected java.io.InputStream getInputStream()
+                                      throws java.io.IOException
+
+
Playing file from FileInputStream. +

+

+ +
Throws: +
java.io.IOException
+
+
+
+ +

+getAudioDevice

+
+protected AudioDevice getAudioDevice()
+                              throws JavaLayerException
+
+
+ +
Throws: +
JavaLayerException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/package-frame.html b/doc/javazoom/jl/player/package-frame.html new file mode 100644 index 0000000..55c1649 --- /dev/null +++ b/doc/javazoom/jl/player/package-frame.html @@ -0,0 +1,59 @@ + + + + + + +javazoom.jl.player + + + + + + + + + + + +javazoom.jl.player + + + + +
+Interfaces  + +
+AudioDevice
+ + + + + + +
+Classes  + +
+AudioDeviceBase +
+AudioDeviceFactory +
+FactoryRegistry +
+JavaSoundAudioDevice +
+JavaSoundAudioDeviceFactory +
+jlp +
+NullAudioDevice +
+Player +
+PlayerApplet
+ + + + diff --git a/doc/javazoom/jl/player/package-summary.html b/doc/javazoom/jl/player/package-summary.html new file mode 100644 index 0000000..1e4629a --- /dev/null +++ b/doc/javazoom/jl/player/package-summary.html @@ -0,0 +1,207 @@ + + + + + + +javazoom.jl.player + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package javazoom.jl.player +

+ + + + + + + + + +
+Interface Summary
AudioDeviceThe AudioDevice interface provides an abstraction for + a device capable of sounding audio samples.
+  + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class Summary
AudioDeviceBaseThe AudioDeviceBase class provides a simple thread-safe + implementation of the AudioDevice interface.
AudioDeviceFactoryAn AudioDeviceFactory class is responsible for creating + a specific AudioDevice implementation.
FactoryRegistryThe FactoryRegistry class stores the factories + for all the audio device implementations available in the system.
JavaSoundAudioDeviceThe JavaSoundAudioDevice implements an audio + device by using the JavaSound API.
JavaSoundAudioDeviceFactoryThis class is responsible for creating instances of the + JavaSoundAudioDevice.
jlpThe jlp class implements a simple command-line + player for MPEG audio files.
NullAudioDeviceThe NullAudioDevice implements a silent, no-op + audio device.
PlayerThe Player class implements a simple player for playback + of an MPEG audio stream.
PlayerAppletA simple applet that plays an MPEG audio file.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/javazoom/jl/player/package-tree.html b/doc/javazoom/jl/player/package-tree.html new file mode 100644 index 0000000..1c1232a --- /dev/null +++ b/doc/javazoom/jl/player/package-tree.html @@ -0,0 +1,168 @@ + + + + + + +javazoom.jl.player Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package javazoom.jl.player +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/overview-frame.html b/doc/overview-frame.html new file mode 100644 index 0000000..6b45982 --- /dev/null +++ b/doc/overview-frame.html @@ -0,0 +1,48 @@ + + + + + + +Overview + + + + + + + + + + + + + + + +
+
+ + + + + +
All Classes +

+ +Packages +
+javazoom.jl.converter +
+javazoom.jl.decoder +
+javazoom.jl.player +
+javazoom.jl.player.advanced +
+

+ +

+  + + diff --git a/doc/overview-summary.html b/doc/overview-summary.html new file mode 100644 index 0000000..6569711 --- /dev/null +++ b/doc/overview-summary.html @@ -0,0 +1,158 @@ + + + + + + +Overview + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +


+ + + + + + + + + + + + + + + + + + + + + +
+Packages
javazoom.jl.converter 
javazoom.jl.decoder 
javazoom.jl.player 
javazoom.jl.player.advanced 
+ +


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/overview-tree.html b/doc/overview-tree.html new file mode 100644 index 0000000..211f5b2 --- /dev/null +++ b/doc/overview-tree.html @@ -0,0 +1,191 @@ + + + + + + +Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
javazoom.jl.converter, javazoom.jl.decoder, javazoom.jl.player, javazoom.jl.player.advanced
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/package-list b/doc/package-list new file mode 100644 index 0000000..b8fb0d7 --- /dev/null +++ b/doc/package-list @@ -0,0 +1,4 @@ +javazoom.jl.converter +javazoom.jl.decoder +javazoom.jl.player +javazoom.jl.player.advanced diff --git a/doc/packages.html b/doc/packages.html new file mode 100644 index 0000000..99d78ad --- /dev/null +++ b/doc/packages.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+The front page has been relocated.Please see: +
+          Frame version +
+          Non-frame version.
+ + + diff --git a/doc/resources/inherit.gif b/doc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/doc/serialized-form.html b/doc/serialized-form.html new file mode 100644 index 0000000..ca1841b --- /dev/null +++ b/doc/serialized-form.html @@ -0,0 +1,295 @@ + + + + + + +Serialized Form + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Serialized Form

+
+
+ + + + + +
+Package javazoom.jl.decoder
+ +

+ + + + + +
+Class javazoom.jl.decoder.BitstreamException extends JavaLayerException implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+errorcode

+
+int errorcode
+
+
+
+
+ +

+ + + + + +
+Class javazoom.jl.decoder.DecoderException extends JavaLayerException implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+errorcode

+
+int errorcode
+
+
+
+
+ +

+ + + + + +
+Class javazoom.jl.decoder.JavaLayerError extends java.lang.Error implements Serializable
+ +

+ +

+ + + + + +
+Class javazoom.jl.decoder.JavaLayerException extends java.lang.Exception implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+exception

+
+java.lang.Throwable exception
+
+
+
+
+
+ + + + + +
+Package javazoom.jl.player
+ +

+ + + + + +
+Class javazoom.jl.player.PlayerApplet extends java.applet.Applet implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+player

+
+Player player
+
+
The Player used to play the MPEG audio file. +

+

+
+
+
+

+playerThread

+
+java.lang.Thread playerThread
+
+
The thread that runs the player. +

+

+
+
+
+

+fileName

+
+java.lang.String fileName
+
+
+
+
+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+JavaZOOM 1999-2008 + + diff --git a/doc/stylesheet.css b/doc/stylesheet.css new file mode 100644 index 0000000..6d31fdb --- /dev/null +++ b/doc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF } /* Light mauve */ +.TableRowColor { background: #FFFFFF } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF;} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} + diff --git a/jl1.0.1.jar b/jl1.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..bd5fb8b8eb28746e4a3d7cfee2b54c4fd54f5043 GIT binary patch literal 105363 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

(H>r|Sz$es;n6q4t!9osGU^)b#AiEhi^s}TD` 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

W(94n+m(@89xah6`eR%%`DDLQJ z@Aw-tzAuT|%L0%GK<*i@V2Akr4eM@f3U;=%2Sy>6YsHYQLyEK|Z8bpL11_>F}YRuJ#JGFcwh-A`V6?P`n%x%Z*Y#rY~0twp7PN3*a12I3Y5yr*v}s+&yP&# zdYIT>-6EwD$Pr}w8(TVd>&T)3#c>M-GRIRQf23Zo`6c~Y#_&1s||(pA8~*3 zH#28kbvgk20OTI1CqGl3AHU3>p?~%^eue<^AV9+d*vvnvm*t&I?s~4cgA2&U($mzD zQe0WW#m@NmC5hTx`!yd>GqZpW@@ieWC;u<(>n+>%lU>h*s|M9D?t~>iW#je6v|d1&9s6 zb+vIi{ZG{2RHz)qO?*4R3K@VEt~O5drvIkwpNlI~wVO%^pzLJ;_|>`#acVut_owv?%mQkhV3n_!p>}v!%^%jDUDUniLKw{dqv?zkE9TBjx$I+g?xo?k(vb zEtZOlkrBwwH8o_YNTLDy^l$qz=Z2x#V>0@Kv1(~W13{se_|_;;VMUoS(v(ILJLu#g=v zA`|~57?pf!^x6apPaLUHYdO6%py{b3mX@NKXu4zX2E96*NNae?*%(gN%MRwX#Ln zM4bT8^gy|~I(Kt^_TTX4j(?fvHw_`Ffyo*HAYc->u1;u^>i?SnXH#3Sy(7rd@i&8Z zrykQ_MPN&K=aE` z53(!1MP0ofD-W^*ng4Fa7Khs^nF^qAfWm$ihqQJ*?vE2dT3f%31pvkN|7zs=`fqS9 z&cJX+)B2MXNPQ5^i+>#2XO42b+;s(P|+jc^Xw@A5RJJ6G%& z_U<>#KMc0+Gt#8C;6Ong0lm=GVNo|w%&v2`iie%Eg{hOJ6R@HI^l;ZZyW!OO-5ns~ zguq2|Maf=h=xebc7k1#F%FB}iA={f|vHPEI17j=B4#Qi~UngEcQXx+}`bB*q|8LYQJA)y?kVoqL0@o^D z3%>S%9Y`wV(Hg&~(5lx`Wqy0m1|%ACd-N}KlJye&wkP`%>WUo3JHgdkNgEM0iJ367xW3{UzcK*aUm1zg`JK*mS>V&ZsS%lsKFp(G0nOyi)SRDgfygiuhx J<3Ql2{{u2lHQE3G literal 0 HcmV?d00001 diff --git a/playerapplet.html b/playerapplet.html new file mode 100644 index 0000000..47b9e10 --- /dev/null +++ b/playerapplet.html @@ -0,0 +1,44 @@ + + +MP3 Player - Applet Sample + + +

+ + diff --git a/setEnvAnt.bat b/setEnvAnt.bat new file mode 100644 index 0000000..f6bc03d --- /dev/null +++ b/setEnvAnt.bat @@ -0,0 +1,3 @@ +SET JAVA_HOME=C:\java\jdk1.5.0_15 +SET ANT_HOME=C:\java\ant1.7 +SET PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin diff --git a/src/javazoom/jl/converter/Converter.java b/src/javazoom/jl/converter/Converter.java new file mode 100644 index 0000000..845082e --- /dev/null +++ b/src/javazoom/jl/converter/Converter.java @@ -0,0 +1,411 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Original verion. mdm@techie.com. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.converter; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; + +import javazoom.jl.decoder.Bitstream; +import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.Header; +import javazoom.jl.decoder.JavaLayerException; +import javazoom.jl.decoder.Obuffer; + +/** + * The Converter class implements the conversion of + * an MPEG audio file to a .WAV file. To convert an MPEG audio stream, + * just create an instance of this class and call the convert() + * method, passing in the names of the input and output files. You can + * pass in optional ProgressListener and + * Decoder.Params objects also to customize the conversion. + * + * @author MDM 12/12/99 + * @since 0.0.7 + */ +public class Converter +{ + /** + * Creates a new converter instance. + */ + public Converter() + { + } + + public synchronized void convert(String sourceName, String destName) + throws JavaLayerException + { + convert(sourceName, destName, null, null); + } + + public synchronized void convert(String sourceName, String destName, + ProgressListener progressListener) + throws JavaLayerException + { + convert(sourceName, destName, progressListener, null); + } + + + public void convert(String sourceName, String destName, + ProgressListener progressListener, Decoder.Params decoderParams) + throws JavaLayerException + { + if (destName.length()==0) + destName = null; + try { + InputStream in = openInput(sourceName); + convert(in, destName, progressListener, decoderParams); + in.close(); + } catch(IOException ioe) { + throw new JavaLayerException(ioe.getLocalizedMessage(), ioe); + } + } + + public synchronized void convert(InputStream sourceStream, String destName, + ProgressListener progressListener, Decoder.Params decoderParams) + throws JavaLayerException + { + if (progressListener==null) + progressListener = PrintWriterProgressListener.newStdOut( + PrintWriterProgressListener.NO_DETAIL); + try { + if (!(sourceStream instanceof BufferedInputStream)) + sourceStream = new BufferedInputStream(sourceStream); + int frameCount = -1; + if (sourceStream.markSupported()) { + sourceStream.mark(-1); + frameCount = countFrames(sourceStream); + sourceStream.reset(); + } + progressListener.converterUpdate(ProgressListener.UPDATE_FRAME_COUNT, frameCount, 0); + + + Obuffer output = null; + Decoder decoder = new Decoder(decoderParams); + Bitstream stream = new Bitstream(sourceStream); + + if (frameCount==-1) + frameCount = Integer.MAX_VALUE; + + int frame = 0; + long startTime = System.currentTimeMillis(); + + try + { + for (; frameupdateID parameter can take these values: + * + * UPDATE_FRAME_COUNT: param1 is the frame count, or -1 if not known. + * UPDATE_CONVERT_COMPLETE: param1 is the conversion time, param2 + * is the number of frames converted. + */ + public void converterUpdate(int updateID, int param1, int param2); + + /** + * If the converter wishes to make a first pass over the + * audio frames, this is called as each frame is parsed. + */ + public void parsedFrame(int frameNo, Header header); + + /** + * This method is called after each frame has been read, + * but before it has been decoded. + * + * @param frameNo The 0-based sequence number of the frame. + * @param header The Header rerpesenting the frame just read. + */ + public void readFrame(int frameNo, Header header); + + /** + * This method is called after a frame has been decoded. + * + * @param frameNo The 0-based sequence number of the frame. + * @param header The Header rerpesenting the frame just read. + * @param o The Obuffer the deocded data was written to. + */ + public void decodedFrame(int frameNo, Header header, Obuffer o); + + /** + * Called when an exception is thrown during while converting + * a frame. + * + * @param t The Throwable instance that + * was thrown. + * + * @return true to continue processing, or false + * to abort conversion. + * + * If this method returns false, the exception + * is propagated to the caller of the convert() method. If + * true is returned, the exception is silently + * ignored and the converter moves onto the next frame. + */ + public boolean converterException(Throwable t); + + } + + + /** + * Implementation of ProgressListener that writes + * notification text to a PrintWriter. + */ + // REVIEW: i18n of text and order required. + static public class PrintWriterProgressListener implements ProgressListener + { + static public final int NO_DETAIL = 0; + + /** + * Level of detail typically expected of expert + * users. + */ + static public final int EXPERT_DETAIL = 1; + + /** + * Verbose detail. + */ + static public final int VERBOSE_DETAIL = 2; + + /** + * Debug detail. All frame read notifications are shown. + */ + static public final int DEBUG_DETAIL = 7; + + static public final int MAX_DETAIL = 10; + + private PrintWriter pw; + + private int detailLevel; + + static public PrintWriterProgressListener newStdOut(int detail) + { + return new PrintWriterProgressListener( + new PrintWriter(System.out, true), detail); + } + + public PrintWriterProgressListener(PrintWriter writer, int detailLevel) + { + this.pw = writer; + this.detailLevel = detailLevel; + } + + + public boolean isDetail(int detail) + { + return (this.detailLevel >= detail); + } + + public void converterUpdate(int updateID, int param1, int param2) + { + if (isDetail(VERBOSE_DETAIL)) + { + switch (updateID) + { + case UPDATE_CONVERT_COMPLETE: + // catch divide by zero errors. + if (param2==0) + param2 = 1; + + pw.println(); + pw.println("Converted "+param2+" frames in "+param1+" ms ("+ + (param1/param2)+" ms per frame.)"); + } + } + } + + public void parsedFrame(int frameNo, Header header) + { + if ((frameNo==0) && isDetail(VERBOSE_DETAIL)) + { + String headerString = header.toString(); + pw.println("File is a "+headerString); + } + else if (isDetail(MAX_DETAIL)) + { + String headerString = header.toString(); + pw.println("Prased frame "+frameNo+": "+headerString); + } + } + + public void readFrame(int frameNo, Header header) + { + if ((frameNo==0) && isDetail(VERBOSE_DETAIL)) + { + String headerString = header.toString(); + pw.println("File is a "+headerString); + } + else if (isDetail(MAX_DETAIL)) + { + String headerString = header.toString(); + pw.println("Read frame "+frameNo+": "+headerString); + } + } + + public void decodedFrame(int frameNo, Header header, Obuffer o) + { + if (isDetail(MAX_DETAIL)) + { + String headerString = header.toString(); + pw.println("Decoded frame "+frameNo+": "+headerString); + pw.println("Output: "+o); + } + else if (isDetail(VERBOSE_DETAIL)) + { + if (frameNo==0) + { + pw.print("Converting."); + pw.flush(); + } + + if ((frameNo % 10)==0) + { + pw.print('.'); + pw.flush(); + } + } + } + + public boolean converterException(Throwable t) + { + if (this.detailLevel>NO_DETAIL) + { + t.printStackTrace(pw); + pw.flush(); + } + return false; + } + + } + + +} \ No newline at end of file diff --git a/src/javazoom/jl/converter/RiffFile.java b/src/javazoom/jl/converter/RiffFile.java new file mode 100644 index 0000000..fb5d9e5 --- /dev/null +++ b/src/javazoom/jl/converter/RiffFile.java @@ -0,0 +1,495 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 02/23/99 JavaConversion by E.B + * Don Cross, April 1993. + * RIFF file format classes. + * See Chapter 8 of "Multimedia Programmer's Reference" in + * the Microsoft Windows SDK. + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.converter; + +import java.io.IOException; +import java.io.RandomAccessFile; + + +/** + * Class to manage RIFF files + */ +public class RiffFile +{ + class RiffChunkHeader + { + public int ckID = 0; // Four-character chunk ID + public int ckSize = 0; // Length of data in chunk + public RiffChunkHeader() + {} + } + + + // DDCRET + public static final int DDC_SUCCESS = 0; // The operation succeded + public static final int DDC_FAILURE = 1; // The operation failed for unspecified reasons + public static final int DDC_OUT_OF_MEMORY = 2; // Operation failed due to running out of memory + public static final int DDC_FILE_ERROR = 3; // Operation encountered file I/O error + public static final int DDC_INVALID_CALL = 4; // Operation was called with invalid parameters + public static final int DDC_USER_ABORT = 5; // Operation was aborted by the user + public static final int DDC_INVALID_FILE = 6; // File format does not match + + // RiffFileMode + public static final int RFM_UNKNOWN = 0; // undefined type (can use to mean "N/A" or "not open") + public static final int RFM_WRITE = 1; // open for write + public static final int RFM_READ = 2; // open for read + + private RiffChunkHeader riff_header; // header for whole file + protected int fmode; // current file I/O mode + protected RandomAccessFile file; // I/O stream to use + + /** + * Dummy Constructor + */ + public RiffFile() + { + file = null; + fmode = RFM_UNKNOWN; + riff_header = new RiffChunkHeader(); + + riff_header.ckID = FourCC("RIFF"); + riff_header.ckSize = 0; + } + + /** + * Return File Mode. + */ + public int CurrentFileMode() + {return fmode;} + + /** + * Open a RIFF file. + */ + public int Open(String Filename, int NewMode) + { + int retcode = DDC_SUCCESS; + + if ( fmode != RFM_UNKNOWN ) + { + retcode = Close(); + } + + if ( retcode == DDC_SUCCESS ) + { + switch ( NewMode ) + { + case RFM_WRITE: + try + { + file = new RandomAccessFile(Filename,"rw"); + + try + { + // Write the RIFF header... + // We will have to come back later and patch it! + byte[] br = new byte[8]; + br[0] = (byte) ((riff_header.ckID >>> 24) & 0x000000FF); + br[1] = (byte) ((riff_header.ckID >>> 16) & 0x000000FF); + br[2] = (byte) ((riff_header.ckID >>> 8) & 0x000000FF); + br[3] = (byte) (riff_header.ckID & 0x000000FF); + + byte br4 = (byte) ((riff_header.ckSize >>> 24)& 0x000000FF); + byte br5 = (byte) ((riff_header.ckSize >>> 16)& 0x000000FF); + byte br6 = (byte) ((riff_header.ckSize >>> 8)& 0x000000FF); + byte br7 = (byte) (riff_header.ckSize & 0x000000FF); + + br[4] = br7; + br[5] = br6; + br[6] = br5; + br[7] = br4; + + file.write(br,0,8); + fmode = RFM_WRITE; + } catch (IOException ioe) + { + file.close(); + fmode = RFM_UNKNOWN; + } + } catch (IOException ioe) + { + fmode = RFM_UNKNOWN; + retcode = DDC_FILE_ERROR; + } + break; + + case RFM_READ: + try + { + file = new RandomAccessFile(Filename,"r"); + try + { + // Try to read the RIFF header... + byte[] br = new byte[8]; + file.read(br,0,8); + fmode = RFM_READ; + riff_header.ckID = ((br[0]<<24)& 0xFF000000) | ((br[1]<<16)&0x00FF0000) | ((br[2]<<8)&0x0000FF00) | (br[3]&0x000000FF); + riff_header.ckSize = ((br[4]<<24)& 0xFF000000) | ((br[5]<<16)&0x00FF0000) | ((br[6]<<8)&0x0000FF00) | (br[7]&0x000000FF); + } catch (IOException ioe) + { + file.close(); + fmode = RFM_UNKNOWN; + } + } catch (IOException ioe) + { + fmode = RFM_UNKNOWN; + retcode = DDC_FILE_ERROR; + } + break; + default: + retcode = DDC_INVALID_CALL; + } + } + return retcode; + } + + /** + * Write NumBytes data. + */ + public int Write(byte[] Data, int NumBytes ) + { + if ( fmode != RFM_WRITE ) + { + return DDC_INVALID_CALL; + } + try + { + file.write(Data,0,NumBytes); + fmode = RFM_WRITE; + } + catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + riff_header.ckSize += NumBytes; + return DDC_SUCCESS; + } + + + + /** + * Write NumBytes data. + */ + public int Write(short[] Data, int NumBytes ) + { + byte[] theData = new byte[NumBytes]; + int yc = 0; + for (int y = 0;y>> 8) & 0x00FF); + } + if ( fmode != RFM_WRITE ) + { + return DDC_INVALID_CALL; + } + try + { + file.write(theData,0,NumBytes); + fmode = RFM_WRITE; + } + catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + riff_header.ckSize += NumBytes; + return DDC_SUCCESS; + } + + /** + * Write NumBytes data. + */ + public int Write(RiffChunkHeader Triff_header, int NumBytes ) + { + byte[] br = new byte[8]; + br[0] = (byte) ((Triff_header.ckID >>> 24) & 0x000000FF); + br[1] = (byte) ((Triff_header.ckID >>> 16) & 0x000000FF); + br[2] = (byte) ((Triff_header.ckID >>> 8) & 0x000000FF); + br[3] = (byte) (Triff_header.ckID & 0x000000FF); + + byte br4 = (byte) ((Triff_header.ckSize >>> 24)& 0x000000FF); + byte br5 = (byte) ((Triff_header.ckSize >>> 16)& 0x000000FF); + byte br6 = (byte) ((Triff_header.ckSize >>> 8)& 0x000000FF); + byte br7 = (byte) (Triff_header.ckSize & 0x000000FF); + + br[4] = br7; + br[5] = br6; + br[6] = br5; + br[7] = br4; + + if ( fmode != RFM_WRITE ) + { + return DDC_INVALID_CALL; + } + try + { + file.write(br,0,NumBytes); + fmode = RFM_WRITE; + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + riff_header.ckSize += NumBytes; + return DDC_SUCCESS; + } + + /** + * Write NumBytes data. + */ + public int Write(short Data, int NumBytes ) + { + short theData = (short) ( ((Data>>>8)&0x00FF) | ((Data<<8)&0xFF00) ); + if ( fmode != RFM_WRITE ) + { + return DDC_INVALID_CALL; + } + try + { + file.writeShort(theData); + fmode = RFM_WRITE; + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + riff_header.ckSize += NumBytes; + return DDC_SUCCESS; + } + /** + * Write NumBytes data. + */ + public int Write(int Data, int NumBytes ) + { + short theDataL = (short) ((Data>>>16)&0x0000FFFF); + short theDataR = (short) (Data&0x0000FFFF); + short theDataLI = (short) ( ((theDataL>>>8)&0x00FF) | ((theDataL<<8)&0xFF00) ); + short theDataRI = (short) ( ((theDataR>>>8)&0x00FF) | ((theDataR<<8)&0xFF00) ); + int theData = ((theDataRI<<16)&0xFFFF0000) | (theDataLI&0x0000FFFF); + if ( fmode != RFM_WRITE ) + { + return DDC_INVALID_CALL; + } + try + { + file.writeInt(theData); + fmode = RFM_WRITE; + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + riff_header.ckSize += NumBytes; + return DDC_SUCCESS; + } + + + + /** + * Read NumBytes data. + */ + public int Read (byte[] Data, int NumBytes) + { + int retcode = DDC_SUCCESS; + try + { + file.read(Data,0,NumBytes); + } catch (IOException ioe) + { + retcode = DDC_FILE_ERROR; + } + return retcode; + } + + /** + * Expect NumBytes data. + */ + public int Expect(String Data, int NumBytes ) + { + byte target = 0; + int cnt = 0; + try + { + while ((NumBytes--) != 0) + { + target = file.readByte(); + if (target != Data.charAt(cnt++)) return DDC_FILE_ERROR; + } + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + return DDC_SUCCESS; + } + + /** + * Close Riff File. + * Length is written too. + */ + public int Close() + { + int retcode = DDC_SUCCESS; + + switch ( fmode ) + { + case RFM_WRITE: + try + { + file.seek(0); + try + { + byte[] br = new byte[8]; + br[0] = (byte) ((riff_header.ckID >>> 24) & 0x000000FF); + br[1] = (byte) ((riff_header.ckID >>> 16) & 0x000000FF); + br[2] = (byte) ((riff_header.ckID >>> 8) & 0x000000FF); + br[3] = (byte) (riff_header.ckID & 0x000000FF); + + br[7] = (byte) ((riff_header.ckSize >>> 24)& 0x000000FF); + br[6] = (byte) ((riff_header.ckSize >>> 16)& 0x000000FF); + br[5] = (byte) ((riff_header.ckSize >>> 8)& 0x000000FF); + br[4] = (byte) (riff_header.ckSize & 0x000000FF); + file.write(br,0,8); + file.close(); + } catch (IOException ioe) + { + retcode = DDC_FILE_ERROR; + } + } catch (IOException ioe) + { + retcode = DDC_FILE_ERROR; + } + break; + + case RFM_READ: + try + { + file.close(); + } catch (IOException ioe) + { + retcode = DDC_FILE_ERROR; + } + break; + } + file = null; + fmode = RFM_UNKNOWN; + return retcode; + } + + /** + * Return File Position. + */ + public long CurrentFilePosition() + { + long position; + try + { + position = file.getFilePointer(); + } catch (IOException ioe) + { + position = -1; + } + return position; + } + + /** + * Write Data to specified offset. + */ + public int Backpatch (long FileOffset, RiffChunkHeader Data, int NumBytes ) + { + if (file == null) + { + return DDC_INVALID_CALL; + } + try + { + file.seek(FileOffset); + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + return Write ( Data, NumBytes ); + } + + public int Backpatch (long FileOffset, byte[] Data, int NumBytes ) + { + if (file == null) + { + return DDC_INVALID_CALL; + } + try + { + file.seek(FileOffset); + } catch (IOException ioe) + { + return DDC_FILE_ERROR; + } + return Write ( Data, NumBytes ); + } + + + /** + * Seek in the File. + */ + protected int Seek(long offset) + { + int rc; + try + { + file.seek(offset); + rc = DDC_SUCCESS; + } catch (IOException ioe) + { + rc = DDC_FILE_ERROR; + } + return rc; + } + + /** + * Error Messages. + */ + private String DDCRET_String(int retcode) + { + switch ( retcode ) + { + case DDC_SUCCESS: return "DDC_SUCCESS"; + case DDC_FAILURE: return "DDC_FAILURE"; + case DDC_OUT_OF_MEMORY: return "DDC_OUT_OF_MEMORY"; + case DDC_FILE_ERROR: return "DDC_FILE_ERROR"; + case DDC_INVALID_CALL: return "DDC_INVALID_CALL"; + case DDC_USER_ABORT: return "DDC_USER_ABORT"; + case DDC_INVALID_FILE: return "DDC_INVALID_FILE"; + } + return "Unknown Error"; + } + + /** + * Fill the header. + */ + public static int FourCC(String ChunkName) + { + byte[] p = {0x20,0x20,0x20,0x20}; + ChunkName.getBytes(0,4,p,0); + int ret = (((p[0] << 24)& 0xFF000000) | ((p[1] << 16)&0x00FF0000) | ((p[2] << 8)&0x0000FF00) | (p[3]&0x000000FF)); + return ret; + } + +} diff --git a/src/javazoom/jl/converter/WaveFile.java b/src/javazoom/jl/converter/WaveFile.java new file mode 100644 index 0000000..f158d7a --- /dev/null +++ b/src/javazoom/jl/converter/WaveFile.java @@ -0,0 +1,522 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 02/23/99 JavaConversion by E.B + * Don Cross, April 1993. + * RIFF file format classes. + * See Chapter 8 of "Multimedia Programmer's Reference" in + * the Microsoft Windows SDK. + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.converter; + +/** + * Class allowing WaveFormat Access + */ +public class WaveFile extends RiffFile +{ + public static final int MAX_WAVE_CHANNELS = 2; + + class WaveFormat_ChunkData + { + public short wFormatTag = 0; // Format category (PCM=1) + public short nChannels = 0; // Number of channels (mono=1, stereo=2) + public int nSamplesPerSec = 0; // Sampling rate [Hz] + public int nAvgBytesPerSec = 0; + public short nBlockAlign = 0; + public short nBitsPerSample = 0; + + public WaveFormat_ChunkData() + { + wFormatTag = 1; // PCM + Config(44100,(short)16,(short)1); + } + + public void Config (int NewSamplingRate, short NewBitsPerSample, short NewNumChannels) + { + nSamplesPerSec = NewSamplingRate; + nChannels = NewNumChannels; + nBitsPerSample = NewBitsPerSample; + nAvgBytesPerSec = (nChannels * nSamplesPerSec * nBitsPerSample) / 8; + nBlockAlign = (short) ((nChannels * nBitsPerSample) / 8); + } + } + + + class WaveFormat_Chunk + { + public RiffChunkHeader header; + public WaveFormat_ChunkData data; + + public WaveFormat_Chunk() + { + header = new RiffChunkHeader(); + data = new WaveFormat_ChunkData(); + header.ckID = FourCC("fmt "); + header.ckSize = 16; + } + + public int VerifyValidity() + { + boolean ret = header.ckID == FourCC("fmt ") && + + (data.nChannels == 1 || data.nChannels == 2) && + + data.nAvgBytesPerSec == ( data.nChannels * + data.nSamplesPerSec * + data.nBitsPerSample ) / 8 && + + data.nBlockAlign == ( data.nChannels * + data.nBitsPerSample ) / 8; + if (ret == true) return 1; + else return 0; + } + } + + public class WaveFileSample + { + public short[] chan; + + public WaveFileSample() + {chan = new short[WaveFile.MAX_WAVE_CHANNELS];} + } + + private WaveFormat_Chunk wave_format; + private RiffChunkHeader pcm_data; + private long pcm_data_offset = 0; // offset of 'pcm_data' in output file + private int num_samples = 0; + + + /** + * Constructs a new WaveFile instance. + */ + public WaveFile() + { + pcm_data = new RiffChunkHeader(); + wave_format = new WaveFormat_Chunk(); + pcm_data.ckID = FourCC("data"); + pcm_data.ckSize = 0; + num_samples = 0; + } + + /** + * + * + public int OpenForRead (String Filename) + { + // Verify filename parameter as best we can... + if (Filename == null) + { + return DDC_INVALID_CALL; + } + int retcode = Open ( Filename, RFM_READ ); + + if ( retcode == DDC_SUCCESS ) + { + retcode = Expect ( "WAVE", 4 ); + + if ( retcode == DDC_SUCCESS ) + { + retcode = Read(wave_format,24); + + if ( retcode == DDC_SUCCESS && !wave_format.VerifyValidity() ) + { + // This isn't standard PCM, so we don't know what it is! + retcode = DDC_FILE_ERROR; + } + + if ( retcode == DDC_SUCCESS ) + { + pcm_data_offset = CurrentFilePosition(); + + // Figure out number of samples from + // file size, current file position, and + // WAVE header. + retcode = Read (pcm_data, 8 ); + num_samples = filelength(fileno(file)) - CurrentFilePosition(); + num_samples /= NumChannels(); + num_samples /= (BitsPerSample() / 8); + } + } + } + return retcode; + }*/ + + /** + * + */ + public int OpenForWrite (String Filename, int SamplingRate, short BitsPerSample, short NumChannels) + { + // Verify parameters... + if ( (Filename==null) || + (BitsPerSample != 8 && BitsPerSample != 16) || + NumChannels < 1 || NumChannels > 2 ) + { + return DDC_INVALID_CALL; + } + + wave_format.data.Config ( SamplingRate, BitsPerSample, NumChannels ); + + int retcode = Open ( Filename, RFM_WRITE ); + + if ( retcode == DDC_SUCCESS ) + { + byte [] theWave = {(byte)'W',(byte)'A',(byte)'V',(byte)'E'}; + retcode = Write ( theWave, 4 ); + + if ( retcode == DDC_SUCCESS ) + { + // Ecriture de wave_format + retcode = Write (wave_format.header, 8); + retcode = Write (wave_format.data.wFormatTag, 2); + retcode = Write (wave_format.data.nChannels, 2); + retcode = Write (wave_format.data.nSamplesPerSec, 4); + retcode = Write (wave_format.data.nAvgBytesPerSec, 4); + retcode = Write (wave_format.data.nBlockAlign, 2); + retcode = Write (wave_format.data.nBitsPerSample, 2); + /* byte[] br = new byte[16]; + br[0] = (byte) ((wave_format.data.wFormatTag >> 8) & 0x00FF); + br[1] = (byte) (wave_format.data.wFormatTag & 0x00FF); + + br[2] = (byte) ((wave_format.data.nChannels >> 8) & 0x00FF); + br[3] = (byte) (wave_format.data.nChannels & 0x00FF); + + br[4] = (byte) ((wave_format.data.nSamplesPerSec >> 24)& 0x000000FF); + br[5] = (byte) ((wave_format.data.nSamplesPerSec >> 16)& 0x000000FF); + br[6] = (byte) ((wave_format.data.nSamplesPerSec >> 8)& 0x000000FF); + br[7] = (byte) (wave_format.data.nSamplesPerSec & 0x000000FF); + + br[8] = (byte) ((wave_format.data.nAvgBytesPerSec>> 24)& 0x000000FF); + br[9] = (byte) ((wave_format.data.nAvgBytesPerSec >> 16)& 0x000000FF); + br[10] = (byte) ((wave_format.data.nAvgBytesPerSec >> 8)& 0x000000FF); + br[11] = (byte) (wave_format.data.nAvgBytesPerSec & 0x000000FF); + + br[12] = (byte) ((wave_format.data.nBlockAlign >> 8) & 0x00FF); + br[13] = (byte) (wave_format.data.nBlockAlign & 0x00FF); + + br[14] = (byte) ((wave_format.data.nBitsPerSample >> 8) & 0x00FF); + br[15] = (byte) (wave_format.data.nBitsPerSample & 0x00FF); + retcode = Write (br, 16); */ + + + if ( retcode == DDC_SUCCESS ) + { + pcm_data_offset = CurrentFilePosition(); + retcode = Write ( pcm_data, 8 ); + } + } + } + + return retcode; + } + + /** + * + * + public int ReadSample ( short[] Sample ) + { + + }*/ + + /** + * + * + public int WriteSample( short[] Sample ) + { + int retcode = DDC_SUCCESS; + switch ( wave_format.data.nChannels ) + { + case 1: + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + pcm_data.ckSize += 1; + retcode = Write ( Sample, 1 ); + break; + + case 16: + pcm_data.ckSize += 2; + retcode = Write ( Sample, 2 ); + break; + + default: + retcode = DDC_INVALID_CALL; + } + break; + + case 2: + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + retcode = Write ( Sample, 1 ); + if ( retcode == DDC_SUCCESS ) + { + // &Sample[1] + retcode = Write (Sample, 1 ); + if ( retcode == DDC_SUCCESS ) + { + pcm_data.ckSize += 2; + } + } + break; + + case 16: + retcode = Write ( Sample, 2 ); + if ( retcode == DDC_SUCCESS ) + { + // &Sample[1] + retcode = Write (Sample, 2 ); + if ( retcode == DDC_SUCCESS ) + { + pcm_data.ckSize += 4; + } + } + break; + + default: + retcode = DDC_INVALID_CALL; + } + break; + + default: + retcode = DDC_INVALID_CALL; + } + + return retcode; + }*/ + + /** + * + * + public int SeekToSample ( long SampleIndex ) + { + if ( SampleIndex >= NumSamples() ) + { + return DDC_INVALID_CALL; + } + int SampleSize = (BitsPerSample() + 7) / 8; + int rc = Seek ( pcm_data_offset + 8 + + SampleSize * NumChannels() * SampleIndex ); + return rc; + }*/ + + /** + * Write 16-bit audio + */ + public int WriteData ( short[] data, int numData ) + { + int extraBytes = numData * 2; + pcm_data.ckSize += extraBytes; + return super.Write ( data, extraBytes ); + } + + /** + * Read 16-bit audio. + * + public int ReadData (short[] data, int numData) + {return super.Read ( data, numData * 2);} */ + + /** + * Write 8-bit audio. + * + public int WriteData ( byte[] data, int numData ) + { + pcm_data.ckSize += numData; + return super.Write ( data, numData ); + }*/ + + /** + * Read 8-bit audio. + * + public int ReadData ( byte[] data, int numData ) + {return super.Read ( data, numData );} */ + + + /** + * + * + public int ReadSamples (int num, int [] WaveFileSample) + { + + }*/ + + /** + * + * + public int WriteMonoSample ( short[] SampleData ) + { + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + pcm_data.ckSize += 1; + return Write ( SampleData, 1 ); + + case 16: + pcm_data.ckSize += 2; + return Write ( SampleData, 2 ); + } + return DDC_INVALID_CALL; + }*/ + + /** + * + * + public int WriteStereoSample ( short[] LeftSample, short[] RightSample ) + { + int retcode = DDC_SUCCESS; + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + retcode = Write ( LeftSample, 1 ); + if ( retcode == DDC_SUCCESS ) + { + retcode = Write ( RightSample, 1 ); + if ( retcode == DDC_SUCCESS ) + { + pcm_data.ckSize += 2; + } + } + break; + + case 16: + retcode = Write ( LeftSample, 2 ); + if ( retcode == DDC_SUCCESS ) + { + retcode = Write ( RightSample, 2 ); + if ( retcode == DDC_SUCCESS ) + { + pcm_data.ckSize += 4; + } + } + break; + + default: + retcode = DDC_INVALID_CALL; + } + return retcode; + }*/ + + /** + * + * + public int ReadMonoSample ( short[] Sample ) + { + int retcode = DDC_SUCCESS; + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + byte[] x = {0}; + retcode = Read ( x, 1 ); + Sample[0] = (short)(x[0]); + break; + + case 16: + retcode = Read ( Sample, 2 ); + break; + + default: + retcode = DDC_INVALID_CALL; + } + return retcode; + }*/ + + /** + * + * + public int ReadStereoSample ( short[] LeftSampleData, short[] RightSampleData ) + { + int retcode = DDC_SUCCESS; + byte[] x = new byte[2]; + short[] y = new short[2]; + switch ( wave_format.data.nBitsPerSample ) + { + case 8: + retcode = Read ( x, 2 ); + L[0] = (short) ( x[0] ); + R[0] = (short) ( x[1] ); + break; + + case 16: + retcode = Read ( y, 4 ); + L[0] = (short) ( y[0] ); + R[0] = (short) ( y[1] ); + break; + + default: + retcode = DDC_INVALID_CALL; + } + return retcode; + }*/ + + + /** + * + */ + public int Close() + { + int rc = DDC_SUCCESS; + + if ( fmode == RFM_WRITE ) + rc = Backpatch ( pcm_data_offset, pcm_data, 8 ); + if ( rc == DDC_SUCCESS ) + rc = super.Close(); + return rc; + } + + // [Hz] + public int SamplingRate() + {return wave_format.data.nSamplesPerSec;} + + public short BitsPerSample() + {return wave_format.data.nBitsPerSample;} + + public short NumChannels() + {return wave_format.data.nChannels;} + + public int NumSamples() + {return num_samples;} + + + /** + * Open for write using another wave file's parameters... + */ + public int OpenForWrite (String Filename, WaveFile OtherWave ) + { + return OpenForWrite ( Filename, + OtherWave.SamplingRate(), + OtherWave.BitsPerSample(), + OtherWave.NumChannels() ); + } + + /** + * + */ + public long CurrentFilePosition() + { + return super.CurrentFilePosition(); + } + + /* public int FourCC(String ChunkName) + { + byte[] p = {0x20,0x20,0x20,0x20}; + ChunkName.getBytes(0,4,p,0); + int ret = (((p[0] << 24)& 0xFF000000) | ((p[1] << 16)&0x00FF0000) | ((p[2] << 8)&0x0000FF00) | (p[3]&0x000000FF)); + return ret; + }*/ + +} \ No newline at end of file diff --git a/src/javazoom/jl/converter/WaveFileObuffer.java b/src/javazoom/jl/converter/WaveFileObuffer.java new file mode 100644 index 0000000..eaa1dd4 --- /dev/null +++ b/src/javazoom/jl/converter/WaveFileObuffer.java @@ -0,0 +1,141 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 0.0.7 Renamed class, additional constructor arguments + * and larger write buffers. mdm@techie.com. + * + * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.converter; + +import javazoom.jl.decoder.Obuffer; + +/** + * Implements an Obuffer by writing the data to + * a file in RIFF WAVE format. + * + * @since 0.0 + */ + + +public class WaveFileObuffer extends Obuffer +{ + private short[] buffer; + private short[] bufferp; + private int channels; + private WaveFile outWave; + + /** + * Creates a new WareFileObuffer instance. + * + * @param number_of_channels + * The number of channels of audio data + * this buffer will receive. + * + * @param freq The sample frequency of the samples in the buffer. + * + * @param fileName The filename to write the data to. + */ + public WaveFileObuffer(int number_of_channels, int freq, String FileName) + { + if (FileName==null) + throw new NullPointerException("FileName"); + + buffer = new short[OBUFFERSIZE]; + bufferp = new short[MAXCHANNELS]; + channels = number_of_channels; + + for (int i = 0; i < number_of_channels; ++i) + bufferp[i] = (short)i; + + outWave = new WaveFile(); + + int rc = outWave.OpenForWrite (FileName,freq,(short)16,(short)channels); + } + + /** + * Takes a 16 Bit PCM sample. + */ + public void append(int channel, short value) + { + buffer[bufferp[channel]] = value; + bufferp[channel] += channels; + } + + /** + * Write the samples to the file (Random Acces). + */ + short[] myBuffer = new short[2]; + public void write_buffer(int val) + { + + int k = 0; + int rc = 0; + + rc = outWave.WriteData(buffer, bufferp[0]); + // REVIEW: handle RiffFile errors. + /* + for (int j=0;j>8)&0x000000FF) | ((buffer[j]<<8)&0x0000FF00)); + //myBuffer[1] = (short) (((buffer[j+1]>>8)&0x000000FF) | ((buffer[j+1]<<8)&0x0000FF00)); + myBuffer[0] = buffer[j]; + myBuffer[1] = buffer[j+1]; + rc = outWave.WriteData (myBuffer,2); + } + */ + for (int i = 0; i < channels; ++i) bufferp[i] = (short)i; + } + + public void close() + { + outWave.Close(); + } + + /** + * + */ + public void clear_buffer() + {} + + /** + * + */ + public void set_stop_flag() + {} + + /* + * Create STDOUT buffer + * + * + public static Obuffer create_stdout_obuffer(MPEG_Args maplay_args) + { + Obuffer thebuffer = null; + int mode = maplay_args.MPEGheader.mode(); + int which_channels = maplay_args.which_c; + if (mode == Header.single_channel || which_channels != MPEG_Args.both) + thebuffer = new FileObuffer(1,maplay_args.output_filename); + else + thebuffer = new FileObuffer(2,maplay_args.output_filename); + return(thebuffer); + } + */ +} diff --git a/src/javazoom/jl/converter/jlc.java b/src/javazoom/jl/converter/jlc.java new file mode 100644 index 0000000..57c84eb --- /dev/null +++ b/src/javazoom/jl/converter/jlc.java @@ -0,0 +1,216 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 29/01/00 Initial version. mdm@techie.com + * + * 12/12/99 JavaLayer 0.0.7 mdm@techie.com + * + * 14/02/99 MPEG_Args Based Class - E.B + * Adapted from javalayer and MPEG_Args. + * Doc'ed and integerated with JL converter. Removed + * Win32 specifics from original Maplay code. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.converter; + +import java.io.PrintWriter; + +import javazoom.jl.decoder.Crc16; +import javazoom.jl.decoder.JavaLayerException; +import javazoom.jl.decoder.OutputChannels; + +/** + * The jlc class presents the JavaLayer + * Conversion functionality as a command-line program. + * + * @since 0.0.7 + */ +public class jlc +{ + + static public void main(String args[]) + { + String[] argv; + long start = System.currentTimeMillis(); + int argc = args.length + 1; + argv = new String[argc]; + argv[0] = "jlc"; + for(int i=0;i2) + { + try + { + String level = argv[i].substring(2); + verbose_level = Integer.parseInt(level); + } + catch (NumberFormatException ex) + { + System.err.println("Invalid verbose level. Using default."); + } + } + System.out.println("Verbose Activated (level "+verbose_level+")"); + } + /* else if (argv[i].equals("-s")) + ma.stdout_mode = true; */ + else if (argv[i].equals("-p")) + { + if (++i == argc) + { + System.out.println("Please specify an output filename after the -p option!"); + System.exit (1); + } + //output_mode = O_WAVEFILE; + output_filename = argv[i]; + } + /*else if (argv[i].equals("-f")) + { + if (++i == argc) + { + System.out.println("Please specify a new scalefactor after the -f option!"); + System.exit(1); + } + ma.use_own_scalefactor = true; + // ma.scalefactor = argv[i]; + }*/ + else return Usage(); + } + else + { + filename = argv[i]; + System.out.println("FileName = "+argv[i]); + if (filename == null) return Usage(); + } + i++; + } + if (filename == null) + return Usage(); + + return true; + } + + + /** + * Usage of JavaLayer. + */ + public boolean Usage() + { + System.out.println("JavaLayer Converter :"); + System.out.println(" -v[x] verbose mode. "); + System.out.println(" default = 2"); + /* System.out.println(" -s write u-law samples at 8 kHz rate to stdout"); + System.out.println(" -l decode only the left channel"); + System.out.println(" -r decode only the right channel"); + System.out.println(" -d downmix mode (layer III only)"); + System.out.println(" -s write pcm samples to stdout"); + System.out.println(" -d downmix mode (layer III only)");*/ + System.out.println(" -p name output as a PCM wave file"); + System.out.println(""); + System.out.println(" More info on http://www.javazoom.net"); + /* System.out.println(" -f ushort use this scalefactor instead of the default value 32768");*/ + return false; + } + }; +}; \ No newline at end of file diff --git a/src/javazoom/jl/decoder/BitReserve.java b/src/javazoom/jl/decoder/BitReserve.java new file mode 100644 index 0000000..a5d3056 --- /dev/null +++ b/src/javazoom/jl/decoder/BitReserve.java @@ -0,0 +1,223 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 0.0.7 Implementation stores single bits + * as ints for better performance. mdm@techie.com. + * + * 02/28/99 0.0 Java Conversion by E.B, javalayer@javazoom.net + * + * Adapted from the public c code by Jeff Tsay. + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Implementation of Bit Reservoir for Layer III. + *

+ * The implementation stores single bits as a word in the buffer. If + * a bit is set, the corresponding word in the buffer will be non-zero. + * If a bit is clear, the corresponding word is zero. Although this + * may seem waseful, this can be a factor of two quicker than + * packing 8 bits to a byte and extracting. + *

+ */ + +// REVIEW: there is no range checking, so buffer underflow or overflow +// can silently occur. +final class BitReserve +{ + /** + * Size of the internal buffer to store the reserved bits. + * Must be a power of 2. And x8, as each bit is stored as a single + * entry. + */ + private static final int BUFSIZE = 4096*8; + + /** + * Mask that can be used to quickly implement the + * modulus operation on BUFSIZE. + */ + private static final int BUFSIZE_MASK = BUFSIZE-1; + + private int offset, totbit, buf_byte_idx; + private final int[] buf = new int[BUFSIZE]; + private int buf_bit_idx; + + BitReserve() + { + + offset = 0; + totbit = 0; + buf_byte_idx = 0; + } + + + /** + * Return totbit Field. + */ + public int hsstell() + { + return(totbit); + } + + /** + * Read a number bits from the bit stream. + * @param N the number of + */ + public int hgetbits(int N) + { + totbit += N; + + int val = 0; + + int pos = buf_byte_idx; + if (pos+N < BUFSIZE) + { + while (N-- > 0) + { + val <<= 1; + val |= ((buf[pos++]!=0) ? 1 : 0); + } + } + else + { + while (N-- > 0) + { + val <<= 1; + val |= ((buf[pos]!=0) ? 1 : 0); + pos = (pos+1) & BUFSIZE_MASK; + } + } + buf_byte_idx = pos; + return val; + } + + + + /** + * Read 1 bit from the bit stream. + */ +/* + public int hget1bit_old() + { + int val; + totbit++; + if (buf_bit_idx == 0) + { + buf_bit_idx = 8; + buf_byte_idx++; + } + // BUFSIZE = 4096 = 2^12, so + // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff + val = buf[buf_byte_idx & BUFSIZE_MASK] & putmask[buf_bit_idx]; + buf_bit_idx--; + val = val >>> buf_bit_idx; + return val; + } + */ + /** + * Returns next bit from reserve. + * @returns 0 if next bit is reset, or 1 if next bit is set. + */ + public int hget1bit() + { + totbit++; + int val = buf[buf_byte_idx]; + buf_byte_idx = (buf_byte_idx+1) & BUFSIZE_MASK; + return val; + } + + /** + * Retrieves bits from the reserve. + */ +/* + public int readBits(int[] out, int len) + { + if (buf_bit_idx == 0) + { + buf_bit_idx = 8; + buf_byte_idx++; + current = buf[buf_byte_idx & BUFSIZE_MASK]; + } + + + + // save total number of bits returned + len = buf_bit_idx; + buf_bit_idx = 0; + + int b = current; + int count = len-1; + + while (count >= 0) + { + out[count--] = (b & 0x1); + b >>>= 1; + } + + totbit += len; + return len; + } + */ + + /** + * Write 8 bits into the bit stream. + */ + public void hputbuf(int val) + { + int ofs = offset; + buf[ofs++] = val & 0x80; + buf[ofs++] = val & 0x40; + buf[ofs++] = val & 0x20; + buf[ofs++] = val & 0x10; + buf[ofs++] = val & 0x08; + buf[ofs++] = val & 0x04; + buf[ofs++] = val & 0x02; + buf[ofs++] = val & 0x01; + + if (ofs==BUFSIZE) + offset = 0; + else + offset = ofs; + + } + + /** + * Rewind N bits in Stream. + */ + public void rewindNbits(int N) + { + totbit -= N; + buf_byte_idx -= N; + if (buf_byte_idx<0) + buf_byte_idx += BUFSIZE; + } + + /** + * Rewind N bytes in Stream. + */ + public void rewindNbytes(int N) + { + int bits = (N << 3); + totbit -= bits; + buf_byte_idx -= bits; + if (buf_byte_idx<0) + buf_byte_idx += BUFSIZE; + } +} diff --git a/src/javazoom/jl/decoder/Bitstream.java b/src/javazoom/jl/decoder/Bitstream.java new file mode 100644 index 0000000..cebbd5b --- /dev/null +++ b/src/javazoom/jl/decoder/Bitstream.java @@ -0,0 +1,655 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 11/17/04 Uncomplete frames discarded. E.B, javalayer@javazoom.net + * + * 12/05/03 ID3v2 tag returned. E.B, javalayer@javazoom.net + * + * 12/12/99 Based on Ibitstream. Exceptions thrown on errors, + * Temporary removed seek functionality. mdm@techie.com + * + * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net + * + * 04/14/97 : Added function prototypes for new syncing and seeking + * mechanisms. Also made this file portable. Changes made by Jeff Tsay + * + * @(#) ibitstream.h 1.5, last edit: 6/15/94 16:55:34 + * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) + * @(#) Berlin University of Technology + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PushbackInputStream; + + +/** + * The Bistream class is responsible for parsing + * an MPEG audio bitstream. + * + * REVIEW: much of the parsing currently occurs in the + * various decoders. This should be moved into this class and associated + * inner classes. + */ +public final class Bitstream implements BitstreamErrors +{ + /** + * Synchronization control constant for the initial + * synchronization to the start of a frame. + */ + static byte INITIAL_SYNC = 0; + + /** + * Synchronization control constant for non-initial frame + * synchronizations. + */ + static byte STRICT_SYNC = 1; + + // max. 1730 bytes per frame: 144 * 384kbit/s / 32000 Hz + 2 Bytes CRC + /** + * Maximum size of the frame buffer. + */ + private static final int BUFFER_INT_SIZE = 433; + + /** + * The frame buffer that holds the data for the current frame. + */ + private final int[] framebuffer = new int[BUFFER_INT_SIZE]; + + /** + * Number of valid bytes in the frame buffer. + */ + private int framesize; + + /** + * The bytes read from the stream. + */ + private byte[] frame_bytes = new byte[BUFFER_INT_SIZE*4]; + + /** + * Index into framebuffer where the next bits are + * retrieved. + */ + private int wordpointer; + + /** + * Number (0-31, from MSB to LSB) of next bit for get_bits() + */ + private int bitindex; + + /** + * The current specified syncword + */ + private int syncword; + + /** + * Audio header position in stream. + */ + private int header_pos = 0; + + /** + * + */ + private boolean single_ch_mode; + //private int current_frame_number; + //private int last_frame_number; + + private final int bitmask[] = {0, // dummy + 0x00000001, 0x00000003, 0x00000007, 0x0000000F, + 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, + 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, + 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, + 0x0001FFFF }; + + private final PushbackInputStream source; + + private final Header header = new Header(); + + private final byte syncbuf[] = new byte[4]; + + private Crc16[] crc = new Crc16[1]; + + private byte[] rawid3v2 = null; + + private boolean firstframe = true; + + + /** + * Construct a IBitstream that reads data from a + * given InputStream. + * + * @param in The InputStream to read from. + */ + public Bitstream(InputStream in) + { + if (in==null) throw new NullPointerException("in"); + in = new BufferedInputStream(in); + loadID3v2(in); + firstframe = true; + //source = new PushbackInputStream(in, 1024); + source = new PushbackInputStream(in, BUFFER_INT_SIZE*4); + + closeFrame(); + //current_frame_number = -1; + //last_frame_number = -1; + } + + /** + * Return position of the first audio header. + * @return size of ID3v2 tag frames. + */ + public int header_pos() + { + return header_pos; + } + + /** + * Load ID3v2 frames. + * @param in MP3 InputStream. + * @author JavaZOOM + */ + private void loadID3v2(InputStream in) + { + int size = -1; + try + { + // Read ID3v2 header (10 bytes). + in.mark(10); + size = readID3v2Header(in); + header_pos = size; + } + catch (IOException e) + {} + finally + { + try + { + // Unread ID3v2 header (10 bytes). + in.reset(); + } + catch (IOException e) + {} + } + // Load ID3v2 tags. + try + { + if (size > 0) + { + rawid3v2 = new byte[size]; + in.read(rawid3v2,0,rawid3v2.length); + } + } + catch (IOException e) + {} + } + + /** + * Parse ID3v2 tag header to find out size of ID3v2 frames. + * @param in MP3 InputStream + * @return size of ID3v2 frames + header + * @throws IOException + * @author JavaZOOM + */ + private int readID3v2Header(InputStream in) throws IOException + { + byte[] id3header = new byte[4]; + int size = -10; + in.read(id3header,0,3); + // Look for ID3v2 + if ( (id3header[0]=='I') && (id3header[1]=='D') && (id3header[2]=='3')) + { + in.read(id3header,0,3); + int majorVersion = id3header[0]; + int revision = id3header[1]; + in.read(id3header,0,4); + size = (int) (id3header[0] << 21) + (id3header[1] << 14) + (id3header[2] << 7) + (id3header[3]); + } + return (size+10); + } + + /** + * Return raw ID3v2 frames + header. + * @return ID3v2 InputStream or null if ID3v2 frames are not available. + */ + public InputStream getRawID3v2() + { + if (rawid3v2 == null) return null; + else + { + ByteArrayInputStream bain = new ByteArrayInputStream(rawid3v2); + return bain; + } + } + + /** + * Close the Bitstream. + * @throws BitstreamException + */ + public void close() throws BitstreamException + { + try + { + source.close(); + } + catch (IOException ex) + { + throw newBitstreamException(STREAM_ERROR, ex); + } + } + + /** + * Reads and parses the next frame from the input source. + * @return the Header describing details of the frame read, + * or null if the end of the stream has been reached. + */ + public Header readFrame() throws BitstreamException + { + Header result = null; + try + { + result = readNextFrame(); + // E.B, Parse VBR (if any) first frame. + if (firstframe == true) + { + result.parseVBR(frame_bytes); + firstframe = false; + } + } + catch (BitstreamException ex) + { + if ((ex.getErrorCode()==INVALIDFRAME)) + { + // Try to skip this frame. + //System.out.println("INVALIDFRAME"); + try + { + closeFrame(); + result = readNextFrame(); + } + catch (BitstreamException e) + { + if ((e.getErrorCode()!=STREAM_EOF)) + { + // wrap original exception so stack trace is maintained. + throw newBitstreamException(e.getErrorCode(), e); + } + } + } + else if ((ex.getErrorCode()!=STREAM_EOF)) + { + // wrap original exception so stack trace is maintained. + throw newBitstreamException(ex.getErrorCode(), ex); + } + } + return result; + } + + /** + * Read next MP3 frame. + * @return MP3 frame header. + * @throws BitstreamException + */ + private Header readNextFrame() throws BitstreamException + { + if (framesize == -1) + { + nextFrame(); + } + return header; + } + + + /** + * Read next MP3 frame. + * @throws BitstreamException + */ + private void nextFrame() throws BitstreamException + { + // entire frame is read by the header class. + header.read_header(this, crc); + } + + /** + * Unreads the bytes read from the frame. + * @throws BitstreamException + */ + // REVIEW: add new error codes for this. + public void unreadFrame() throws BitstreamException + { + if (wordpointer==-1 && bitindex==-1 && (framesize>0)) + { + try + { + source.unread(frame_bytes, 0, framesize); + } + catch (IOException ex) + { + throw newBitstreamException(STREAM_ERROR); + } + } + } + + /** + * Close MP3 frame. + */ + public void closeFrame() + { + framesize = -1; + wordpointer = -1; + bitindex = -1; + } + + /** + * Determines if the next 4 bytes of the stream represent a + * frame header. + */ + public boolean isSyncCurrentPosition(int syncmode) throws BitstreamException + { + int read = readBytes(syncbuf, 0, 4); + int headerstring = ((syncbuf[0] << 24) & 0xFF000000) | ((syncbuf[1] << 16) & 0x00FF0000) | ((syncbuf[2] << 8) & 0x0000FF00) | ((syncbuf[3] << 0) & 0x000000FF); + + try + { + source.unread(syncbuf, 0, read); + } + catch (IOException ex) + { + } + + boolean sync = false; + switch (read) + { + case 0: + sync = true; + break; + case 4: + sync = isSyncMark(headerstring, syncmode, syncword); + break; + } + + return sync; + } + + + // REVIEW: this class should provide inner classes to + // parse the frame contents. Eventually, readBits will + // be removed. + public int readBits(int n) + { + return get_bits(n); + } + + public int readCheckedBits(int n) + { + // REVIEW: implement CRC check. + return get_bits(n); + } + + protected BitstreamException newBitstreamException(int errorcode) + { + return new BitstreamException(errorcode, null); + } + protected BitstreamException newBitstreamException(int errorcode, Throwable throwable) + { + return new BitstreamException(errorcode, throwable); + } + + /** + * Get next 32 bits from bitstream. + * They are stored in the headerstring. + * syncmod allows Synchro flag ID + * The returned value is False at the end of stream. + */ + + int syncHeader(byte syncmode) throws BitstreamException + { + boolean sync; + int headerstring; + // read additional 2 bytes + int bytesRead = readBytes(syncbuf, 0, 3); + + if (bytesRead!=3) throw newBitstreamException(STREAM_EOF, null); + + headerstring = ((syncbuf[0] << 16) & 0x00FF0000) | ((syncbuf[1] << 8) & 0x0000FF00) | ((syncbuf[2] << 0) & 0x000000FF); + + do + { + headerstring <<= 8; + + if (readBytes(syncbuf, 3, 1)!=1) + throw newBitstreamException(STREAM_EOF, null); + + headerstring |= (syncbuf[3] & 0x000000FF); + + sync = isSyncMark(headerstring, syncmode, syncword); + } + while (!sync); + + //current_frame_number++; + //if (last_frame_number < current_frame_number) last_frame_number = current_frame_number; + + return headerstring; + } + + public boolean isSyncMark(int headerstring, int syncmode, int word) + { + boolean sync = false; + + if (syncmode == INITIAL_SYNC) + { + //sync = ((headerstring & 0xFFF00000) == 0xFFF00000); + sync = ((headerstring & 0xFFE00000) == 0xFFE00000); // SZD: MPEG 2.5 + } + else + { + sync = ((headerstring & 0xFFF80C00) == word) && + (((headerstring & 0x000000C0) == 0x000000C0) == single_ch_mode); + } + + // filter out invalid sample rate + if (sync) + sync = (((headerstring >>> 10) & 3)!=3); + // filter out invalid layer + if (sync) + sync = (((headerstring >>> 17) & 3)!=0); + // filter out invalid version + if (sync) + sync = (((headerstring >>> 19) & 3)!=1); + + return sync; + } + + /** + * Reads the data for the next frame. The frame is not parsed + * until parse frame is called. + */ + int read_frame_data(int bytesize) throws BitstreamException + { + int numread = 0; + numread = readFully(frame_bytes, 0, bytesize); + framesize = bytesize; + wordpointer = -1; + bitindex = -1; + return numread; + } + + /** + * Parses the data previously read with read_frame_data(). + */ + void parse_frame() throws BitstreamException + { + // Convert Bytes read to int + int b=0; + byte[] byteread = frame_bytes; + int bytesize = framesize; + + // Check ID3v1 TAG (True only if last frame). + //for (int t=0;t<(byteread.length)-2;t++) + //{ + // if ((byteread[t]=='T') && (byteread[t+1]=='A') && (byteread[t+2]=='G')) + // { + // System.out.println("ID3v1 detected at offset "+t); + // throw newBitstreamException(INVALIDFRAME, null); + // } + //} + + for (int k=0;k>> (32 - sum)) & bitmask[number_of_bits]; + // returnvalue = (wordpointer[0] >> (32 - sum)) & bitmask[number_of_bits]; + if ((bitindex += number_of_bits) == 32) + { + bitindex = 0; + wordpointer++; // added by me! + } + return returnvalue; + } + + // E.B : Check that ? + //((short[])&returnvalue)[0] = ((short[])wordpointer + 1)[0]; + //wordpointer++; // Added by me! + //((short[])&returnvalue + 1)[0] = ((short[])wordpointer)[0]; + int Right = (framebuffer[wordpointer] & 0x0000FFFF); + wordpointer++; + int Left = (framebuffer[wordpointer] & 0xFFFF0000); + returnvalue = ((Right << 16) & 0xFFFF0000) | ((Left >>> 16)& 0x0000FFFF); + + returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 - bitindex)) + returnvalue &= bitmask[number_of_bits]; + bitindex = sum - 32; + return returnvalue; +} + + /** + * Set the word we want to sync the header to. + * In Big-Endian byte order + */ + void set_syncword(int syncword0) + { + syncword = syncword0 & 0xFFFFFF3F; + single_ch_mode = ((syncword0 & 0x000000C0) == 0x000000C0); + } + /** + * Reads the exact number of bytes from the source + * input stream into a byte array. + * + * @param b The byte array to read the specified number + * of bytes into. + * @param offs The index in the array where the first byte + * read should be stored. + * @param len the number of bytes to read. + * + * @exception BitstreamException is thrown if the specified + * number of bytes could not be read from the stream. + */ + private int readFully(byte[] b, int offs, int len) + throws BitstreamException + { + int nRead = 0; + try + { + while (len > 0) + { + int bytesread = source.read(b, offs, len); + if (bytesread == -1) + { + while (len-->0) + { + b[offs++] = 0; + } + break; + //throw newBitstreamException(UNEXPECTED_EOF, new EOFException()); + } + nRead = nRead + bytesread; + offs += bytesread; + len -= bytesread; + } + } + catch (IOException ex) + { + throw newBitstreamException(STREAM_ERROR, ex); + } + return nRead; + } + + /** + * Simlar to readFully, but doesn't throw exception when + * EOF is reached. + */ + private int readBytes(byte[] b, int offs, int len) + throws BitstreamException + { + int totalBytesRead = 0; + try + { + while (len > 0) + { + int bytesread = source.read(b, offs, len); + if (bytesread == -1) + { + break; + } + totalBytesRead += bytesread; + offs += bytesread; + len -= bytesread; + } + } + catch (IOException ex) + { + throw newBitstreamException(STREAM_ERROR, ex); + } + return totalBytesRead; + } +} diff --git a/src/javazoom/jl/decoder/BitstreamErrors.java b/src/javazoom/jl/decoder/BitstreamErrors.java new file mode 100644 index 0000000..2bdee6d --- /dev/null +++ b/src/javazoom/jl/decoder/BitstreamErrors.java @@ -0,0 +1,72 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 11/17/04 INVALIDFRAME code added. javalayer@javazoom.net + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * This interface describes all error codes that can be thrown + * in BistreamExceptions. + * + * @see BitstreamException + * + * @author MDM 12/12/99 + * @since 0.0.6 + */ + +public interface BitstreamErrors extends JavaLayerErrors +{ + + /** + * An undeterminable error occurred. + */ + static public final int UNKNOWN_ERROR = BITSTREAM_ERROR + 0; + + /** + * The header describes an unknown sample rate. + */ + static public final int UNKNOWN_SAMPLE_RATE = BITSTREAM_ERROR + 1; + + /** + * A problem occurred reading from the stream. + */ + static public final int STREAM_ERROR = BITSTREAM_ERROR + 2; + + /** + * The end of the stream was reached prematurely. + */ + static public final int UNEXPECTED_EOF = BITSTREAM_ERROR + 3; + + /** + * The end of the stream was reached. + */ + static public final int STREAM_EOF = BITSTREAM_ERROR + 4; + + /** + * Frame data are missing. + */ + static public final int INVALIDFRAME = BITSTREAM_ERROR + 5; + + /** + * + */ + static public final int BITSTREAM_LAST = 0x1ff; + +} diff --git a/src/javazoom/jl/decoder/BitstreamException.java b/src/javazoom/jl/decoder/BitstreamException.java new file mode 100644 index 0000000..99faa89 --- /dev/null +++ b/src/javazoom/jl/decoder/BitstreamException.java @@ -0,0 +1,71 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Instances of BitstreamException are thrown + * when operations on a Bitstream fail. + *

+ * The exception provides details of the exception condition + * in two ways: + *

  1. + * as an error-code describing the nature of the error + *


  2. + * as the Throwable instance, if any, that was thrown + * indicating that an exceptional condition has occurred. + *

+ * + * @since 0.0.6 + * @author MDM 12/12/99 + */ + +public class BitstreamException extends JavaLayerException + implements BitstreamErrors +{ + private int errorcode = UNKNOWN_ERROR; + + public BitstreamException(String msg, Throwable t) + { + super(msg, t); + } + + public BitstreamException(int errorcode, Throwable t) + { + this(getErrorString(errorcode), t); + this.errorcode = errorcode; + } + + public int getErrorCode() + { + return errorcode; + } + + + static public String getErrorString(int errorcode) + { + // REVIEW: use resource bundle to map error codes + // to locale-sensitive strings. + + return "Bitstream errorcode "+Integer.toHexString(errorcode); + } + + +} diff --git a/src/javazoom/jl/decoder/Control.java b/src/javazoom/jl/decoder/Control.java new file mode 100644 index 0000000..080ed52 --- /dev/null +++ b/src/javazoom/jl/decoder/Control.java @@ -0,0 +1,57 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Work in progress. + */ + +public interface Control +{ + + /** + * Starts playback of the media presented by this control. + */ + public void start(); + + /** + * Stops playback of the media presented by this control. + */ + public void stop(); + + public boolean isPlaying(); + + public void pause(); + + + public boolean isRandomAccess(); + + /** + * Retrieves the current position. + */ + public double getPosition(); + + /** + * + */ + public void setPosition(double d); + + +} diff --git a/src/javazoom/jl/decoder/Crc16.java b/src/javazoom/jl/decoder/Crc16.java new file mode 100644 index 0000000..c35cc19 --- /dev/null +++ b/src/javazoom/jl/decoder/Crc16.java @@ -0,0 +1,70 @@ +/* + * 11/19/04 : 1.0 moved to LGPL. + * + * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net + * + * @(#) crc.h 1.5, last edit: 6/15/94 16:55:32 + * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) + * @(#) Berlin University of Technology + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ +package javazoom.jl.decoder; + +/** + * 16-Bit CRC checksum + */ +public final class Crc16 +{ + private static short polynomial=(short)0x8005; + private short crc; + + /** + * Dummy Constructor + */ + public Crc16() + { + crc = (short) 0xFFFF; + } + + /** + * Feed a bitstring to the crc calculation (0 < length <= 32). + */ + public void add_bits (int bitstring, int length) + { + int bitmask = 1 << (length - 1); + do + if (((crc & 0x8000) == 0) ^ ((bitstring & bitmask) == 0 )) + { + crc <<= 1; + crc ^= polynomial; + } + else + crc <<= 1; + while ((bitmask >>>= 1) != 0); + } + + /** + * Return the calculated checksum. + * Erase it for next calls to add_bits(). + */ + public short checksum() + { + short sum = crc; + crc = (short) 0xFFFF; + return sum; + } +} diff --git a/src/javazoom/jl/decoder/Decoder.java b/src/javazoom/jl/decoder/Decoder.java new file mode 100644 index 0000000..076f9de --- /dev/null +++ b/src/javazoom/jl/decoder/Decoder.java @@ -0,0 +1,357 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * The Decoder class encapsulates the details of + * decoding an MPEG audio frame. + * + * @author MDM + * @version 0.0.7 12/12/99 + * @since 0.0.5 + */ +public class Decoder implements DecoderErrors +{ + static private final Params DEFAULT_PARAMS = new Params(); + + /** + * The Bistream from which the MPEG audio frames are read. + */ + //private Bitstream stream; + + /** + * The Obuffer instance that will receive the decoded + * PCM samples. + */ + private Obuffer output; + + /** + * Synthesis filter for the left channel. + */ + private SynthesisFilter filter1; + + /** + * Sythesis filter for the right channel. + */ + private SynthesisFilter filter2; + + /** + * The decoder used to decode layer III frames. + */ + private LayerIIIDecoder l3decoder; + private LayerIIDecoder l2decoder; + private LayerIDecoder l1decoder; + + private int outputFrequency; + private int outputChannels; + + private Equalizer equalizer = new Equalizer(); + + private Params params; + + private boolean initialized; + + + /** + * Creates a new Decoder instance with default + * parameters. + */ + + public Decoder() + { + this(null); + } + + /** + * Creates a new Decoder instance with default + * parameters. + * + * @param params The Params instance that describes + * the customizable aspects of the decoder. + */ + public Decoder(Params params0) + { + if (params0==null) + params0 = DEFAULT_PARAMS; + + params = params0; + + Equalizer eq = params.getInitialEqualizerSettings(); + if (eq!=null) + { + equalizer.setFrom(eq); + } + } + + static public Params getDefaultParams() + { + return (Params)DEFAULT_PARAMS.clone(); + } + + public void setEqualizer(Equalizer eq) + { + if (eq==null) + eq = Equalizer.PASS_THRU_EQ; + + equalizer.setFrom(eq); + + float[] factors = equalizer.getBandFactors(); + + if (filter1!=null) + filter1.setEQ(factors); + + if (filter2!=null) + filter2.setEQ(factors); + } + + /** + * Decodes one frame from an MPEG audio bitstream. + * + * @param header The header describing the frame to decode. + * @param bitstream The bistream that provides the bits for te body of the frame. + * + * @return A SampleBuffer containing the decoded samples. + */ + public Obuffer decodeFrame(Header header, Bitstream stream) + throws DecoderException + { + if (!initialized) + { + initialize(header); + } + + int layer = header.layer(); + + output.clear_buffer(); + + FrameDecoder decoder = retrieveDecoder(header, stream, layer); + + decoder.decodeFrame(); + + output.write_buffer(1); + + return output; + } + + /** + * Changes the output buffer. This will take effect the next time + * decodeFrame() is called. + */ + public void setOutputBuffer(Obuffer out) + { + output = out; + } + + /** + * Retrieves the sample frequency of the PCM samples output + * by this decoder. This typically corresponds to the sample + * rate encoded in the MPEG audio stream. + * + * @param the sample rate (in Hz) of the samples written to the + * output buffer when decoding. + */ + public int getOutputFrequency() + { + return outputFrequency; + } + + /** + * Retrieves the number of channels of PCM samples output by + * this decoder. This usually corresponds to the number of + * channels in the MPEG audio stream, although it may differ. + * + * @return The number of output channels in the decoded samples: 1 + * for mono, or 2 for stereo. + * + */ + public int getOutputChannels() + { + return outputChannels; + } + + /** + * Retrieves the maximum number of samples that will be written to + * the output buffer when one frame is decoded. This can be used to + * help calculate the size of other buffers whose size is based upon + * the number of samples written to the output buffer. NB: this is + * an upper bound and fewer samples may actually be written, depending + * upon the sample rate and number of channels. + * + * @return The maximum number of samples that are written to the + * output buffer when decoding a single frame of MPEG audio. + */ + public int getOutputBlockSize() + { + return Obuffer.OBUFFERSIZE; + } + + + protected DecoderException newDecoderException(int errorcode) + { + return new DecoderException(errorcode, null); + } + + protected DecoderException newDecoderException(int errorcode, Throwable throwable) + { + return new DecoderException(errorcode, throwable); + } + + protected FrameDecoder retrieveDecoder(Header header, Bitstream stream, int layer) + throws DecoderException + { + FrameDecoder decoder = null; + + // REVIEW: allow channel output selection type + // (LEFT, RIGHT, BOTH, DOWNMIX) + switch (layer) + { + case 3: + if (l3decoder==null) + { + l3decoder = new LayerIIIDecoder(stream, + header, filter1, filter2, + output, OutputChannels.BOTH_CHANNELS); + } + + decoder = l3decoder; + break; + case 2: + if (l2decoder==null) + { + l2decoder = new LayerIIDecoder(); + l2decoder.create(stream, + header, filter1, filter2, + output, OutputChannels.BOTH_CHANNELS); + } + decoder = l2decoder; + break; + case 1: + if (l1decoder==null) + { + l1decoder = new LayerIDecoder(); + l1decoder.create(stream, + header, filter1, filter2, + output, OutputChannels.BOTH_CHANNELS); + } + decoder = l1decoder; + break; + } + + if (decoder==null) + { + throw newDecoderException(UNSUPPORTED_LAYER, null); + } + + return decoder; + } + + private void initialize(Header header) + throws DecoderException + { + + // REVIEW: allow customizable scale factor + float scalefactor = 32700.0f; + + int mode = header.mode(); + int layer = header.layer(); + int channels = mode==Header.SINGLE_CHANNEL ? 1 : 2; + + + // set up output buffer if not set up by client. + if (output==null) + output = new SampleBuffer(header.frequency(), channels); + + float[] factors = equalizer.getBandFactors(); + filter1 = new SynthesisFilter(0, scalefactor, factors); + + // REVIEW: allow mono output for stereo + if (channels==2) + filter2 = new SynthesisFilter(1, scalefactor, factors); + + outputChannels = channels; + outputFrequency = header.frequency(); + + initialized = true; + } + + /** + * The Params class presents the customizable + * aspects of the decoder. + *

+ * Instances of this class are not thread safe. + */ + public static class Params implements Cloneable + { + private OutputChannels outputChannels = OutputChannels.BOTH; + + private Equalizer equalizer = new Equalizer(); + + public Params() + { + } + + public Object clone() + { + try + { + return super.clone(); + } + catch (CloneNotSupportedException ex) + { + throw new InternalError(this+": "+ex); + } + } + + public void setOutputChannels(OutputChannels out) + { + if (out==null) + throw new NullPointerException("out"); + + outputChannels = out; + } + + public OutputChannels getOutputChannels() + { + return outputChannels; + } + + /** + * Retrieves the equalizer settings that the decoder's equalizer + * will be initialized from. + *

+ * The Equalizer instance returned + * cannot be changed in real time to affect the + * decoder output as it is used only to initialize the decoders + * EQ settings. To affect the decoder's output in realtime, + * use the Equalizer returned from the getEqualizer() method on + * the decoder. + * + * @return The Equalizer used to initialize the + * EQ settings of the decoder. + */ + public Equalizer getInitialEqualizerSettings() + { + return equalizer; + } + + }; +} + diff --git a/src/javazoom/jl/decoder/DecoderErrors.java b/src/javazoom/jl/decoder/DecoderErrors.java new file mode 100644 index 0000000..dfa2f08 --- /dev/null +++ b/src/javazoom/jl/decoder/DecoderErrors.java @@ -0,0 +1,45 @@ +/* + * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org) + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * This interface provides constants describing the error + * codes used by the Decoder to indicate errors. + * + * @author MDM + */ +public interface DecoderErrors extends JavaLayerErrors +{ + + static public final int UNKNOWN_ERROR = DECODER_ERROR + 0; + + /** + * Layer not supported by the decoder. + */ + static public final int UNSUPPORTED_LAYER = DECODER_ERROR + 1; + + /** + * Illegal allocation in subband layer. Indicates a corrupt stream. + */ + static public final int ILLEGAL_SUBBAND_ALLOCATION = DECODER_ERROR + 2; + +} diff --git a/src/javazoom/jl/decoder/DecoderException.java b/src/javazoom/jl/decoder/DecoderException.java new file mode 100644 index 0000000..b757108 --- /dev/null +++ b/src/javazoom/jl/decoder/DecoderException.java @@ -0,0 +1,61 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * The DecoderException represents the class of + * errors that can occur when decoding MPEG audio. + * + * @author MDM + */ +public class DecoderException extends JavaLayerException + implements DecoderErrors +{ + private int errorcode = UNKNOWN_ERROR; + + public DecoderException(String msg, Throwable t) + { + super(msg, t); + } + + public DecoderException(int errorcode, Throwable t) + { + this(getErrorString(errorcode), t); + this.errorcode = errorcode; + } + + public int getErrorCode() + { + return errorcode; + } + + + static public String getErrorString(int errorcode) + { + // REVIEW: use resource file to map error codes + // to locale-sensitive strings. + + return "Decoder errorcode "+Integer.toHexString(errorcode); + } + + +} + diff --git a/src/javazoom/jl/decoder/Equalizer.java b/src/javazoom/jl/decoder/Equalizer.java new file mode 100644 index 0000000..57545a9 --- /dev/null +++ b/src/javazoom/jl/decoder/Equalizer.java @@ -0,0 +1,227 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +package javazoom.jl.decoder; + +/** + * The Equalizer class can be used to specify + * equalization settings for the MPEG audio decoder. + *

+ * The equalizer consists of 32 band-pass filters. + * Each band of the equalizer can take on a fractional value between + * -1.0 and +1.0. + * At -1.0, the input signal is attenuated by 6dB, at +1.0 the signal is + * amplified by 6dB. + * + * @see Decoder + * + * @author MDM + */ +public final class Equalizer +{ + /** + * Equalizer setting to denote that a given band will not be + * present in the output signal. + */ + static public final float BAND_NOT_PRESENT = Float.NEGATIVE_INFINITY; + + static public final Equalizer PASS_THRU_EQ = new Equalizer(); + + private static final int BANDS = 32; + + private final float[] settings = new float[BANDS]; + + /** + * Creates a new Equalizer instance. + */ + public Equalizer() + { + } + +// private Equalizer(float b1, float b2, float b3, float b4, float b5, +// float b6, float b7, float b8, float b9, float b10, float b11, +// float b12, float b13, float b14, float b15, float b16, +// float b17, float b18, float b19, float b20); + + public Equalizer(float[] settings) + { + setFrom(settings); + } + + public Equalizer(EQFunction eq) + { + setFrom(eq); + } + + public void setFrom(float[] eq) + { + reset(); + int max = (eq.length > BANDS) ? BANDS : eq.length; + + for (int i=0; i=0) && (band=0) && (band 1.0f) + return 1.0f; + if (eq < -1.0f) + return -1.0f; + + return eq; + } + + /** + * Retrieves an array of floats whose values represent a + * scaling factor that can be applied to linear samples + * in each band to provide the equalization represented by + * this instance. + * + * @return an array of factors that can be applied to the + * subbands. + */ + float[] getBandFactors() + { + float[] factors = new float[BANDS]; + for (int i=0, maxCount=BANDS; i>> 19) & 1); + if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection + if (h_version == MPEG2_LSF) + h_version = MPEG25_LSF; + else + throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); + if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3) + { + throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); + } + } + h_layer = 4 - (headerstring >>> 17) & 3; + h_protection_bit = (headerstring >>> 16) & 1; + h_bitrate_index = (headerstring >>> 12) & 0xF; + h_padding_bit = (headerstring >>> 9) & 1; + h_mode = ((headerstring >>> 6) & 3); + h_mode_extension = (headerstring >>> 4) & 3; + if (h_mode == JOINT_STEREO) + h_intensity_stereo_bound = (h_mode_extension << 2) + 4; + else + h_intensity_stereo_bound = 0; // should never be used + if (((headerstring >>> 3) & 1) == 1) + h_copyright = true; + if (((headerstring >>> 2) & 1) == 1) + h_original = true; + // calculate number of subbands: + if (h_layer == 1) + h_number_of_subbands = 32; + else + { + channel_bitrate = h_bitrate_index; + // calculate bitrate per channel: + if (h_mode != SINGLE_CHANNEL) + if (channel_bitrate == 4) + channel_bitrate = 1; + else + channel_bitrate -= 4; + if ((channel_bitrate == 1) || (channel_bitrate == 2)) + if (h_sample_frequency == THIRTYTWO) + h_number_of_subbands = 12; + else + h_number_of_subbands = 8; + else if ((h_sample_frequency == FOURTYEIGHT) || ((channel_bitrate >= 3) && (channel_bitrate <= 5))) + h_number_of_subbands = 27; + else + h_number_of_subbands = 30; + } + if (h_intensity_stereo_bound > h_number_of_subbands) + h_intensity_stereo_bound = h_number_of_subbands; + // calculate framesize and nSlots + calculate_framesize(); + // read framedata: + int framesizeloaded = stream.read_frame_data(framesize); + if ((framesize >=0) && (framesizeloaded != framesize)) + { + // Data loaded does not match to expected framesize, + // it might be an ID3v1 TAG. (Fix 11/17/04). + throw stream.newBitstreamException(Bitstream.INVALIDFRAME); + } + if (stream.isSyncCurrentPosition(syncmode)) + { + if (syncmode == Bitstream.INITIAL_SYNC) + { + syncmode = Bitstream.STRICT_SYNC; + stream.set_syncword(headerstring & 0xFFF80CC0); + } + sync = true; + } + else + { + stream.unreadFrame(); + } + } + while (!sync); + stream.parse_frame(); + if (h_protection_bit == 0) + { + // frame contains a crc checksum + checksum = (short) stream.get_bits(16); + if (crc == null) + crc = new Crc16(); + crc.add_bits(headerstring, 16); + crcp[0] = crc; + } + else + crcp[0] = null; + if (h_sample_frequency == FOURTYFOUR_POINT_ONE) + { + /* + if (offset == null) + { + int max = max_number_of_frames(stream); + offset = new int[max]; + for(int i=0; i 0) && (cf == lf)) + { + offset[cf] = offset[cf-1] + h_padding_bit; + } + else + { + offset[0] = h_padding_bit; + } + */ + } + } + + /** + * Parse frame to extract optionnal VBR frame. + * @param firstframe + * @author E.B (javalayer@javazoom.net) + */ + void parseVBR(byte[] firstframe) throws BitstreamException + { + // Trying Xing header. + String xing = "Xing"; + byte tmp[] = new byte[4]; + int offset = 0; + // Compute "Xing" offset depending on MPEG version and channels. + if (h_version == MPEG1) + { + if (h_mode == SINGLE_CHANNEL) offset=21-4; + else offset=36-4; + } + else + { + if (h_mode == SINGLE_CHANNEL) offset=13-4; + else offset = 21-4; + } + try + { + System.arraycopy(firstframe, offset, tmp, 0, 4); + // Is "Xing" ? + if (xing.equals(new String(tmp))) + { + //Yes. + h_vbr = true; + h_vbr_frames = -1; + h_vbr_bytes = -1; + h_vbr_scale = -1; + h_vbr_toc = new byte[100]; + + int length = 4; + // Read flags. + byte flags[] = new byte[4]; + System.arraycopy(firstframe, offset + length, flags, 0, flags.length); + length += flags.length; + // Read number of frames (if available). + if ((flags[3] & (byte) (1 << 0)) != 0) + { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; + length += 4; + } + // Read size (if available). + if ((flags[3] & (byte) (1 << 1)) != 0) + { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; + length += 4; + } + // Read TOC (if available). + if ((flags[3] & (byte) (1 << 2)) != 0) + { + System.arraycopy(firstframe, offset + length, h_vbr_toc, 0, h_vbr_toc.length); + length += h_vbr_toc.length; + } + // Read scale (if available). + if ((flags[3] & (byte) (1 << 3)) != 0) + { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_scale = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; + length += 4; + } + //System.out.println("VBR:"+xing+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes); + } + } + catch (ArrayIndexOutOfBoundsException e) + { + throw new BitstreamException("XingVBRHeader Corrupted",e); + } + + // Trying VBRI header. + String vbri = "VBRI"; + offset = 36-4; + try + { + System.arraycopy(firstframe, offset, tmp, 0, 4); + // Is "VBRI" ? + if (vbri.equals(new String(tmp))) + { + //Yes. + h_vbr = true; + h_vbr_frames = -1; + h_vbr_bytes = -1; + h_vbr_scale = -1; + h_vbr_toc = new byte[100]; + // Bytes. + int length = 4 + 6; + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; + length += 4; + // Frames. + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; + length += 4; + //System.out.println("VBR:"+vbri+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes); + // TOC + // TODO + } + } + catch (ArrayIndexOutOfBoundsException e) + { + throw new BitstreamException("VBRIVBRHeader Corrupted",e); + } + } + + // Functions to query header contents: + /** + * Returns version. + */ + public int version() { return h_version; } + + /** + * Returns Layer ID. + */ + public int layer() { return h_layer; } + + /** + * Returns bitrate index. + */ + public int bitrate_index() { return h_bitrate_index; } + + /** + * Returns Sample Frequency. + */ + public int sample_frequency() { return h_sample_frequency; } + + /** + * Returns Frequency. + */ + public int frequency() {return frequencies[h_version][h_sample_frequency];} + + /** + * Returns Mode. + */ + public int mode() { return h_mode; } + + /** + * Returns Protection bit. + */ + public boolean checksums() + { + if (h_protection_bit == 0) return true; + else return false; + } + + /** + * Returns Copyright. + */ + public boolean copyright() { return h_copyright; } + + /** + * Returns Original. + */ + public boolean original() { return h_original; } + + /** + * Return VBR. + * @return true if VBR header is found + */ + public boolean vbr() { return h_vbr; } + + /** + * Return VBR scale. + * @return scale of -1 if not available + */ + public int vbr_scale() { return h_vbr_scale; } + + /** + * Return VBR TOC. + * @return vbr toc ot null if not available + */ + public byte[] vbr_toc() { return h_vbr_toc; } + + /** + * Returns Checksum flag. + * Compares computed checksum with stream checksum. + */ + public boolean checksum_ok () { return (checksum == crc.checksum()); } + + // Seeking and layer III stuff + /** + * Returns Layer III Padding bit. + */ + public boolean padding() + { + if (h_padding_bit == 0) return false; + else return true; + } + + /** + * Returns Slots. + */ + public int slots() { return nSlots; } + + /** + * Returns Mode Extension. + */ + public int mode_extension() { return h_mode_extension; } + + // E.B -> private to public + public static final int bitrates[][][] = { + {{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, + 112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0}, + {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, + 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}, + {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, + 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}}, + + {{0 /*free format*/, 32000, 64000, 96000, 128000, 160000, 192000, + 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, 0}, + {0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, + 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0}, + {0 /*free format*/, 32000, 40000, 48000, 56000, 64000, 80000, + 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 0}}, + // SZD: MPEG2.5 + {{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, + 112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0}, + {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, + 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}, + {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, + 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}}, + + }; + + // E.B -> private to public + /** + * Calculate Frame size. + * Calculates framesize in bytes excluding header size. + */ + public int calculate_framesize() + { + + if (h_layer == 1) + { + framesize = (12 * bitrates[h_version][0][h_bitrate_index]) / + frequencies[h_version][h_sample_frequency]; + if (h_padding_bit != 0 ) framesize++; + framesize <<= 2; // one slot is 4 bytes long + nSlots = 0; + } + else + { + framesize = (144 * bitrates[h_version][h_layer - 1][h_bitrate_index]) / + frequencies[h_version][h_sample_frequency]; + if (h_version == MPEG2_LSF || h_version == MPEG25_LSF) framesize >>= 1; // SZD + if (h_padding_bit != 0) framesize++; + // Layer III slots + if (h_layer == 3) + { + if (h_version == MPEG1) + { + nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 17 : 32) // side info size + - ((h_protection_bit!=0) ? 0 : 2) // CRC size + - 4; // header size + } + else + { // MPEG-2 LSF, SZD: MPEG-2.5 LSF + nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 9 : 17) // side info size + - ((h_protection_bit!=0) ? 0 : 2) // CRC size + - 4; // header size + } + } + else + { + nSlots = 0; + } + } + framesize -= 4; // subtract header size + return framesize; + } + + /** + * Returns the maximum number of frames in the stream. + * @param streamsize + * @return number of frames + */ + public int max_number_of_frames(int streamsize) // E.B + { + if (h_vbr == true) return h_vbr_frames; + else + { + if ((framesize + 4 - h_padding_bit) == 0) return 0; + else return(streamsize / (framesize + 4 - h_padding_bit)); + } + } + + /** + * Returns the maximum number of frames in the stream. + * @param streamsize + * @return number of frames + */ + public int min_number_of_frames(int streamsize) // E.B + { + if (h_vbr == true) return h_vbr_frames; + else + { + if ((framesize + 5 - h_padding_bit) == 0) return 0; + else return(streamsize / (framesize + 5 - h_padding_bit)); + } + } + + + /** + * Returns ms/frame. + * @return milliseconds per frame + */ + public float ms_per_frame() // E.B + { + if (h_vbr == true) + { + double tpf = h_vbr_time_per_frame[layer()] / frequency(); + if ((h_version == MPEG2_LSF) || (h_version == MPEG25_LSF)) tpf /= 2; + return ((float) (tpf * 1000)); + } + else + { + float ms_per_frame_array[][] = {{8.707483f, 8.0f, 12.0f}, + {26.12245f, 24.0f, 36.0f}, + {26.12245f, 24.0f, 36.0f}}; + return(ms_per_frame_array[h_layer-1][h_sample_frequency]); + } + } + + /** + * Returns total ms. + * @param streamsize + * @return total milliseconds + */ + public float total_ms(int streamsize) // E.B + { + return(max_number_of_frames(streamsize) * ms_per_frame()); + } + + /** + * Returns synchronized header. + */ + public int getSyncHeader() // E.B + { + return _headerstring; + } + + // functions which return header informations as strings: + /** + * Return Layer version. + */ + public String layer_string() + { + switch (h_layer) + { + case 1: + return "I"; + case 2: + return "II"; + case 3: + return "III"; + } + return null; + } + + // E.B -> private to public + public static final String bitrate_str[][][] = { + {{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", + "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", + "160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", + "forbidden"}, + {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", + "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", + "forbidden"}, + {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", + "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", + "forbidden"}}, + + {{"free format", "32 kbit/s", "64 kbit/s", "96 kbit/s", "128 kbit/s", + "160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s", + "320 kbit/s", "352 kbit/s", "384 kbit/s", "416 kbit/s", "448 kbit/s", + "forbidden"}, + {"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", + "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", + "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", "384 kbit/s", + "forbidden"}, + {"free format", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", + "64 kbit/s", "80 kbit/s" , "96 kbit/s", "112 kbit/s", "128 kbit/s", + "160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", + "forbidden"}}, + // SZD: MPEG2.5 + {{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", + "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", + "160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", + "forbidden"}, + {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", + "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", + "forbidden"}, + {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", + "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", + "forbidden"}}, + }; + + /** + * Return Bitrate. + * @return bitrate in bps + */ + public String bitrate_string() + { + if (h_vbr == true) + { + return Integer.toString(bitrate()/1000)+" kb/s"; + } + else return bitrate_str[h_version][h_layer - 1][h_bitrate_index]; + } + + /** + * Return Bitrate. + * @return bitrate in bps and average bitrate for VBR header + */ + public int bitrate() + { + if (h_vbr == true) + { + return ((int) ((h_vbr_bytes * 8) / (ms_per_frame() * h_vbr_frames)))*1000; + } + else return bitrates[h_version][h_layer - 1][h_bitrate_index]; + } + + /** + * Return Instant Bitrate. + * Bitrate for VBR is not constant. + * @return bitrate in bps + */ + public int bitrate_instant() + { + return bitrates[h_version][h_layer - 1][h_bitrate_index]; + } + + /** + * Returns Frequency + * @return frequency string in kHz + */ + public String sample_frequency_string() + { + switch (h_sample_frequency) + { + case THIRTYTWO: + if (h_version == MPEG1) + return "32 kHz"; + else if (h_version == MPEG2_LSF) + return "16 kHz"; + else // SZD + return "8 kHz"; + case FOURTYFOUR_POINT_ONE: + if (h_version == MPEG1) + return "44.1 kHz"; + else if (h_version == MPEG2_LSF) + return "22.05 kHz"; + else // SZD + return "11.025 kHz"; + case FOURTYEIGHT: + if (h_version == MPEG1) + return "48 kHz"; + else if (h_version == MPEG2_LSF) + return "24 kHz"; + else // SZD + return "12 kHz"; + } + return(null); + } + + /** + * Returns Mode. + */ + public String mode_string() + { + switch (h_mode) + { + case STEREO: + return "Stereo"; + case JOINT_STEREO: + return "Joint stereo"; + case DUAL_CHANNEL: + return "Dual channel"; + case SINGLE_CHANNEL: + return "Single channel"; + } + return null; + } + + /** + * Returns Version. + * @return MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF + */ + public String version_string() + { + switch (h_version) + { + case MPEG1: + return "MPEG-1"; + case MPEG2_LSF: + return "MPEG-2 LSF"; + case MPEG25_LSF: // SZD + return "MPEG-2.5 LSF"; + } + return(null); + } + + /** + * Returns the number of subbands in the current frame. + * @return number of subbands + */ + public int number_of_subbands() {return h_number_of_subbands;} + + /** + * Returns Intensity Stereo. + * (Layer II joint stereo only). + * Returns the number of subbands which are in stereo mode, + * subbands above that limit are in intensity stereo mode. + * @return intensity + */ + public int intensity_stereo_bound() {return h_intensity_stereo_bound;} +} diff --git a/src/javazoom/jl/decoder/InputStreamSource.java b/src/javazoom/jl/decoder/InputStreamSource.java new file mode 100644 index 0000000..5c62947 --- /dev/null +++ b/src/javazoom/jl/decoder/InputStreamSource.java @@ -0,0 +1,80 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Work In Progress. + * + * An instance of InputStreamSource implements a + * Source that provides data from an InputStream + * . Seeking functionality is not supported. + * + * @author MDM + */ +public class InputStreamSource implements Source +{ + private final InputStream in; + + public InputStreamSource(InputStream in) + { + if (in==null) + throw new NullPointerException("in"); + + this.in = in; + } + + public int read(byte[] b, int offs, int len) + throws IOException + { + int read = in.read(b, offs, len); + return read; + } + + public boolean willReadBlock() + { + return true; + //boolean block = (in.available()==0); + //return block; + } + + public boolean isSeekable() + { + return false; + } + + public long tell() + { + return -1; + } + + public long seek(long to) + { + return -1; + } + + public long length() + { + return -1; + } +} diff --git a/src/javazoom/jl/decoder/JavaLayerError.java b/src/javazoom/jl/decoder/JavaLayerError.java new file mode 100644 index 0000000..d9910bc --- /dev/null +++ b/src/javazoom/jl/decoder/JavaLayerError.java @@ -0,0 +1,31 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Work in progress. + * + * API usage errors may be handled by throwing an instance of this + * class, as per JMF 2.0. + */ +public class JavaLayerError extends Error +{ +} diff --git a/src/javazoom/jl/decoder/JavaLayerErrors.java b/src/javazoom/jl/decoder/JavaLayerErrors.java new file mode 100644 index 0000000..3b9c2ff --- /dev/null +++ b/src/javazoom/jl/decoder/JavaLayerErrors.java @@ -0,0 +1,40 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Exception erorr codes for components of the JavaLayer API. + */ +public interface JavaLayerErrors +{ + /** + * The first bitstream error code. See the {@link DecoderErrors DecoderErrors} + * interface for other bitstream error codes. + */ + static public final int BITSTREAM_ERROR = 0x100; + + /** + * The first decoder error code. See the {@link DecoderErrors DecoderErrors} + * interface for other decoder error codes. + */ + static public final int DECODER_ERROR = 0x200; + +} diff --git a/src/javazoom/jl/decoder/JavaLayerException.java b/src/javazoom/jl/decoder/JavaLayerException.java new file mode 100644 index 0000000..e7a50a8 --- /dev/null +++ b/src/javazoom/jl/decoder/JavaLayerException.java @@ -0,0 +1,80 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.PrintStream; + + +/** + * The JavaLayerException is the base class for all API-level + * exceptions thrown by JavaLayer. To facilitate conversion and + * common handling of exceptions from other domains, the class + * can delegate some functionality to a contained Throwable instance. + *

+ * + * @author MDM + */ +public class JavaLayerException extends Exception +{ + + private Throwable exception; + + + public JavaLayerException() + { + } + + public JavaLayerException(String msg) + { + super(msg); + } + + public JavaLayerException(String msg, Throwable t) + { + super(msg); + exception = t; + } + + public Throwable getException() + { + return exception; + } + + + public void printStackTrace() + { + printStackTrace(System.err); + } + + public void printStackTrace(PrintStream ps) + { + if (this.exception==null) + { + super.printStackTrace(ps); + } + else + { + exception.printStackTrace(); + } + } + + +} diff --git a/src/javazoom/jl/decoder/JavaLayerHook.java b/src/javazoom/jl/decoder/JavaLayerHook.java new file mode 100644 index 0000000..3520594 --- /dev/null +++ b/src/javazoom/jl/decoder/JavaLayerHook.java @@ -0,0 +1,36 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.InputStream; + +/** + * The JavaLayerHooks class allows developers to change + * the way the JavaLayer library uses Resources. + */ + +public interface JavaLayerHook +{ + /** + * Retrieves the named resource. This allows resources to be + * obtained without specifying how they are retrieved. + */ + public InputStream getResourceAsStream(String name); +} diff --git a/src/javazoom/jl/decoder/JavaLayerUtils.java b/src/javazoom/jl/decoder/JavaLayerUtils.java new file mode 100644 index 0000000..c9ce383 --- /dev/null +++ b/src/javazoom/jl/decoder/JavaLayerUtils.java @@ -0,0 +1,207 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InvalidClassException; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.lang.reflect.Array; + +/** + * The JavaLayerUtils class is not strictly part of the JavaLayer API. + * It serves to provide useful methods and system-wide hooks. + * + * @author MDM + */ +public class JavaLayerUtils +{ + static private JavaLayerHook hook = null; + + /** + * Deserializes the object contained in the given input stream. + * @param in The input stream to deserialize an object from. + * @param cls The expected class of the deserialized object. + */ + static public Object deserialize(InputStream in, Class cls) + throws IOException + { + if (cls==null) + throw new NullPointerException("cls"); + + Object obj = deserialize(in, cls); + if (!cls.isInstance(obj)) + { + throw new InvalidObjectException("type of deserialized instance not of required class."); + } + + return obj; + } + + /** + * Deserializes an object from the given InputStream. + * The deserialization is delegated to an + * ObjectInputStream instance. + * + * @param in The InputStream to deserialize an object + * from. + * + * @return The object deserialized from the stream. + * @exception IOException is thrown if there was a problem reading + * the underlying stream, or an object could not be deserialized + * from the stream. + * + * @see java.io.ObjectInputStream + */ + static public Object deserialize(InputStream in) + throws IOException + { + if (in==null) + throw new NullPointerException("in"); + + ObjectInputStream objIn = new ObjectInputStream(in); + + Object obj; + + try + { + obj = objIn.readObject(); + } + catch (ClassNotFoundException ex) + { + throw new InvalidClassException(ex.toString()); + } + + return obj; + } + + /** + * Deserializes an array from a given InputStream. + * + * @param in The InputStream to + * deserialize an object from. + * + * @param elemType The class denoting the type of the array + * elements. + * @param length The expected length of the array, or -1 if + * any length is expected. + */ + static public Object deserializeArray(InputStream in, Class elemType, int length) + throws IOException + { + if (elemType==null) + throw new NullPointerException("elemType"); + + if (length<-1) + throw new IllegalArgumentException("length"); + + Object obj = deserialize(in); + + Class cls = obj.getClass(); + + + if (!cls.isArray()) + throw new InvalidObjectException("object is not an array"); + + Class arrayElemType = cls.getComponentType(); + if (arrayElemType!=elemType) + throw new InvalidObjectException("unexpected array component type"); + + if (length != -1) + { + int arrayLength = Array.getLength(obj); + if (arrayLength!=length) + throw new InvalidObjectException("array length mismatch"); + } + + return obj; + } + + static public Object deserializeArrayResource(String name, Class elemType, int length) + throws IOException + { + InputStream str = getResourceAsStream(name); + if (str==null) + throw new IOException("unable to load resource '"+name+"'"); + + Object obj = deserializeArray(str, elemType, length); + + return obj; + } + + static public void serialize(OutputStream out, Object obj) + throws IOException + { + if (out==null) + throw new NullPointerException("out"); + + if (obj==null) + throw new NullPointerException("obj"); + + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(obj); + + } + + /** + * Sets the system-wide JavaLayer hook. + */ + static synchronized public void setHook(JavaLayerHook hook0) + { + hook = hook0; + } + + static synchronized public JavaLayerHook getHook() + { + return hook; + } + + /** + * Retrieves an InputStream for a named resource. + * + * @param name The name of the resource. This must be a simple + * name, and not a qualified package name. + * + * @return The InputStream for the named resource, or null if + * the resource has not been found. If a hook has been + * provided, its getResourceAsStream() method is called + * to retrieve the resource. + */ + static synchronized public InputStream getResourceAsStream(String name) + { + InputStream is = null; + + if (hook!=null) + { + is = hook.getResourceAsStream(name); + } + else + { + Class cls = JavaLayerUtils.class; + is = cls.getResourceAsStream(name); + } + + return is; + } +} diff --git a/src/javazoom/jl/decoder/LayerIDecoder.java b/src/javazoom/jl/decoder/LayerIDecoder.java new file mode 100644 index 0000000..fb936d2 --- /dev/null +++ b/src/javazoom/jl/decoder/LayerIDecoder.java @@ -0,0 +1,448 @@ +/* + * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org) + * + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 Initial version. Adapted from javalayer.java + * and Subband*.java. mdm@techie.com + * + * 02/28/99 Initial version : javalayer.java by E.B + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Implements decoding of MPEG Audio Layer I frames. + */ +class LayerIDecoder implements FrameDecoder +{ + protected Bitstream stream; + protected Header header; + protected SynthesisFilter filter1, filter2; + protected Obuffer buffer; + protected int which_channels; + protected int mode; + + protected int num_subbands; + protected Subband[] subbands; + protected Crc16 crc = null; // new Crc16[1] to enable CRC checking. + + public LayerIDecoder() + { + crc = new Crc16(); + } + + public void create(Bitstream stream0, Header header0, + SynthesisFilter filtera, SynthesisFilter filterb, + Obuffer buffer0, int which_ch0) + { + stream = stream0; + header = header0; + filter1 = filtera; + filter2 = filterb; + buffer = buffer0; + which_channels = which_ch0; + + } + + public void decodeFrame() throws DecoderException + { + + num_subbands = header.number_of_subbands(); + subbands = new Subband[32]; + mode = header.mode(); + + createSubbands(); + + readAllocation(); + readScaleFactorSelection(); + + if ((crc != null) || header.checksum_ok()) + { + readScaleFactors(); + + readSampleData(); + } + + } + + protected void createSubbands() + { + int i; + if (mode == Header.SINGLE_CHANNEL) + for (i = 0; i < num_subbands; ++i) + subbands[i] = new SubbandLayer1(i); + else if (mode == Header.JOINT_STEREO) + { + for (i = 0; i < header.intensity_stereo_bound(); ++i) + subbands[i] = new SubbandLayer1Stereo(i); + for (; i < num_subbands; ++i) + subbands[i] = new SubbandLayer1IntensityStereo(i); + } + else + { + for (i = 0; i < num_subbands; ++i) + subbands[i] = new SubbandLayer1Stereo(i); + } + } + + protected void readAllocation() throws DecoderException + { + // start to read audio data: + for (int i = 0; i < num_subbands; ++i) + subbands[i].read_allocation(stream, header, crc); + + } + + protected void readScaleFactorSelection() + { + // scale factor selection not present for layer I. + } + + protected void readScaleFactors() + { + for (int i = 0; i < num_subbands; ++i) + subbands[i].read_scalefactor(stream, header); + } + + protected void readSampleData() + { + boolean read_ready = false; + boolean write_ready = false; + int mode = header.mode(); + int i; + do + { + for (i = 0; i < num_subbands; ++i) + read_ready = subbands[i].read_sampledata(stream); + do + { + for (i = 0; i < num_subbands; ++i) + write_ready = subbands[i].put_next_sample(which_channels,filter1, filter2); + + filter1.calculate_pcm_samples(buffer); + if ((which_channels == OutputChannels.BOTH_CHANNELS) && (mode != Header.SINGLE_CHANNEL)) + filter2.calculate_pcm_samples(buffer); + } while (!write_ready); + } while (!read_ready); + + } + + /** + * Abstract base class for subband classes of layer I and II + */ + static abstract class Subband + { + /* + * Changes from version 1.1 to 1.2: + * - array size increased by one, although a scalefactor with index 63 + * is illegal (to prevent segmentation faults) + */ + // Scalefactors for layer I and II, Annex 3-B.1 in ISO/IEC DIS 11172: + public static final float scalefactors[] = + { + 2.00000000000000f, 1.58740105196820f, 1.25992104989487f, 1.00000000000000f, + 0.79370052598410f, 0.62996052494744f, 0.50000000000000f, 0.39685026299205f, + 0.31498026247372f, 0.25000000000000f, 0.19842513149602f, 0.15749013123686f, + 0.12500000000000f, 0.09921256574801f, 0.07874506561843f, 0.06250000000000f, + 0.04960628287401f, 0.03937253280921f, 0.03125000000000f, 0.02480314143700f, + 0.01968626640461f, 0.01562500000000f, 0.01240157071850f, 0.00984313320230f, + 0.00781250000000f, 0.00620078535925f, 0.00492156660115f, 0.00390625000000f, + 0.00310039267963f, 0.00246078330058f, 0.00195312500000f, 0.00155019633981f, + 0.00123039165029f, 0.00097656250000f, 0.00077509816991f, 0.00061519582514f, + 0.00048828125000f, 0.00038754908495f, 0.00030759791257f, 0.00024414062500f, + 0.00019377454248f, 0.00015379895629f, 0.00012207031250f, 0.00009688727124f, + 0.00007689947814f, 0.00006103515625f, 0.00004844363562f, 0.00003844973907f, + 0.00003051757813f, 0.00002422181781f, 0.00001922486954f, 0.00001525878906f, + 0.00001211090890f, 0.00000961243477f, 0.00000762939453f, 0.00000605545445f, + 0.00000480621738f, 0.00000381469727f, 0.00000302772723f, 0.00000240310869f, + 0.00000190734863f, 0.00000151386361f, 0.00000120155435f, 0.00000000000000f /* illegal scalefactor */ + }; + + public abstract void read_allocation (Bitstream stream, Header header, Crc16 crc) throws DecoderException; + public abstract void read_scalefactor (Bitstream stream, Header header); + public abstract boolean read_sampledata (Bitstream stream); + public abstract boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2); + }; + + /** + * Class for layer I subbands in single channel mode. + * Used for single channel mode + * and in derived class for intensity stereo mode + */ + static class SubbandLayer1 extends Subband + { + + // Factors and offsets for sample requantization + public static final float table_factor[] = { + 0.0f, (1.0f/2.0f) * (4.0f/3.0f), (1.0f/4.0f) * (8.0f/7.0f), (1.0f/8.0f) * (16.0f/15.0f), + (1.0f/16.0f) * (32.0f/31.0f), (1.0f/32.0f) * (64.0f/63.0f), (1.0f/64.0f) * (128.0f/127.0f), + (1.0f/128.0f) * (256.0f/255.0f), (1.0f/256.0f) * (512.0f/511.0f), + (1.0f/512.0f) * (1024.0f/1023.0f), (1.0f/1024.0f) * (2048.0f/2047.0f), + (1.0f/2048.0f) * (4096.0f/4095.0f), (1.0f/4096.0f) * (8192.0f/8191.0f), + (1.0f/8192.0f) * (16384.0f/16383.0f), (1.0f/16384.0f) * (32768.0f/32767.0f) + }; + + public static final float table_offset[] = { + 0.0f, ((1.0f/2.0f)-1.0f) * (4.0f/3.0f), ((1.0f/4.0f)-1.0f) * (8.0f/7.0f), ((1.0f/8.0f)-1.0f) * (16.0f/15.0f), + ((1.0f/16.0f)-1.0f) * (32.0f/31.0f), ((1.0f/32.0f)-1.0f) * (64.0f/63.0f), ((1.0f/64.0f)-1.0f) * (128.0f/127.0f), + ((1.0f/128.0f)-1.0f) * (256.0f/255.0f), ((1.0f/256.0f)-1.0f) * (512.0f/511.0f), + ((1.0f/512.0f)-1.0f) * (1024.0f/1023.0f), ((1.0f/1024.0f)-1.0f) * (2048.0f/2047.0f), + ((1.0f/2048.0f)-1.0f) * (4096.0f/4095.0f), ((1.0f/4096.0f)-1.0f) * (8192.0f/8191.0f), + ((1.0f/8192.0f)-1.0f) * (16384.0f/16383.0f), ((1.0f/16384.0f)-1.0f) * (32768.0f/32767.0f) + }; + + protected int subbandnumber; + protected int samplenumber; + protected int allocation; + protected float scalefactor; + protected int samplelength; + protected float sample; + protected float factor, offset; + + /** + * Construtor. + */ + public SubbandLayer1(int subbandnumber) + { + this.subbandnumber = subbandnumber; + samplenumber = 0; + } + + /** + * + */ + public void read_allocation(Bitstream stream, Header header, Crc16 crc) throws DecoderException + { + if ((allocation = stream.get_bits (4)) == 15) + { + // CGJ: catch this condition and throw appropriate exception + throw new DecoderException(DecoderErrors.ILLEGAL_SUBBAND_ALLOCATION, null); + // cerr << "WARNING: stream contains an illegal allocation!\n"; + // MPEG-stream is corrupted! + } + + if (crc != null) crc.add_bits (allocation, 4); + if (allocation != 0) + { + samplelength = allocation + 1; + factor = table_factor[allocation]; + offset = table_offset[allocation]; + } + } + + /** + * + */ + public void read_scalefactor(Bitstream stream, Header header) + { + if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)]; + } + + /** + * + */ + public boolean read_sampledata(Bitstream stream) + { + if (allocation != 0) + { + sample = (float) (stream.get_bits(samplelength)); + } + if (++samplenumber == 12) + { + samplenumber = 0; + return true; + } + return false; + } + + /** + * + */ + public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + if ((allocation !=0) && (channels != OutputChannels.RIGHT_CHANNEL)) + { + float scaled_sample = (sample * factor + offset) * scalefactor; + filter1.input_sample (scaled_sample, subbandnumber); + } + return true; + } + }; + + /** + * Class for layer I subbands in joint stereo mode. + */ + static class SubbandLayer1IntensityStereo extends SubbandLayer1 + { + protected float channel2_scalefactor; + + /** + * Constructor + */ + public SubbandLayer1IntensityStereo(int subbandnumber) + { + super(subbandnumber); + } + + /** + * + */ + public void read_allocation(Bitstream stream, Header header, Crc16 crc) throws DecoderException + { + super.read_allocation (stream, header, crc); + } + + /** + * + */ + public void read_scalefactor (Bitstream stream, Header header) + { + if (allocation != 0) + { + scalefactor = scalefactors[stream.get_bits(6)]; + channel2_scalefactor = scalefactors[stream.get_bits(6)]; + } + } + + /** + * + */ + public boolean read_sampledata(Bitstream stream) + { + return super.read_sampledata (stream); + } + + /** + * + */ + public boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + if (allocation !=0 ) + { + sample = sample * factor + offset; // requantization + if (channels == OutputChannels.BOTH_CHANNELS) + { + float sample1 = sample * scalefactor, + sample2 = sample * channel2_scalefactor; + filter1.input_sample(sample1, subbandnumber); + filter2.input_sample(sample2, subbandnumber); + } + else if (channels == OutputChannels.LEFT_CHANNEL) + { + float sample1 = sample * scalefactor; + filter1.input_sample(sample1, subbandnumber); + } + else + { + float sample2 = sample * channel2_scalefactor; + filter1.input_sample(sample2, subbandnumber); + } + } + return true; + } + }; + + /** + * Class for layer I subbands in stereo mode. + */ + static class SubbandLayer1Stereo extends SubbandLayer1 + { + protected int channel2_allocation; + protected float channel2_scalefactor; + protected int channel2_samplelength; + protected float channel2_sample; + protected float channel2_factor, channel2_offset; + + + /** + * Constructor + */ + public SubbandLayer1Stereo(int subbandnumber) + { + super(subbandnumber); + } + + /** + * + */ + public void read_allocation (Bitstream stream, Header header, Crc16 crc) throws DecoderException + { + allocation = stream.get_bits(4); + channel2_allocation = stream.get_bits(4); + if (crc != null) + { + crc.add_bits (allocation, 4); + crc.add_bits (channel2_allocation, 4); + } + if (allocation != 0) + { + samplelength = allocation + 1; + factor = table_factor[allocation]; + offset = table_offset[allocation]; + } + if (channel2_allocation != 0) + { + channel2_samplelength = channel2_allocation + 1; + channel2_factor = table_factor[channel2_allocation]; + channel2_offset = table_offset[channel2_allocation]; + } + } + + /** + * + */ + public void read_scalefactor(Bitstream stream, Header header) + { + if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)]; + if (channel2_allocation != 0) channel2_scalefactor = scalefactors[stream.get_bits(6)]; + } + + /** + * + */ + public boolean read_sampledata (Bitstream stream) + { + boolean returnvalue = super.read_sampledata(stream); + if (channel2_allocation != 0) + { + channel2_sample = (float) (stream.get_bits(channel2_samplelength)); + } + return(returnvalue); + } + + /** + * + */ + public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + super.put_next_sample (channels, filter1, filter2); + if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL)) + { + float sample2 = (channel2_sample * channel2_factor + channel2_offset) * + channel2_scalefactor; + if (channels == OutputChannels.BOTH_CHANNELS) + filter2.input_sample (sample2, subbandnumber); + else + filter1.input_sample (sample2, subbandnumber); + } + return true; + } + }; + +} diff --git a/src/javazoom/jl/decoder/LayerIIDecoder.java b/src/javazoom/jl/decoder/LayerIIDecoder.java new file mode 100644 index 0000000..7265b1f --- /dev/null +++ b/src/javazoom/jl/decoder/LayerIIDecoder.java @@ -0,0 +1,1064 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 29/05/01 Michael Scheerer, Fixed some C++ to Java porting bugs. + * + * 16/07/01 Michael Scheerer, Catched a bug in method + * read_sampledata, which causes an outOfIndexException. + * + * 12/12/99 Initial version. Adapted from javalayer.java + * and Subband*.java. mdm@techie.com + * + * 02/28/99 Initial version : javalayer.java by E.B + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Implements decoding of MPEG Audio Layer II frames. + */ +class LayerIIDecoder extends LayerIDecoder implements FrameDecoder +{ + + public LayerIIDecoder() + { + } + + + protected void createSubbands() + { + int i; + if (mode == Header.SINGLE_CHANNEL) + for (i = 0; i < num_subbands; ++i) + subbands[i] = new SubbandLayer2(i); + else if (mode == Header.JOINT_STEREO) + { + for (i = 0; i < header.intensity_stereo_bound(); ++i) + subbands[i] = new SubbandLayer2Stereo(i); + for (; i < num_subbands; ++i) + subbands[i] = new SubbandLayer2IntensityStereo(i); + } + else + { + for (i = 0; i < num_subbands; ++i) + subbands[i] = new SubbandLayer2Stereo(i); + } + + } + + protected void readScaleFactorSelection() + { + for (int i = 0; i < num_subbands; ++i) + ((SubbandLayer2)subbands[i]).read_scalefactor_selection(stream, crc); + } + + + + /** + * Class for layer II subbands in single channel mode. + */ + static class SubbandLayer2 extends Subband + { + // this table contains 3 requantized samples for each legal codeword + // when grouped in 5 bits, i.e. 3 quantizationsteps per sample + public static final float grouping_5bits[] = new float[] + { + -2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, + 0.0f, -2.0f/3.0f, -2.0f/3.0f, + 2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, + -2.0f/3.0f, 0.0f, -2.0f/3.0f, + 0.0f, 0.0f, -2.0f/3.0f, + 2.0f/3.0f, 0.0f, -2.0f/3.0f, + -2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, + 0.0f, 2.0f/3.0f, -2.0f/3.0f, + 2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, + -2.0f/3.0f, -2.0f/3.0f, 0.0f, + 0.0f, -2.0f/3.0f, 0.0f, + 2.0f/3.0f, -2.0f/3.0f, 0.0f, + -2.0f/3.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, + 2.0f/3.0f, 0.0f, 0.0f, + -2.0f/3.0f, 2.0f/3.0f, 0.0f, + 0.0f, 2.0f/3.0f, 0.0f, + 2.0f/3.0f, 2.0f/3.0f, 0.0f, + -2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, + 0.0f, -2.0f/3.0f, 2.0f/3.0f, + 2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, + -2.0f/3.0f, 0.0f, 2.0f/3.0f, + 0.0f, 0.0f, 2.0f/3.0f, + 2.0f/3.0f, 0.0f, 2.0f/3.0f, + -2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, + 0.0f, 2.0f/3.0f, 2.0f/3.0f, + 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f + }; + + // this table contains 3 requantized samples for each legal codeword + // when grouped in 7 bits, i.e. 5 quantizationsteps per sample + public static final float grouping_7bits[] = new float[] + { + -0.8f, -0.8f, -0.8f, -0.4f, -0.8f, -0.8f, 0.0f, -0.8f, -0.8f, 0.4f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f, + -0.8f, -0.4f, -0.8f, -0.4f, -0.4f, -0.8f, 0.0f, -0.4f, -0.8f, 0.4f, -0.4f, -0.8f, 0.8f, -0.4f, -0.8f, + -0.8f, 0.0f, -0.8f, -0.4f, 0.0f, -0.8f, 0.0f, 0.0f, -0.8f, 0.4f, 0.0f, -0.8f, 0.8f, 0.0f, -0.8f, + -0.8f, 0.4f, -0.8f, -0.4f, 0.4f, -0.8f, 0.0f, 0.4f, -0.8f, 0.4f, 0.4f, -0.8f, 0.8f, 0.4f, -0.8f, + -0.8f, 0.8f, -0.8f, -0.4f, 0.8f, -0.8f, 0.0f, 0.8f, -0.8f, 0.4f, 0.8f, -0.8f, 0.8f, 0.8f, -0.8f, + -0.8f, -0.8f, -0.4f, -0.4f, -0.8f, -0.4f, 0.0f, -0.8f, -0.4f, 0.4f, -0.8f, -0.4f, 0.8f, -0.8f, -0.4f, + -0.8f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.0f, -0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.8f, -0.4f, -0.4f, + -0.8f, 0.0f, -0.4f, -0.4f, 0.0f, -0.4f, 0.0f, 0.0f, -0.4f, 0.4f, 0.0f, -0.4f, 0.8f, 0.0f, -0.4f, + -0.8f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.0f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.8f, 0.4f, -0.4f, + -0.8f, 0.8f, -0.4f, -0.4f, 0.8f, -0.4f, 0.0f, 0.8f, -0.4f, 0.4f, 0.8f, -0.4f, 0.8f, 0.8f, -0.4f, + -0.8f, -0.8f, 0.0f, -0.4f, -0.8f, 0.0f, 0.0f, -0.8f, 0.0f, 0.4f, -0.8f, 0.0f, 0.8f, -0.8f, 0.0f, + -0.8f, -0.4f, 0.0f, -0.4f, -0.4f, 0.0f, 0.0f, -0.4f, 0.0f, 0.4f, -0.4f, 0.0f, 0.8f, -0.4f, 0.0f, + -0.8f, 0.0f, 0.0f, -0.4f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.4f, 0.0f, 0.0f, 0.8f, 0.0f, 0.0f, + -0.8f, 0.4f, 0.0f, -0.4f, 0.4f, 0.0f, 0.0f, 0.4f, 0.0f, 0.4f, 0.4f, 0.0f, 0.8f, 0.4f, 0.0f, + -0.8f, 0.8f, 0.0f, -0.4f, 0.8f, 0.0f, 0.0f, 0.8f, 0.0f, 0.4f, 0.8f, 0.0f, 0.8f, 0.8f, 0.0f, + -0.8f, -0.8f, 0.4f, -0.4f, -0.8f, 0.4f, 0.0f, -0.8f, 0.4f, 0.4f, -0.8f, 0.4f, 0.8f, -0.8f, 0.4f, + -0.8f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.0f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, 0.8f, -0.4f, 0.4f, + -0.8f, 0.0f, 0.4f, -0.4f, 0.0f, 0.4f, 0.0f, 0.0f, 0.4f, 0.4f, 0.0f, 0.4f, 0.8f, 0.0f, 0.4f, + -0.8f, 0.4f, 0.4f, -0.4f, 0.4f, 0.4f, 0.0f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.8f, 0.4f, 0.4f, + -0.8f, 0.8f, 0.4f, -0.4f, 0.8f, 0.4f, 0.0f, 0.8f, 0.4f, 0.4f, 0.8f, 0.4f, 0.8f, 0.8f, 0.4f, + -0.8f, -0.8f, 0.8f, -0.4f, -0.8f, 0.8f, 0.0f, -0.8f, 0.8f, 0.4f, -0.8f, 0.8f, 0.8f, -0.8f, 0.8f, + -0.8f, -0.4f, 0.8f, -0.4f, -0.4f, 0.8f, 0.0f, -0.4f, 0.8f, 0.4f, -0.4f, 0.8f, 0.8f, -0.4f, 0.8f, + -0.8f, 0.0f, 0.8f, -0.4f, 0.0f, 0.8f, 0.0f, 0.0f, 0.8f, 0.4f, 0.0f, 0.8f, 0.8f, 0.0f, 0.8f, + -0.8f, 0.4f, 0.8f, -0.4f, 0.4f, 0.8f, 0.0f, 0.4f, 0.8f, 0.4f, 0.4f, 0.8f, 0.8f, 0.4f, 0.8f, + -0.8f, 0.8f, 0.8f, -0.4f, 0.8f, 0.8f, 0.0f, 0.8f, 0.8f, 0.4f, 0.8f, 0.8f, 0.8f, 0.8f, 0.8f + }; + + // this table contains 3 requantized samples for each legal codeword + // when grouped in 10 bits, i.e. 9 quantizationsteps per sample + public static final float grouping_10bits[] = + { + -8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 0.0f, -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 0.0f, -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, + -2.0f/9.0f, 0.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, + 4.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 0.0f, 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, + -2.0f/9.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, + 4.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, + -2.0f/9.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, + 4.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 0.0f, -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 0.0f, -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, + -2.0f/9.0f, 0.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, + 4.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 0.0f, 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, + -2.0f/9.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, + 4.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, + -8.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, + -2.0f/9.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, + 4.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, + -8.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, + -2.0f/9.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, + 4.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, + -8.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, + -2.0f/9.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, + 4.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, + -8.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f, + -2.0f/9.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f, + 4.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f, + -8.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, + -2.0f/9.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, + 4.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, + -8.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, + -2.0f/9.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, + 4.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, + -8.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, + -2.0f/9.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, + 4.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, + -8.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, + -2.0f/9.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, + 4.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, + -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, + -2.0f/9.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, + 4.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 0.0f, -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 0.0f, -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, + -2.0f/9.0f, 0.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, + 4.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 0.0f, 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, + -2.0f/9.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, + 4.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, + -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, + -2.0f/9.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, + 4.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, + -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, + -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, + -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, + 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f + }; + + // data taken from ISO/IEC DIS 11172, Annexes 3-B.2[abcd] and 3-B.4: + + // subbands 0-2 in tables 3-B.2a and 2b: (index is allocation) + public static final int table_ab1_codelength[] = + // bits per codeword + { 0, 5, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + public static final float table_ab1_groupingtables[][] = + // pointer to sample grouping table, or NULL-pointer if ungrouped + { null, grouping_5bits, null, null, null, null, null, null, null, null, null, null, null, null, null, null }; + + public static final float table_ab1_factor[] = + // factor for requantization: (real)sample * factor - 1.0 gives requantized sample + { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f, + 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, + 1.0f/4096.0f, 1.0f/8192.0f, 1.0f/16384.0f, 1.0f/32768.0f }; + + public static final float table_ab1_c[] = + // factor c for requantization from table 3-B.4 + { 0.0f, 1.33333333333f, 1.14285714286f, 1.06666666666f, 1.03225806452f, + 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, 1.00097751711f, + 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f, 1.00003051851f, + 1.00001525902f }; + + public static final float table_ab1_d[] = + // addend d for requantization from table 3-B.4 + { 0.0f, 0.50000000000f, 0.25000000000f, 0.12500000000f, 0.06250000000f, + 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, 0.00195312500f, + 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f, 0.00006103516f, + 0.00003051758f }; + + // subbands 3-... tables 3-B.2a and 2b: + public static final float[] table_ab234_groupingtables[] = + { null, grouping_5bits, grouping_7bits, null, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null }; + + // subbands 3-10 in tables 3-B.2a and 2b: + public static final int table_ab2_codelength[] = + { 0, 5, 7, 3, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }; + public static final float table_ab2_factor[] = + { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, + 1.0f/32.0f, 1.0f/64.0f, 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, + 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, 1.0f/32768.0f }; + public static final float table_ab2_c[] = + { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f, + 1.06666666666f, 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, + 1.00195694716f, 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, + 1.00001525902f }; + public static final float table_ab2_d[] = + { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f, + 0.12500000000f, 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, + 0.00390625000f, 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, + 0.00003051758f }; + + // subbands 11-22 in tables 3-B.2a and 2b: + public static final int table_ab3_codelength[] = { 0, 5, 7, 3, 10, 4, 5, 16 }; + public static final float table_ab3_factor[] = + { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32768.0f }; + public static final float table_ab3_c[] = + { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f, + 1.06666666666f, 1.03225806452f, 1.00001525902f }; + public static final float table_ab3_d[] = + { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f, + 0.12500000000f, 0.06250000000f, 0.00003051758f }; + + // subbands 23-... in tables 3-B.2a and 2b: + public static final int table_ab4_codelength[] = { 0, 5, 7, 16 }; + public static final float table_ab4_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/32768.0f }; + public static final float table_ab4_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.00001525902f }; + public static final float table_ab4_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.00003051758f }; + + // subbands in tables 3-B.2c and 2d: + public static final int table_cd_codelength[] = + { 0, 5, 7, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + public static final float table_cd_groupingtables[][] = + { null, grouping_5bits, grouping_7bits, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null, null }; + public static final float table_cd_factor[] = + { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f, + 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, + 1.0f/8192.0f, 1.0f/16384.0f }; + public static final float table_cd_c[] = + { 0.0f, 1.33333333333f, 1.60000000000f, 1.77777777777f, 1.06666666666f, + 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, + 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f, + 1.00003051851f }; + public static final float table_cd_d[] = + { 0.0f, 0.50000000000f, 0.50000000000f, 0.50000000000f, 0.12500000000f, + 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, + 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f, + 0.00006103516f }; + + + + protected int subbandnumber; + protected int allocation; + protected int scfsi; + protected float scalefactor1, scalefactor2, scalefactor3; + protected int[] codelength = {0}; + protected float groupingtable[][] = new float[2][]; + //protected float[][] groupingtable = {{0},{0}} ; + protected float[] factor = {0.0f}; + protected int groupnumber; + protected int samplenumber; + protected float[] samples = new float[3]; + protected float[] c = {0}; + protected float[] d = {0}; + /** + * Constructor + */ + public SubbandLayer2(int subbandnumber) + { + this.subbandnumber = subbandnumber; + groupnumber = samplenumber = 0; + } + + + /** + * + */ + protected int get_allocationlength (Header header) + { + if (header.version() == Header.MPEG1) + { + int channel_bitrate = header.bitrate_index(); + + // calculate bitrate per channel: + if (header.mode() != Header.SINGLE_CHANNEL) + if (channel_bitrate == 4) + channel_bitrate = 1; + else + channel_bitrate -= 4; + + if (channel_bitrate == 1 || channel_bitrate == 2) + // table 3-B.2c or 3-B.2d + if (subbandnumber <= 1) + return 4; + else + return 3; + else + // tables 3-B.2a or 3-B.2b + if (subbandnumber <= 10) + return 4; + else if (subbandnumber <= 22) + return 3; + else + return 2; + } + else + { // MPEG-2 LSF -- Jeff + + // table B.1 of ISO/IEC 13818-3 + if (subbandnumber <= 3) + return 4; + else if (subbandnumber <= 10) + return 3; + else + return 2; + } + } + + /** + * + */ + protected void prepare_sample_reading(Header header, int allocation, + //float[][] groupingtable, + int channel, + float[] factor, int[] codelength, + float[] c, float[] d) + { + int channel_bitrate = header.bitrate_index(); + // calculate bitrate per channel: + if (header.mode() != Header.SINGLE_CHANNEL) + if (channel_bitrate == 4) + channel_bitrate = 1; + else + channel_bitrate -= 4; + + if (channel_bitrate == 1 || channel_bitrate == 2) + { + // table 3-B.2c or 3-B.2d + groupingtable[channel] = table_cd_groupingtables[allocation]; + factor[0] = table_cd_factor[allocation]; + codelength[0] = table_cd_codelength[allocation]; + c[0] = table_cd_c[allocation]; + d[0] = table_cd_d[allocation]; + } + else + { + // tables 3-B.2a or 3-B.2b + if (subbandnumber <= 2) + { + groupingtable[channel] = table_ab1_groupingtables[allocation]; + factor[0] = table_ab1_factor[allocation]; + codelength[0] = table_ab1_codelength[allocation]; + c[0] = table_ab1_c[allocation]; + d[0] = table_ab1_d[allocation]; + } + else + { + groupingtable[channel] = table_ab234_groupingtables[allocation]; + if (subbandnumber <= 10) + { + factor[0] = table_ab2_factor[allocation]; + codelength[0] = table_ab2_codelength[allocation]; + c[0] = table_ab2_c[allocation]; + d[0] = table_ab2_d[allocation]; + } + else if (subbandnumber <= 22) + { + factor[0] = table_ab3_factor[allocation]; + codelength[0] = table_ab3_codelength[allocation]; + c[0] = table_ab3_c[allocation]; + d[0] = table_ab3_d[allocation]; + } + else + { + factor[0] = table_ab4_factor[allocation]; + codelength[0] = table_ab4_codelength[allocation]; + c[0] = table_ab4_c[allocation]; + d[0] = table_ab4_d[allocation]; + } + } + } + } + + + /** + * + */ + public void read_allocation(Bitstream stream, Header header, Crc16 crc) + { + int length = get_allocationlength(header); + allocation = stream.get_bits(length); + if (crc != null) + crc.add_bits(allocation, length); + } + + /** + * + */ + public void read_scalefactor_selection (Bitstream stream, Crc16 crc) + { + if (allocation != 0) + { + scfsi = stream.get_bits(2); + if (crc != null) crc.add_bits(scfsi, 2); + } + } + + /** + * + */ + public void read_scalefactor (Bitstream stream, Header header) + { + if (allocation != 0) + { + switch (scfsi) + { + case 0: + scalefactor1 = scalefactors[stream.get_bits(6)]; + scalefactor2 = scalefactors[stream.get_bits(6)]; + scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + case 1: + scalefactor1 = scalefactor2 = scalefactors[stream.get_bits(6)]; + scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + case 2: + scalefactor1 = scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + case 3: + scalefactor1 = scalefactors[stream.get_bits(6)]; + scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + } + prepare_sample_reading(header, allocation, 0, + factor, codelength, c, d); + } + } + + /** + * + */ + public boolean read_sampledata (Bitstream stream) + { + if (allocation != 0) + if (groupingtable[0] != null) + { + int samplecode = stream.get_bits(codelength[0]); + // create requantized samples: + samplecode += samplecode << 1; + float[] target = samples; + float[] source = groupingtable[0]; + /* + int tmp = 0; + int temp = 0; + target[tmp++] = source[samplecode + temp]; + temp++; + target[tmp++] = source[samplecode + temp]; + temp++; + target[tmp] = source[samplecode + temp]; + */ + //Bugfix: + int tmp = 0; + int temp = samplecode; + + if(temp > source.length - 3) temp = source.length - 3; + + target[tmp] = source[temp]; + temp++;tmp++; + target[tmp] = source[temp]; + temp++;tmp++; + target[tmp] = source[temp]; + + // memcpy (samples, groupingtable + samplecode, 3 * sizeof (real)); + } + else + { + samples[0] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + samples[1] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + samples[2] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + } + + samplenumber = 0; + if (++groupnumber == 12) + return true; + else + return false; + } + + /** + * + */ + public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL)) + { + float sample = samples[samplenumber]; + + if (groupingtable[0] == null) + sample = (sample + d[0]) * c[0]; + if (groupnumber <= 4) + sample *= scalefactor1; + else if (groupnumber <= 8) + sample *= scalefactor2; + else + sample *= scalefactor3; + filter1.input_sample(sample, subbandnumber); + } + + if (++samplenumber == 3) + return true; + else + return false; + } + }; + + /** + * Class for layer II subbands in joint stereo mode. + */ + static class SubbandLayer2IntensityStereo extends SubbandLayer2 + { + protected int channel2_scfsi; + protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3; + + /** + * Constructor + */ + public SubbandLayer2IntensityStereo (int subbandnumber) + { + super(subbandnumber); + } + + /** + * + */ + public void read_allocation(Bitstream stream, Header header, Crc16 crc) + { + super.read_allocation (stream, header, crc); + } + + /** + * + */ + public void read_scalefactor_selection(Bitstream stream, Crc16 crc) + { + if (allocation != 0) + { + scfsi = stream.get_bits(2); + channel2_scfsi = stream.get_bits(2); + if (crc != null) + { + crc.add_bits(scfsi, 2); + crc.add_bits(channel2_scfsi, 2); + } + } + } + + /** + * + */ + public void read_scalefactor(Bitstream stream, Header header) + { + if (allocation != 0) + { + super.read_scalefactor(stream, header); + switch (channel2_scfsi) + { + case 0: + channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor2 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 1: + channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream.get_bits (6)]; + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 2: + channel2_scalefactor1 = channel2_scalefactor2 = + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 3: + channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits (6)]; + break; + } + } + + } + + /** + * + */ + public boolean read_sampledata(Bitstream stream) + { + return super.read_sampledata (stream); + } + + /** + * + */ + public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + if (allocation != 0) + { + float sample = samples[samplenumber]; + + if (groupingtable[0] == null) + sample = (sample + d[0]) * c[0]; + if (channels == OutputChannels.BOTH_CHANNELS) + { + float sample2 = sample; + if (groupnumber <= 4) + { + sample *= scalefactor1; + sample2 *= channel2_scalefactor1; + } + else if (groupnumber <= 8) + { + sample *= scalefactor2; + sample2 *= channel2_scalefactor2; + } + else + { + sample *= scalefactor3; + sample2 *= channel2_scalefactor3; + } + filter1.input_sample(sample, subbandnumber); + filter2.input_sample(sample2, subbandnumber); + } + else if (channels == OutputChannels.LEFT_CHANNEL) + { + if (groupnumber <= 4) + sample *= scalefactor1; + else if (groupnumber <= 8) + sample *= scalefactor2; + else + sample *= scalefactor3; + filter1.input_sample(sample, subbandnumber); + } + else + { + if (groupnumber <= 4) + sample *= channel2_scalefactor1; + else if (groupnumber <= 8) + sample *= channel2_scalefactor2; + else + sample *= channel2_scalefactor3; + filter1.input_sample(sample, subbandnumber); + } + } + + if (++samplenumber == 3) + return true; + else + return false; + } + }; + + /** + * Class for layer II subbands in stereo mode. + */ + static class SubbandLayer2Stereo extends SubbandLayer2 + { + protected int channel2_allocation; + protected int channel2_scfsi; + protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3; + //protected boolean channel2_grouping; ???? Never used! + protected int[] channel2_codelength = {0}; + //protected float[][] channel2_groupingtable = {{0},{0}}; + protected float[] channel2_factor = {0}; + protected float[] channel2_samples; + protected float[] channel2_c = {0}; + protected float[] channel2_d = {0}; + + /** + * Constructor + */ + public SubbandLayer2Stereo(int subbandnumber) + { + super(subbandnumber); + channel2_samples = new float[3]; + } + + /** + * + */ + public void read_allocation (Bitstream stream, Header header, Crc16 crc) + { + int length = get_allocationlength(header); + allocation = stream.get_bits(length); + channel2_allocation = stream.get_bits(length); + if (crc != null) + { + crc.add_bits(allocation, length); + crc.add_bits(channel2_allocation, length); + } + } + + /** + * + */ + public void read_scalefactor_selection(Bitstream stream, Crc16 crc) + { + if (allocation != 0) + { + scfsi = stream.get_bits(2); + if (crc != null) + crc.add_bits(scfsi, 2); + } + if (channel2_allocation != 0) + { + channel2_scfsi = stream.get_bits(2); + if (crc != null) + crc.add_bits(channel2_scfsi, 2); + } + } + + /** + * + */ + public void read_scalefactor(Bitstream stream, Header header) + { + super.read_scalefactor(stream, header); + if (channel2_allocation != 0) + { + switch (channel2_scfsi) + { + case 0: + channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor2 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 1: + channel2_scalefactor1 = channel2_scalefactor2 = + scalefactors[stream.get_bits(6)]; + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 2: + channel2_scalefactor1 = channel2_scalefactor2 = + channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; + break; + + case 3: + channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; + channel2_scalefactor2 = channel2_scalefactor3 = + scalefactors[stream.get_bits(6)]; + break; + } + prepare_sample_reading(header, channel2_allocation, 1, + channel2_factor, channel2_codelength, channel2_c, + channel2_d); + } + } + + /** + * + */ + public boolean read_sampledata (Bitstream stream) + { + boolean returnvalue = super.read_sampledata(stream); + + if (channel2_allocation != 0) + if (groupingtable[1] != null) + { + int samplecode = stream.get_bits(channel2_codelength[0]); + // create requantized samples: + samplecode += samplecode << 1; + /* + float[] target = channel2_samples; + float[] source = channel2_groupingtable[0]; + int tmp = 0; + int temp = 0; + target[tmp++] = source[samplecode + temp]; + temp++; + target[tmp++] = source[samplecode + temp]; + temp++; + target[tmp] = source[samplecode + temp]; + // memcpy (channel2_samples, channel2_groupingtable + samplecode, 3 * sizeof (real)); + */ + float[] target = channel2_samples; + float[] source = groupingtable[1]; + int tmp = 0; + int temp = samplecode; + target[tmp] = source[temp]; + temp++;tmp++; + target[tmp] = source[temp]; + temp++;tmp++; + target[tmp] = source[temp]; + + } + else + { + channel2_samples[0] = (float) ((stream.get_bits(channel2_codelength[0])) * + channel2_factor[0] - 1.0); + channel2_samples[1] = (float) ((stream.get_bits(channel2_codelength[0])) * + channel2_factor[0] - 1.0); + channel2_samples[2] = (float) ((stream.get_bits(channel2_codelength[0])) * + channel2_factor[0] - 1.0); + } + return returnvalue; + } + + /** + * + */ + public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) + { + boolean returnvalue = super.put_next_sample(channels, filter1, filter2); + if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL)) + { + float sample = channel2_samples[samplenumber - 1]; + + if (groupingtable[1] == null) + sample = (sample + channel2_d[0]) * channel2_c[0]; + + if (groupnumber <= 4) + sample *= channel2_scalefactor1; + else if (groupnumber <= 8) + sample *= channel2_scalefactor2; + else + sample *= channel2_scalefactor3; + if (channels == OutputChannels.BOTH_CHANNELS) + filter2.input_sample(sample, subbandnumber); + else + filter1.input_sample(sample, subbandnumber); + } + return returnvalue; + } + } +} diff --git a/src/javazoom/jl/decoder/LayerIIIDecoder.java b/src/javazoom/jl/decoder/LayerIIIDecoder.java new file mode 100644 index 0000000..602badf --- /dev/null +++ b/src/javazoom/jl/decoder/LayerIIIDecoder.java @@ -0,0 +1,2439 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 18/06/01 Michael Scheerer, Fixed bugs which causes + * negative indexes in method huffmann_decode and in method + * dequanisize_sample. + * + * 16/07/01 Michael Scheerer, Catched a bug in method + * huffmann_decode, which causes an outOfIndexException. + * Cause : Indexnumber of 24 at SfBandIndex, + * which has only a length of 22. I have simply and dirty + * fixed the index to <= 22, because I'm not really be able + * to fix the bug. The Indexnumber is taken from the MP3 + * file and the origin Ma-Player with the same code works + * well. + * + * 02/19/99 Java Conversion by E.B, javalayer@javazoom.net + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Class Implementing Layer 3 Decoder. + * + * @since 0.0 + */ +final class LayerIIIDecoder implements FrameDecoder +{ + final double d43 = (4.0/3.0); + + public int[] scalefac_buffer; + + // MDM: removed, as this wasn't being used. + //private float CheckSumOut1d = 0.0f; + private int CheckSumHuff = 0; + private int[] is_1d; + private float[][][] ro; + private float[][][] lr; + private float[] out_1d; + private float[][] prevblck; + private float[][] k; + private int[] nonzero; + private Bitstream stream; + private Header header; + private SynthesisFilter filter1, filter2; + private Obuffer buffer; + private int which_channels; + private BitReserve br; + private III_side_info_t si; + + private temporaire2[] III_scalefac_t; + private temporaire2[] scalefac; + // private III_scalefac_t scalefac; + + private int max_gr; + private int frame_start; + private int part2_start; + private int channels; + private int first_channel; + private int last_channel; + private int sfreq; + + + /** + * Constructor. + */ + // REVIEW: these constructor arguments should be moved to the + // decodeFrame() method, where possible, so that one + public LayerIIIDecoder(Bitstream stream0, Header header0, + SynthesisFilter filtera, SynthesisFilter filterb, + Obuffer buffer0, int which_ch0) + { + huffcodetab.inithuff(); + is_1d = new int[SBLIMIT*SSLIMIT+4]; + ro = new float[2][SBLIMIT][SSLIMIT]; + lr = new float[2][SBLIMIT][SSLIMIT]; + out_1d = new float[SBLIMIT*SSLIMIT]; + prevblck = new float[2][SBLIMIT*SSLIMIT]; + k = new float[2][SBLIMIT*SSLIMIT]; + nonzero = new int[2]; + + //III_scalefact_t + III_scalefac_t = new temporaire2[2]; + III_scalefac_t[0] = new temporaire2(); + III_scalefac_t[1] = new temporaire2(); + scalefac = III_scalefac_t; + // L3TABLE INIT + + sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices + int[] l0 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; + int[] s0 = {0,4,8,12,18,24,32,42,56,74,100,132,174,192}; + int[] l1 = {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}; + int[] s1 = {0,4,8,12,18,26,36,48,62,80,104,136,180,192}; + int[] l2 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; + int[] s2 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; + + int[] l3 = {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576}; + int[] s3 = {0,4,8,12,16,22,30,40,52,66,84,106,136,192}; + int[] l4 = {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576}; + int[] s4 = {0,4,8,12,16,22,28,38,50,64,80,100,126,192}; + int[] l5 = {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576}; + int[] s5 = {0,4,8,12,16,22,30,42,58,78,104,138,180,192}; + // SZD: MPEG2.5 + int[] l6 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; + int[] s6 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; + int[] l7 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; + int[] s7 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; + int[] l8 = {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}; + int[] s8 = {0,8,16,24,36,52,72,96,124,160,162,164,166,192}; + + sfBandIndex[0]= new SBI(l0,s0); + sfBandIndex[1]= new SBI(l1,s1); + sfBandIndex[2]= new SBI(l2,s2); + + sfBandIndex[3]= new SBI(l3,s3); + sfBandIndex[4]= new SBI(l4,s4); + sfBandIndex[5]= new SBI(l5,s5); + //SZD: MPEG2.5 + sfBandIndex[6]= new SBI(l6,s6); + sfBandIndex[7]= new SBI(l7,s7); + sfBandIndex[8]= new SBI(l8,s8); + // END OF L3TABLE INIT + + if(reorder_table == null) { // SZD: generate LUT + reorder_table = new int[9][]; + for(int i = 0; i < 9; i++) + reorder_table[i] = reorder(sfBandIndex[i].s); + } + + // Sftable + int[] ll0 = {0, 6, 11, 16, 21}; + int[] ss0 = {0, 6, 12}; + sftable = new Sftable(ll0,ss0); + // END OF Sftable + + // scalefac_buffer + scalefac_buffer = new int[54]; + // END OF scalefac_buffer + + stream = stream0; + header = header0; + filter1 = filtera; + filter2 = filterb; + buffer = buffer0; + which_channels = which_ch0; + + frame_start = 0; + channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2; + max_gr = (header.version() == Header.MPEG1) ? 2 : 1; + + sfreq = header.sample_frequency() + + ((header.version() == Header.MPEG1) ? 3 : + (header.version() == Header.MPEG25_LSF) ? 6 : 0); // SZD + + if (channels == 2) + { + switch (which_channels) + { + case OutputChannels.LEFT_CHANNEL: + case OutputChannels.DOWNMIX_CHANNELS: + first_channel = last_channel = 0; + break; + + case OutputChannels.RIGHT_CHANNEL: + first_channel = last_channel = 1; + break; + + case OutputChannels.BOTH_CHANNELS: + default: + first_channel = 0; + last_channel = 1; + break; + } + } + else + { + first_channel = last_channel = 0; + } + + for(int ch=0;ch<2;ch++) + for (int j=0; j<576; j++) + prevblck[ch][j] = 0.0f; + + nonzero[0] = nonzero[1] = 576; + + br = new BitReserve(); + si = new III_side_info_t(); + } + + /** + * Notify decoder that a seek is being made. + */ + public void seek_notify() + { + frame_start = 0; + for(int ch=0;ch<2;ch++) + for (int j=0; j<576; j++) + prevblck[ch][j] = 0.0f; + br = new BitReserve(); + } + + public void decodeFrame() + { + decode(); + } + + /** + * Decode one frame, filling the buffer with the output samples. + */ + + // subband samples are buffered and passed to the + // SynthesisFilter in one go. + private float[] samples1 = new float[32]; + private float[] samples2 = new float[32]; + + public void decode() + { + int nSlots = header.slots(); + int flush_main; + int gr, ch, ss, sb, sb18; + int main_data_end; + int bytes_to_discard; + int i; + + get_side_info(); + + for (i=0; i>> 3; // of previous frame + + if ((flush_main = (br.hsstell() & 7)) != 0) { + br.hgetbits(8 - flush_main); + main_data_end++; + } + + bytes_to_discard = frame_start - main_data_end + - si.main_data_begin; + + frame_start += nSlots; + + if (bytes_to_discard < 0) + return; + + if (main_data_end > 4096) { + frame_start -= 4096; + br.rewindNbytes(4096); + } + + for (; bytes_to_discard > 0; bytes_to_discard--) + br.hgetbits(8); + + for (gr=0;gr>> 4) / 5 ; + new_slen[1] = (scalefac_comp >>> 4) % 5 ; + new_slen[2] = (scalefac_comp & 0xF) >>> 2 ; + new_slen[3] = (scalefac_comp & 3); + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 0; + + } else if (scalefac_comp < 500) { + + new_slen[0] = ((scalefac_comp - 400) >>> 2) / 5 ; + new_slen[1] = ((scalefac_comp - 400) >>> 2) % 5 ; + new_slen[2] = (scalefac_comp - 400 ) & 3 ; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 1; + + } else if (scalefac_comp < 512) { + + new_slen[0] = (scalefac_comp - 500 ) / 3 ; + new_slen[1] = (scalefac_comp - 500) % 3 ; + new_slen[2] = 0; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 1; + blocknumber = 2; + } + } + + if((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) + { + int_scalefac_comp = scalefac_comp >>> 1; + + if (int_scalefac_comp < 180) + { + new_slen[0] = int_scalefac_comp / 36 ; + new_slen[1] = (int_scalefac_comp % 36 ) / 6 ; + new_slen[2] = (int_scalefac_comp % 36) % 6; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 3; + } else if (int_scalefac_comp < 244) { + new_slen[0] = ((int_scalefac_comp - 180 ) & 0x3F) >>> 4 ; + new_slen[1] = ((int_scalefac_comp - 180) & 0xF) >>> 2 ; + new_slen[2] = (int_scalefac_comp - 180 ) & 3 ; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 4; + } else if (int_scalefac_comp < 255) { + new_slen[0] = (int_scalefac_comp - 244 ) / 3 ; + new_slen[1] = (int_scalefac_comp - 244 ) % 3 ; + new_slen[2] = 0 ; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 5; + } + } + + for (int x=0; x<45; x++) // why 45, not 54? + scalefac_buffer[x] = 0; + + m = 0; + for (int i=0; i<4;i++) { + for (int j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i]; + j++) + { + scalefac_buffer[m] = (new_slen[i] == 0) ? 0 : + br.hgetbits(new_slen[i]); + m++; + + } // for (unint32 j ... + } // for (uint32 i ... + } + + /** + * + */ + private void get_LSF_scale_factors(int ch, int gr) + { + int m = 0; + int sfb, window; + gr_info_s gr_info = (si.ch[ch].gr[gr]); + + get_LSF_scale_data(ch, gr); + + if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) { + if (gr_info.mixed_block_flag != 0) { // MIXED + for (sfb = 0; sfb < 8; sfb++) + { + scalefac[ch].l[sfb] = scalefac_buffer[m]; + m++; + } + for (sfb = 3; sfb < 12; sfb++) { + for (window=0; window<3; window++) + { + scalefac[ch].s[window][sfb] = scalefac_buffer[m]; + m++; + } + } + for (window=0; window<3; window++) + scalefac[ch].s[window][12] = 0; + + } else { // SHORT + + for (sfb = 0; sfb < 12; sfb++) { + for (window=0; window<3; window++) + { + scalefac[ch].s[window][sfb] = scalefac_buffer[m]; + m++; + } + } + + for (window=0; window<3; window++) + scalefac[ch].s[window][12] = 0; + } + } else { // LONG types 0,1,3 + + for (sfb = 0; sfb < 21; sfb++) { + scalefac[ch].l[sfb] = scalefac_buffer[m]; + m++; + } + scalefac[ch].l[21] = 0; // Jeff + scalefac[ch].l[22] = 0; + } + } + + /** + * + */ + int[] x = {0}; + int[] y = {0}; + int[] v = {0}; + int[] w = {0}; + private void huffman_decode(int ch, int gr) + { + x[0] = 0; + y[0] = 0; + v[0] = 0; + w[0] = 0; + + int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length; + int num_bits; + int region1Start; + int region2Start; + int index; + + int buf, buf1; + + huffcodetab h; + + // Find region boundary for short block case + + if ( ((si.ch[ch].gr[gr].window_switching_flag) != 0) && + (si.ch[ch].gr[gr].block_type == 2) ) { + + // Region2. + //MS: Extrahandling for 8KHZ + region1Start = (sfreq == 8) ? 72 : 36; // sfb[9/3]*3=36 or in case 8KHZ = 72 + region2Start = 576; // No Region2 for short block case + + } else { // Find region boundary for long block case + + buf = si.ch[ch].gr[gr].region0_count + 1; + buf1 = buf + si.ch[ch].gr[gr].region1_count + 1; + + if(buf1 > sfBandIndex[sfreq].l.length - 1) buf1 = sfBandIndex[sfreq].l.length - 1; + + region1Start = sfBandIndex[sfreq].l[buf]; + region2Start = sfBandIndex[sfreq].l[buf1]; /* MI */ + } + + index = 0; + // Read bigvalues area + for (int i=0; i<(si.ch[ch].gr[gr].big_values<<1); i+=2) { + if (i= is_1d.length) System.out.println("i0="+i+"/"+(si.ch[ch].gr[gr].big_values<<1)+" Index="+index+" is_1d="+is_1d.length); + + is_1d[index++] = x[0]; + is_1d[index++] = y[0]; + + CheckSumHuff = CheckSumHuff + x[0] + y[0]; + // System.out.println("x = "+x[0]+" y = "+y[0]); + } + + // Read count1 area + h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select+32]; + num_bits = br.hsstell(); + + while ((num_bits < part2_3_end) && (index < 576)) { + + huffcodetab.huffman_decoder(h, x, y, v, w, br); + + is_1d[index++] = v[0]; + is_1d[index++] = w[0]; + is_1d[index++] = x[0]; + is_1d[index++] = y[0]; + CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0]; + // System.out.println("v = "+v[0]+" w = "+w[0]); + // System.out.println("x = "+x[0]+" y = "+y[0]); + num_bits = br.hsstell(); + } + + if (num_bits > part2_3_end) { + br.rewindNbits(num_bits - part2_3_end); + index-=4; + } + + num_bits = br.hsstell(); + + // Dismiss stuffing bits + if (num_bits < part2_3_end) + br.hgetbits(part2_3_end - num_bits); + + // Zero out rest + + if (index < 576) + nonzero[ch] = index; + else + nonzero[ch] = 576; + + if (index < 0) index = 0; + + // may not be necessary + for (; index<576; index++) + is_1d[index] = 0; + } + + /** + * + */ + private void i_stereo_k_values(int is_pos, int io_type, int i) + { + if (is_pos == 0) { + k[0][i] = 1.0f; + k[1][i] = 1.0f; + } else if ((is_pos & 1) != 0) { + k[0][i] = io[io_type][(is_pos + 1) >>> 1]; + k[1][i] = 1.0f; + } else { + k[0][i] = 1.0f; + k[1][i] = io[io_type][is_pos >>> 1]; + } + } + + /** + * + */ + private void dequantize_sample(float xr[][], int ch, int gr) + { + gr_info_s gr_info = (si.ch[ch].gr[gr]); + int cb=0; + int next_cb_boundary; + int cb_begin = 0; + int cb_width = 0; + int index=0, t_index, j; + float g_gain; + float[][] xr_1d = xr; + + // choose correct scalefactor band per block type, initalize boundary + + if ((gr_info.window_switching_flag !=0 ) && (gr_info.block_type == 2) ) { + if (gr_info.mixed_block_flag != 0) + next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3 + else { + cb_width = sfBandIndex[sfreq].s[1]; + next_cb_boundary = (cb_width << 2) - cb_width; + cb_begin = 0; + } + } else { + next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3 + } + + // Compute overall (global) scaling. + + g_gain = (float) Math.pow(2.0 , (0.25 * (gr_info.global_gain - 210.0))); + + for (j=0; j 0) xr_1d[quotien][reste] = g_gain * t_43[abv]; + else + { + if (-abv < t_43.length) xr_1d[quotien][reste] = -g_gain * t_43[-abv]; + else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43); + } + } + else + { + if (is_1d[j] > 0) xr_1d[quotien][reste] = g_gain * (float)Math.pow(abv, d43); + else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43); + } + } + } + + // apply formula per block type + for (j=0; j= 36)) )) + { + + t_index = (index - cb_begin) / cb_width; + /* xr[sb][ss] *= pow(2.0, ((-2.0 * gr_info.subblock_gain[t_index]) + -(0.5 * (1.0 + gr_info.scalefac_scale) + * scalefac[ch].s[t_index][cb]))); */ + int idx = scalefac[ch].s[t_index][cb] + << gr_info.scalefac_scale; + idx += (gr_info.subblock_gain[t_index] << 2); + + xr_1d[quotien][reste] *= two_to_negative_half_pow[idx]; + + } else { // LONG block types 0,1,3 & 1st 2 subbands of switched blocks + /* xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info.scalefac_scale) + * (scalefac[ch].l[cb] + + gr_info.preflag * pretab[cb])); */ + int idx = scalefac[ch].l[cb]; + + if (gr_info.preflag != 0) + idx += pretab[cb]; + + idx = idx << gr_info.scalefac_scale; + xr_1d[quotien][reste] *= two_to_negative_half_pow[idx]; + } + index++; + } + + for (j=nonzero[ch]; j<576; j++) + { + // Modif E.B 02/22/99 + int reste = j % SSLIMIT; + int quotien = (int) ((j-reste)/SSLIMIT); + if(reste < 0) reste = 0; + if(quotien < 0) quotien = 0; + xr_1d[quotien][reste] = 0.0f; + } + + return; + } + + /** + * + */ + private void reorder(float xr[][], int ch, int gr) + { + gr_info_s gr_info = (si.ch[ch].gr[gr]); + int freq, freq3; + int index; + int sfb, sfb_start, sfb_lines; + int src_line, des_line; + float[][] xr_1d = xr; + + if ((gr_info.window_switching_flag !=0) && (gr_info.block_type == 2)) { + + for(index=0; index<576; index++) + out_1d[index] = 0.0f; + + if (gr_info.mixed_block_flag !=0 ) { + // NO REORDER FOR LOW 2 SUBBANDS + for (index = 0; index < 36; index++) + { + // Modif E.B 02/22/99 + int reste = index % SSLIMIT; + int quotien = (int) ((index-reste)/SSLIMIT); + out_1d[index] = xr_1d[quotien][reste]; + } + // REORDERING FOR REST SWITCHED SHORT + /*for( sfb=3,sfb_start=sfBandIndex[sfreq].s[3], + sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start; + sfb < 13; sfb++,sfb_start = sfBandIndex[sfreq].s[sfb], + sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start ) + {*/ + for( sfb=3; sfb < 13; sfb++) + { + //System.out.println("sfreq="+sfreq+" sfb="+sfb+" sfBandIndex="+sfBandIndex.length+" sfBandIndex[sfreq].s="+sfBandIndex[sfreq].s.length); + sfb_start = sfBandIndex[sfreq].s[sfb]; + sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start; + + int sfb_start3 = (sfb_start << 2) - sfb_start; + + for(freq=0, freq3=0; freq=3; sfb-- ) { + i = sfBandIndex[sfreq].s[sfb]; + lines = sfBandIndex[sfreq].s[sfb+1] - i; + i = (i << 2) - i + (j+1) * lines - 1; + + while (lines > 0) { + if (ro[1][i/18][i%18] != 0.0f) { + // MDM: in java, array access is very slow. + // Is quicker to compute div and mod values. + //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { + sfbcnt = sfb; + sfb = -10; + lines = -10; + } + + lines--; + i--; + + } // while (lines > 0) + + } // for (sfb=12 ... + sfb = sfbcnt + 1; + + if (sfb > max_sfb) + max_sfb = sfb; + + while(sfb < 12) { + temp = sfBandIndex[sfreq].s[sfb]; + sb = sfBandIndex[sfreq].s[sfb+1] - temp; + i = (temp << 2) - temp + j * sb; + + for ( ; sb > 0; sb--) { + is_pos[i] = scalefac[1].s[j][sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + + i++; + } // for (; sb>0... + sfb++; + } // while (sfb < 12) + sfb = sfBandIndex[sfreq].s[10]; + sb = sfBandIndex[sfreq].s[11] - sfb; + sfb = (sfb << 2) - sfb + j * sb; + temp = sfBandIndex[sfreq].s[11]; + sb = sfBandIndex[sfreq].s[12] - temp; + i = (temp << 2) - temp + j * sb; + + for (; sb > 0; sb--) { + is_pos[i] = is_pos[sfb]; + + if (lsf) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // for (; sb > 0 ... + } + if (max_sfb <= 3) { + i = 2; + ss = 17; + sb = -1; + while (i >= 0) { + if (ro[1][i][ss] != 0.0f) { + sb = (i<<4) + (i<<1) + ss; + i = -1; + } else { + ss--; + if (ss < 0) { + i--; + ss = 17; + } + } // if (ro ... + } // while (i>=0) + i = 0; + while (sfBandIndex[sfreq].l[i] <= sb) + i++; + sfb = i; + i = sfBandIndex[sfreq].l[i]; + for (; sfb<8; sfb++) { + sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb]; + for (; sb>0; sb--) { + is_pos[i] = scalefac[1].l[sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } // for (; sb>0 ... + } // for (; sfb<8 ... + } // for (j=0 ... + } else { // if (gr_info.mixed_block_flag) + for (int j=0; j<3; j++) { + int sfbcnt; + sfbcnt = -1; + for( sfb=12; sfb >=0; sfb-- ) + { + temp = sfBandIndex[sfreq].s[sfb]; + lines = sfBandIndex[sfreq].s[sfb+1] - temp; + i = (temp << 2) - temp + (j+1) * lines - 1; + + while (lines > 0) { + if (ro[1][i/18][i%18] != 0.0f) { + // MDM: in java, array access is very slow. + // Is quicker to compute div and mod values. + //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { + sfbcnt = sfb; + sfb = -10; + lines = -10; + } + lines--; + i--; + } // while (lines > 0) */ + + } // for (sfb=12 ... + sfb = sfbcnt + 1; + while(sfb<12) { + temp = sfBandIndex[sfreq].s[sfb]; + sb = sfBandIndex[sfreq].s[sfb+1] - temp; + i = (temp << 2) - temp + j * sb; + for ( ; sb > 0; sb--) { + is_pos[i] = scalefac[1].s[j][sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } // for (; sb>0 ... + sfb++; + } // while (sfb<12) + + temp = sfBandIndex[sfreq].s[10]; + temp2= sfBandIndex[sfreq].s[11]; + sb = temp2 - temp; + sfb = (temp << 2) - temp + j * sb; + sb = sfBandIndex[sfreq].s[12] - temp2; + i = (temp2 << 2) - temp2 + j * sb; + + for (; sb>0; sb--) { + is_pos[i] = is_pos[sfb]; + + if (lsf) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // for (; sb>0 ... + } // for (sfb=12 + } // for (j=0 ... + } else { // if (gr_info.window_switching_flag ... + i = 31; + ss = 17; + sb = 0; + while (i >= 0) { + if (ro[1][i][ss] != 0.0f) { + sb = (i<<4) + (i<<1) + ss; + i = -1; + } else { + ss--; + if (ss < 0) { + i--; + ss = 17; + } + } + } + i = 0; + while (sfBandIndex[sfreq].l[i] <= sb) + i++; + + sfb = i; + i = sfBandIndex[sfreq].l[i]; + for (; sfb<21; sfb++) { + sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb]; + for (; sb > 0; sb--) { + is_pos[i] = scalefac[1].l[sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } + } + sfb = sfBandIndex[sfreq].l[20]; + for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i<576); sb--) + { + is_pos[i] = is_pos[sfb]; // error here : i >=576 + + if (lsf) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // if (gr_info.mixed_block_flag) + } // if (gr_info.window_switching_flag ... + } // if (i_stereo) + + i = 0; + for(sb=0;sb 32767.0f) ? 32767 : + ((sample < -32768.0f) ? -32768 : + (short) sample)); + } + + /** + * Write the samples to the file or directly to the audio hardware. + */ + public abstract void write_buffer(int val); + public abstract void close(); + + /** + * Clears all data in the buffer (for seeking). + */ + public abstract void clear_buffer(); + + /** + * Notify the buffer that the user has stopped the stream. + */ + public abstract void set_stop_flag(); +} diff --git a/src/javazoom/jl/decoder/OutputChannels.java b/src/javazoom/jl/decoder/OutputChannels.java new file mode 100644 index 0000000..58c8310 --- /dev/null +++ b/src/javazoom/jl/decoder/OutputChannels.java @@ -0,0 +1,143 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial implementation. mdm@techie.com. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + + +/** + * A Type-safe representation of the the supported output channel + * constants. + * + * This class is immutable and, hence, is thread safe. + * + * @author Mat McGowan 12/12/99 + * @since 0.0.7 + */ +public class OutputChannels +{ + /** + * Flag to indicate output should include both channels. + */ + public static final int BOTH_CHANNELS = 0; + + /** + * Flag to indicate output should include the left channel only. + */ + public static final int LEFT_CHANNEL = 1; + + /** + * Flag to indicate output should include the right channel only. + */ + public static final int RIGHT_CHANNEL = 2; + + /** + * Flag to indicate output is mono. + */ + public static final int DOWNMIX_CHANNELS = 3; + + + public static final OutputChannels LEFT = new OutputChannels(LEFT_CHANNEL); + public static final OutputChannels RIGHT = new OutputChannels(RIGHT_CHANNEL); + public static final OutputChannels BOTH = new OutputChannels(BOTH_CHANNELS); + public static final OutputChannels DOWNMIX = new OutputChannels(DOWNMIX_CHANNELS); + + + private /*final*/ int outputChannels; + + /** + * Creates an OutputChannels instance + * corresponding to the given channel code. + * + * @param code one of the OutputChannels channel code constants. + * + * @throws IllegalArgumentException if code is not a valid + * channel code. + */ + static public OutputChannels fromInt(int code) + { + switch (code) + { + case LEFT_CHANNEL: + return LEFT; + case RIGHT_CHANNEL: + return RIGHT; + case BOTH_CHANNELS: + return BOTH; + case DOWNMIX_CHANNELS: + return DOWNMIX; + default: + throw new IllegalArgumentException("Invalid channel code: "+code); + } + } + + private OutputChannels(int channels) + { + outputChannels = channels; + + if (channels<0 || channels>3) + throw new IllegalArgumentException("channels"); + } + + /** + * Retrieves the code representing the desired output channels. + * Will be one of LEFT_CHANNEL, RIGHT_CHANNEL, BOTH_CHANNELS + * or DOWNMIX_CHANNELS. + * + * @return the channel code represented by this instance. + */ + public int getChannelsOutputCode() + { + return outputChannels; + } + + /** + * Retrieves the number of output channels represented + * by this channel output type. + * + * @return The number of output channels for this channel output + * type. This will be 2 for BOTH_CHANNELS only, and 1 + * for all other types. + */ + public int getChannelCount() + { + int count = (outputChannels==BOTH_CHANNELS) ? 2 : 1; + return count; + } + + + public boolean equals(Object o) + { + boolean equals = false; + + if (o instanceof OutputChannels) + { + OutputChannels oc = (OutputChannels)o; + equals = (oc.outputChannels == outputChannels); + } + + return equals; + } + + public int hashCode() + { + return outputChannels; + } + +} diff --git a/src/javazoom/jl/decoder/SampleBuffer.java b/src/javazoom/jl/decoder/SampleBuffer.java new file mode 100644 index 0000000..ba4bfa0 --- /dev/null +++ b/src/javazoom/jl/decoder/SampleBuffer.java @@ -0,0 +1,132 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 Initial Version based on FileObuffer. mdm@techie.com. + * + * FileObuffer: + * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * The SampleBuffer class implements an output buffer + * that provides storage for a fixed size block of samples. + */ +public class SampleBuffer extends Obuffer +{ + private short[] buffer; + private int[] bufferp; + private int channels; + private int frequency; + + /** + * Constructor + */ + public SampleBuffer(int sample_frequency, int number_of_channels) + { + buffer = new short[OBUFFERSIZE]; + bufferp = new int[MAXCHANNELS]; + channels = number_of_channels; + frequency = sample_frequency; + + for (int i = 0; i < number_of_channels; ++i) + bufferp[i] = (short)i; + + } + + public int getChannelCount() + { + return this.channels; + } + + public int getSampleFrequency() + { + return this.frequency; + } + + public short[] getBuffer() + { + return this.buffer; + } + + public int getBufferLength() + { + return bufferp[0]; + } + + /** + * Takes a 16 Bit PCM sample. + */ + public void append(int channel, short value) + { + buffer[bufferp[channel]] = value; + bufferp[channel] += channels; + } + + public void appendSamples(int channel, float[] f) + { + int pos = bufferp[channel]; + + short s; + float fs; + for (int i=0; i<32;) + { + fs = f[i++]; + fs = (fs>32767.0f ? 32767.0f + : (fs < -32767.0f ? -32767.0f : fs)); + + s = (short)fs; + buffer[pos] = s; + pos += channels; + } + + bufferp[channel] = pos; + } + + + /** + * Write the samples to the file (Random Acces). + */ + public void write_buffer(int val) + { + + //for (int i = 0; i < channels; ++i) + // bufferp[i] = (short)i; + + } + + public void close() + {} + + /** + * + */ + public void clear_buffer() + { + for (int i = 0; i < channels; ++i) + bufferp[i] = (short)i; + } + + /** + * + */ + public void set_stop_flag() + {} +} diff --git a/src/javazoom/jl/decoder/Source.java b/src/javazoom/jl/decoder/Source.java new file mode 100644 index 0000000..9d6a5d7 --- /dev/null +++ b/src/javazoom/jl/decoder/Source.java @@ -0,0 +1,49 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.IOException; + +/** + * Work in progress. + * + * Class to describe a seekable data source. + * + */ +public interface Source +{ + + public static final long LENGTH_UNKNOWN = -1; + + public int read(byte[] b, int offs, int len) + throws IOException; + + + public boolean willReadBlock(); + + public boolean isSeekable(); + + public long length(); + + public long tell(); + + public long seek(long pos); + +} diff --git a/src/javazoom/jl/decoder/SynthesisFilter.java b/src/javazoom/jl/decoder/SynthesisFilter.java new file mode 100644 index 0000000..581ab03 --- /dev/null +++ b/src/javazoom/jl/decoder/SynthesisFilter.java @@ -0,0 +1,1817 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 04/01/00 Fixes for running under build 23xx Microsoft JVM. mdm. + * + * 19/12/99 Performance improvements to compute_pcm_samples(). + * Mat McGowan. mdm@techie.com. + * + * 16/02/99 Java Conversion by E.B , javalayer@javazoom.net + * + * @(#) synthesis_filter.h 1.8, last edit: 6/15/94 16:52:00 + * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) + * @(#) Berlin University of Technology + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ +package javazoom.jl.decoder; + +import java.io.IOException; + +/** + * A class for the synthesis filter bank. + * This class does a fast downsampling from 32, 44.1 or 48 kHz to 8 kHz, if ULAW is defined. + * Frequencies above 4 kHz are removed by ignoring higher subbands. + */ +final class SynthesisFilter +{ + private float[] v1; + private float[] v2; + private float[] actual_v; // v1 or v2 + private int actual_write_pos; // 0-15 + private float[] samples; // 32 new subband samples + private int channel; + private float scalefactor; + private float[] eq; + + /** + * Quality value for controlling CPU usage/quality tradeoff. + */ + /* + private int quality; + + private int v_inc; + + + + public static final int HIGH_QUALITY = 1; + public static final int MEDIUM_QUALITY = 2; + public static final int LOW_QUALITY = 4; + */ + + /** + * Contructor. + * The scalefactor scales the calculated float pcm samples to short values + * (raw pcm samples are in [-1.0, 1.0], if no violations occur). + */ + public SynthesisFilter(int channelnumber, float factor, float[] eq0) + { + if (d==null) + { + d = load_d(); + d16 = splitArray(d, 16); + } + + v1 = new float[512]; + v2 = new float[512]; + samples = new float[32]; + channel = channelnumber; + scalefactor = factor; + setEQ(eq); + //setQuality(HIGH_QUALITY); + + reset(); + } + + public void setEQ(float[] eq0) + { + this.eq = eq0; + if (eq==null) + { + eq = new float[32]; + for (int i=0; i<32; i++) + eq[i] = 1.0f; + } + if (eq.length<32) + { + throw new IllegalArgumentException("eq0"); + } + + } + + /* + private void setQuality(int quality0) + { + switch (quality0) + { + case HIGH_QUALITY: + case MEDIUM_QUALITY: + case LOW_QUALITY: + v_inc = 16 * quality0; + quality = quality0; + break; + default : + throw new IllegalArgumentException("Unknown quality value"); + } + } + + public int getQuality() + { + return quality; + } + */ + + /** + * Reset the synthesis filter. + */ + public void reset() + { + //float[] floatp; + // float[] floatp2; + + // initialize v1[] and v2[]: + //for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; ) + // *--floatp = *--floatp2 = 0.0; + for (int p=0;p<512;p++) + v1[p] = v2[p] = 0.0f; + + // initialize samples[]: + //for (floatp = samples + 32; floatp > samples; ) + // *--floatp = 0.0; + for (int p2=0;p2<32;p2++) + samples[p2] = 0.0f; + + actual_v = v1; + actual_write_pos = 15; + } + + + /** + * Inject Sample. + */ + public void input_sample(float sample, int subbandnumber) + { + samples[subbandnumber] = eq[subbandnumber]*sample; + } + + public void input_samples(float[] s) + { + for (int i=31; i>=0; i--) + { + samples[i] = s[i]*eq[i]; + } + } + + /** + * Compute new values via a fast cosine transform. + */ + private void compute_new_v() + { + // p is fully initialized from x1 + //float[] p = _p; + // pp is fully initialized from p + //float[] pp = _pp; + + //float[] new_v = _new_v; + + //float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 + //float[] p = new float[16]; + //float[] pp = new float[16]; + + /* + for (int i=31; i>=0; i--) + { + new_v[i] = 0.0f; + } + */ + + float new_v0, new_v1, new_v2, new_v3, new_v4, new_v5, new_v6, new_v7, new_v8, new_v9; + float new_v10, new_v11, new_v12, new_v13, new_v14, new_v15, new_v16, new_v17, new_v18, new_v19; + float new_v20, new_v21, new_v22, new_v23, new_v24, new_v25, new_v26, new_v27, new_v28, new_v29; + float new_v30, new_v31; + + new_v0 = new_v1 = new_v2 = new_v3 = new_v4 = new_v5 = new_v6 = new_v7 = new_v8 = new_v9 = + new_v10 = new_v11 = new_v12 = new_v13 = new_v14 = new_v15 = new_v16 = new_v17 = new_v18 = new_v19 = + new_v20 = new_v21 = new_v22 = new_v23 = new_v24 = new_v25 = new_v26 = new_v27 = new_v28 = new_v29 = + new_v30 = new_v31 = 0.0f; + + +// float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 +// float[] p = new float[16]; +// float[] pp = new float[16]; + + float[] s = samples; + + float s0 = s[0]; + float s1 = s[1]; + float s2 = s[2]; + float s3 = s[3]; + float s4 = s[4]; + float s5 = s[5]; + float s6 = s[6]; + float s7 = s[7]; + float s8 = s[8]; + float s9 = s[9]; + float s10 = s[10]; + float s11 = s[11]; + float s12 = s[12]; + float s13 = s[13]; + float s14 = s[14]; + float s15 = s[15]; + float s16 = s[16]; + float s17 = s[17]; + float s18 = s[18]; + float s19 = s[19]; + float s20 = s[20]; + float s21 = s[21]; + float s22 = s[22]; + float s23 = s[23]; + float s24 = s[24]; + float s25 = s[25]; + float s26 = s[26]; + float s27 = s[27]; + float s28 = s[28]; + float s29 = s[29]; + float s30 = s[30]; + float s31 = s[31]; + + float p0 = s0 + s31; + float p1 = s1 + s30; + float p2 = s2 + s29; + float p3 = s3 + s28; + float p4 = s4 + s27; + float p5 = s5 + s26; + float p6 = s6 + s25; + float p7 = s7 + s24; + float p8 = s8 + s23; + float p9 = s9 + s22; + float p10 = s10 + s21; + float p11 = s11 + s20; + float p12 = s12 + s19; + float p13 = s13 + s18; + float p14 = s14 + s17; + float p15 = s15 + s16; + + float pp0 = p0 + p15; + float pp1 = p1 + p14; + float pp2 = p2 + p13; + float pp3 = p3 + p12; + float pp4 = p4 + p11; + float pp5 = p5 + p10; + float pp6 = p6 + p9; + float pp7 = p7 + p8; + float pp8 = (p0 - p15) * cos1_32; + float pp9 = (p1 - p14) * cos3_32; + float pp10 = (p2 - p13) * cos5_32; + float pp11 = (p3 - p12) * cos7_32; + float pp12 = (p4 - p11) * cos9_32; + float pp13 = (p5 - p10) * cos11_32; + float pp14 = (p6 - p9) * cos13_32; + float pp15 = (p7 - p8) * cos15_32; + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + // this is pretty insane coding + float tmp1; + new_v19/*36-17*/ = -(new_v4 = (new_v12 = p7) + p5) - p6; + new_v27/*44-17*/ = -p6 - p7 - p4; + new_v6 = (new_v10 = (new_v14 = p15) + p11) + p13; + new_v17/*34-17*/ = -(new_v2 = p15 + p13 + p9) - p14; + new_v21/*38-17*/ = (tmp1 = -p14 - p15 - p10 - p11) - p13; + new_v29/*46-17*/ = -p14 - p15 - p12 - p8; + new_v25/*42-17*/ = tmp1 - p12; + new_v31/*48-17*/ = -p0; + new_v0 = p1; + new_v23/*40-17*/ = -(new_v8 = p3) - p2; + + p0 = (s0 - s31) * cos1_64; + p1 = (s1 - s30) * cos3_64; + p2 = (s2 - s29) * cos5_64; + p3 = (s3 - s28) * cos7_64; + p4 = (s4 - s27) * cos9_64; + p5 = (s5 - s26) * cos11_64; + p6 = (s6 - s25) * cos13_64; + p7 = (s7 - s24) * cos15_64; + p8 = (s8 - s23) * cos17_64; + p9 = (s9 - s22) * cos19_64; + p10 = (s10 - s21) * cos21_64; + p11 = (s11 - s20) * cos23_64; + p12 = (s12 - s19) * cos25_64; + p13 = (s13 - s18) * cos27_64; + p14 = (s14 - s17) * cos29_64; + p15 = (s15 - s16) * cos31_64; + + + pp0 = p0 + p15; + pp1 = p1 + p14; + pp2 = p2 + p13; + pp3 = p3 + p12; + pp4 = p4 + p11; + pp5 = p5 + p10; + pp6 = p6 + p9; + pp7 = p7 + p8; + pp8 = (p0 - p15) * cos1_32; + pp9 = (p1 - p14) * cos3_32; + pp10 = (p2 - p13) * cos5_32; + pp11 = (p3 - p12) * cos7_32; + pp12 = (p4 - p11) * cos9_32; + pp13 = (p5 - p10) * cos11_32; + pp14 = (p6 - p9) * cos13_32; + pp15 = (p7 - p8) * cos15_32; + + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + + // manually doing something that a compiler should handle sucks + // coding like this is hard to read + float tmp2; + new_v5 = (new_v11 = (new_v13 = (new_v15 = p15) + p7) + p11) + + p5 + p13; + new_v7 = (new_v9 = p15 + p11 + p3) + p13; + new_v16/*33-17*/ = -(new_v1 = (tmp1 = p13 + p15 + p9) + p1) - p14; + new_v18/*35-17*/ = -(new_v3 = tmp1 + p5 + p7) - p6 - p14; + + new_v22/*39-17*/ = (tmp1 = -p10 - p11 - p14 - p15) + - p13 - p2 - p3; + new_v20/*37-17*/ = tmp1 - p13 - p5 - p6 - p7; + new_v24/*41-17*/ = tmp1 - p12 - p2 - p3; + new_v26/*43-17*/ = tmp1 - p12 - (tmp2 = p4 + p6 + p7); + new_v30/*47-17*/ = (tmp1 = -p8 - p12 - p14 - p15) - p0; + new_v28/*45-17*/ = tmp1 - tmp2; + + // insert V[0-15] (== new_v[0-15]) into actual v: + // float[] x2 = actual_v + actual_write_pos; + float dest[] = actual_v; + + int pos = actual_write_pos; + + dest[0 + pos] = new_v0; + dest[16 + pos] = new_v1; + dest[32 + pos] = new_v2; + dest[48 + pos] = new_v3; + dest[64 + pos] = new_v4; + dest[80 + pos] = new_v5; + dest[96 + pos] = new_v6; + dest[112 + pos] = new_v7; + dest[128 + pos] = new_v8; + dest[144 + pos] = new_v9; + dest[160 + pos] = new_v10; + dest[176 + pos] = new_v11; + dest[192 + pos] = new_v12; + dest[208 + pos] = new_v13; + dest[224 + pos] = new_v14; + dest[240 + pos] = new_v15; + + // V[16] is always 0.0: + dest[256 + pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + dest[272 + pos] = -new_v15; + dest[288 + pos] = -new_v14; + dest[304 + pos] = -new_v13; + dest[320 + pos] = -new_v12; + dest[336 + pos] = -new_v11; + dest[352 + pos] = -new_v10; + dest[368 + pos] = -new_v9; + dest[384 + pos] = -new_v8; + dest[400 + pos] = -new_v7; + dest[416 + pos] = -new_v6; + dest[432 + pos] = -new_v5; + dest[448 + pos] = -new_v4; + dest[464 + pos] = -new_v3; + dest[480 + pos] = -new_v2; + dest[496 + pos] = -new_v1; + + // insert V[32] (== -new_v[0]) into other v: + dest = (actual_v==v1) ? v2 : v1; + + dest[0 + pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + dest[16 + pos] = new_v16; + dest[32 + pos] = new_v17; + dest[48 + pos] = new_v18; + dest[64 + pos] = new_v19; + dest[80 + pos] = new_v20; + dest[96 + pos] = new_v21; + dest[112 + pos] = new_v22; + dest[128 + pos] = new_v23; + dest[144 + pos] = new_v24; + dest[160 + pos] = new_v25; + dest[176 + pos] = new_v26; + dest[192 + pos] = new_v27; + dest[208 + pos] = new_v28; + dest[224 + pos] = new_v29; + dest[240 + pos] = new_v30; + dest[256 + pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + dest[272 + pos] = new_v30; + dest[288 + pos] = new_v29; + dest[304 + pos] = new_v28; + dest[320 + pos] = new_v27; + dest[336 + pos] = new_v26; + dest[352 + pos] = new_v25; + dest[368 + pos] = new_v24; + dest[384 + pos] = new_v23; + dest[400 + pos] = new_v22; + dest[416 + pos] = new_v21; + dest[432 + pos] = new_v20; + dest[448 + pos] = new_v19; + dest[464 + pos] = new_v18; + dest[480 + pos] = new_v17; + dest[496 + pos] = new_v16; +/* + } + else + { + v1[0 + actual_write_pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + v1[16 + actual_write_pos] = new_v16; + v1[32 + actual_write_pos] = new_v17; + v1[48 + actual_write_pos] = new_v18; + v1[64 + actual_write_pos] = new_v19; + v1[80 + actual_write_pos] = new_v20; + v1[96 + actual_write_pos] = new_v21; + v1[112 + actual_write_pos] = new_v22; + v1[128 + actual_write_pos] = new_v23; + v1[144 + actual_write_pos] = new_v24; + v1[160 + actual_write_pos] = new_v25; + v1[176 + actual_write_pos] = new_v26; + v1[192 + actual_write_pos] = new_v27; + v1[208 + actual_write_pos] = new_v28; + v1[224 + actual_write_pos] = new_v29; + v1[240 + actual_write_pos] = new_v30; + v1[256 + actual_write_pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + v1[272 + actual_write_pos] = new_v30; + v1[288 + actual_write_pos] = new_v29; + v1[304 + actual_write_pos] = new_v28; + v1[320 + actual_write_pos] = new_v27; + v1[336 + actual_write_pos] = new_v26; + v1[352 + actual_write_pos] = new_v25; + v1[368 + actual_write_pos] = new_v24; + v1[384 + actual_write_pos] = new_v23; + v1[400 + actual_write_pos] = new_v22; + v1[416 + actual_write_pos] = new_v21; + v1[432 + actual_write_pos] = new_v20; + v1[448 + actual_write_pos] = new_v19; + v1[464 + actual_write_pos] = new_v18; + v1[480 + actual_write_pos] = new_v17; + v1[496 + actual_write_pos] = new_v16; + } +*/ + } + + /** + * Compute new values via a fast cosine transform. + */ + private void compute_new_v_old() + { + // p is fully initialized from x1 + //float[] p = _p; + // pp is fully initialized from p + //float[] pp = _pp; + + //float[] new_v = _new_v; + + float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 + float[] p = new float[16]; + float[] pp = new float[16]; + + + for (int i=31; i>=0; i--) + { + new_v[i] = 0.0f; + } + +// float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 +// float[] p = new float[16]; +// float[] pp = new float[16]; + + float[] x1 = samples; + + p[0] = x1[0] + x1[31]; + p[1] = x1[1] + x1[30]; + p[2] = x1[2] + x1[29]; + p[3] = x1[3] + x1[28]; + p[4] = x1[4] + x1[27]; + p[5] = x1[5] + x1[26]; + p[6] = x1[6] + x1[25]; + p[7] = x1[7] + x1[24]; + p[8] = x1[8] + x1[23]; + p[9] = x1[9] + x1[22]; + p[10] = x1[10] + x1[21]; + p[11] = x1[11] + x1[20]; + p[12] = x1[12] + x1[19]; + p[13] = x1[13] + x1[18]; + p[14] = x1[14] + x1[17]; + p[15] = x1[15] + x1[16]; + + pp[0] = p[0] + p[15]; + pp[1] = p[1] + p[14]; + pp[2] = p[2] + p[13]; + pp[3] = p[3] + p[12]; + pp[4] = p[4] + p[11]; + pp[5] = p[5] + p[10]; + pp[6] = p[6] + p[9]; + pp[7] = p[7] + p[8]; + pp[8] = (p[0] - p[15]) * cos1_32; + pp[9] = (p[1] - p[14]) * cos3_32; + pp[10] = (p[2] - p[13]) * cos5_32; + pp[11] = (p[3] - p[12]) * cos7_32; + pp[12] = (p[4] - p[11]) * cos9_32; + pp[13] = (p[5] - p[10]) * cos11_32; + pp[14] = (p[6] - p[9]) * cos13_32; + pp[15] = (p[7] - p[8]) * cos15_32; + + p[0] = pp[0] + pp[7]; + p[1] = pp[1] + pp[6]; + p[2] = pp[2] + pp[5]; + p[3] = pp[3] + pp[4]; + p[4] = (pp[0] - pp[7]) * cos1_16; + p[5] = (pp[1] - pp[6]) * cos3_16; + p[6] = (pp[2] - pp[5]) * cos5_16; + p[7] = (pp[3] - pp[4]) * cos7_16; + p[8] = pp[8] + pp[15]; + p[9] = pp[9] + pp[14]; + p[10] = pp[10] + pp[13]; + p[11] = pp[11] + pp[12]; + p[12] = (pp[8] - pp[15]) * cos1_16; + p[13] = (pp[9] - pp[14]) * cos3_16; + p[14] = (pp[10] - pp[13]) * cos5_16; + p[15] = (pp[11] - pp[12]) * cos7_16; + + + pp[0] = p[0] + p[3]; + pp[1] = p[1] + p[2]; + pp[2] = (p[0] - p[3]) * cos1_8; + pp[3] = (p[1] - p[2]) * cos3_8; + pp[4] = p[4] + p[7]; + pp[5] = p[5] + p[6]; + pp[6] = (p[4] - p[7]) * cos1_8; + pp[7] = (p[5] - p[6]) * cos3_8; + pp[8] = p[8] + p[11]; + pp[9] = p[9] + p[10]; + pp[10] = (p[8] - p[11]) * cos1_8; + pp[11] = (p[9] - p[10]) * cos3_8; + pp[12] = p[12] + p[15]; + pp[13] = p[13] + p[14]; + pp[14] = (p[12] - p[15]) * cos1_8; + pp[15] = (p[13] - p[14]) * cos3_8; + + p[0] = pp[0] + pp[1]; + p[1] = (pp[0] - pp[1]) * cos1_4; + p[2] = pp[2] + pp[3]; + p[3] = (pp[2] - pp[3]) * cos1_4; + p[4] = pp[4] + pp[5]; + p[5] = (pp[4] - pp[5]) * cos1_4; + p[6] = pp[6] + pp[7]; + p[7] = (pp[6] - pp[7]) * cos1_4; + p[8] = pp[8] + pp[9]; + p[9] = (pp[8] - pp[9]) * cos1_4; + p[10] = pp[10] + pp[11]; + p[11] = (pp[10] - pp[11]) * cos1_4; + p[12] = pp[12] + pp[13]; + p[13] = (pp[12] - pp[13]) * cos1_4; + p[14] = pp[14] + pp[15]; + p[15] = (pp[14] - pp[15]) * cos1_4; + + // this is pretty insane coding + float tmp1; + new_v[36-17] = -(new_v[4] = (new_v[12] = p[7]) + p[5]) - p[6]; + new_v[44-17] = -p[6] - p[7] - p[4]; + new_v[6] = (new_v[10] = (new_v[14] = p[15]) + p[11]) + p[13]; + new_v[34-17] = -(new_v[2] = p[15] + p[13] + p[9]) - p[14]; + new_v[38-17] = (tmp1 = -p[14] - p[15] - p[10] - p[11]) - p[13]; + new_v[46-17] = -p[14] - p[15] - p[12] - p[8]; + new_v[42-17] = tmp1 - p[12]; + new_v[48-17] = -p[0]; + new_v[0] = p[1]; + new_v[40-17] = -(new_v[8] = p[3]) - p[2]; + + p[0] = (x1[0] - x1[31]) * cos1_64; + p[1] = (x1[1] - x1[30]) * cos3_64; + p[2] = (x1[2] - x1[29]) * cos5_64; + p[3] = (x1[3] - x1[28]) * cos7_64; + p[4] = (x1[4] - x1[27]) * cos9_64; + p[5] = (x1[5] - x1[26]) * cos11_64; + p[6] = (x1[6] - x1[25]) * cos13_64; + p[7] = (x1[7] - x1[24]) * cos15_64; + p[8] = (x1[8] - x1[23]) * cos17_64; + p[9] = (x1[9] - x1[22]) * cos19_64; + p[10] = (x1[10] - x1[21]) * cos21_64; + p[11] = (x1[11] - x1[20]) * cos23_64; + p[12] = (x1[12] - x1[19]) * cos25_64; + p[13] = (x1[13] - x1[18]) * cos27_64; + p[14] = (x1[14] - x1[17]) * cos29_64; + p[15] = (x1[15] - x1[16]) * cos31_64; + + + pp[0] = p[0] + p[15]; + pp[1] = p[1] + p[14]; + pp[2] = p[2] + p[13]; + pp[3] = p[3] + p[12]; + pp[4] = p[4] + p[11]; + pp[5] = p[5] + p[10]; + pp[6] = p[6] + p[9]; + pp[7] = p[7] + p[8]; + pp[8] = (p[0] - p[15]) * cos1_32; + pp[9] = (p[1] - p[14]) * cos3_32; + pp[10] = (p[2] - p[13]) * cos5_32; + pp[11] = (p[3] - p[12]) * cos7_32; + pp[12] = (p[4] - p[11]) * cos9_32; + pp[13] = (p[5] - p[10]) * cos11_32; + pp[14] = (p[6] - p[9]) * cos13_32; + pp[15] = (p[7] - p[8]) * cos15_32; + + + p[0] = pp[0] + pp[7]; + p[1] = pp[1] + pp[6]; + p[2] = pp[2] + pp[5]; + p[3] = pp[3] + pp[4]; + p[4] = (pp[0] - pp[7]) * cos1_16; + p[5] = (pp[1] - pp[6]) * cos3_16; + p[6] = (pp[2] - pp[5]) * cos5_16; + p[7] = (pp[3] - pp[4]) * cos7_16; + p[8] = pp[8] + pp[15]; + p[9] = pp[9] + pp[14]; + p[10] = pp[10] + pp[13]; + p[11] = pp[11] + pp[12]; + p[12] = (pp[8] - pp[15]) * cos1_16; + p[13] = (pp[9] - pp[14]) * cos3_16; + p[14] = (pp[10] - pp[13]) * cos5_16; + p[15] = (pp[11] - pp[12]) * cos7_16; + + + pp[0] = p[0] + p[3]; + pp[1] = p[1] + p[2]; + pp[2] = (p[0] - p[3]) * cos1_8; + pp[3] = (p[1] - p[2]) * cos3_8; + pp[4] = p[4] + p[7]; + pp[5] = p[5] + p[6]; + pp[6] = (p[4] - p[7]) * cos1_8; + pp[7] = (p[5] - p[6]) * cos3_8; + pp[8] = p[8] + p[11]; + pp[9] = p[9] + p[10]; + pp[10] = (p[8] - p[11]) * cos1_8; + pp[11] = (p[9] - p[10]) * cos3_8; + pp[12] = p[12] + p[15]; + pp[13] = p[13] + p[14]; + pp[14] = (p[12] - p[15]) * cos1_8; + pp[15] = (p[13] - p[14]) * cos3_8; + + + p[0] = pp[0] + pp[1]; + p[1] = (pp[0] - pp[1]) * cos1_4; + p[2] = pp[2] + pp[3]; + p[3] = (pp[2] - pp[3]) * cos1_4; + p[4] = pp[4] + pp[5]; + p[5] = (pp[4] - pp[5]) * cos1_4; + p[6] = pp[6] + pp[7]; + p[7] = (pp[6] - pp[7]) * cos1_4; + p[8] = pp[8] + pp[9]; + p[9] = (pp[8] - pp[9]) * cos1_4; + p[10] = pp[10] + pp[11]; + p[11] = (pp[10] - pp[11]) * cos1_4; + p[12] = pp[12] + pp[13]; + p[13] = (pp[12] - pp[13]) * cos1_4; + p[14] = pp[14] + pp[15]; + p[15] = (pp[14] - pp[15]) * cos1_4; + + + // manually doing something that a compiler should handle sucks + // coding like this is hard to read + float tmp2; + new_v[5] = (new_v[11] = (new_v[13] = (new_v[15] = p[15]) + p[7]) + p[11]) + + p[5] + p[13]; + new_v[7] = (new_v[9] = p[15] + p[11] + p[3]) + p[13]; + new_v[33-17] = -(new_v[1] = (tmp1 = p[13] + p[15] + p[9]) + p[1]) - p[14]; + new_v[35-17] = -(new_v[3] = tmp1 + p[5] + p[7]) - p[6] - p[14]; + + new_v[39-17] = (tmp1 = -p[10] - p[11] - p[14] - p[15]) + - p[13] - p[2] - p[3]; + new_v[37-17] = tmp1 - p[13] - p[5] - p[6] - p[7]; + new_v[41-17] = tmp1 - p[12] - p[2] - p[3]; + new_v[43-17] = tmp1 - p[12] - (tmp2 = p[4] + p[6] + p[7]); + new_v[47-17] = (tmp1 = -p[8] - p[12] - p[14] - p[15]) - p[0]; + new_v[45-17] = tmp1 - tmp2; + + // insert V[0-15] (== new_v[0-15]) into actual v: + x1 = new_v; + // float[] x2 = actual_v + actual_write_pos; + float[] dest = actual_v; + + dest[0 + actual_write_pos] = x1[0]; + dest[16 + actual_write_pos] = x1[1]; + dest[32 + actual_write_pos] = x1[2]; + dest[48 + actual_write_pos] = x1[3]; + dest[64 + actual_write_pos] = x1[4]; + dest[80 + actual_write_pos] = x1[5]; + dest[96 + actual_write_pos] = x1[6]; + dest[112 + actual_write_pos] = x1[7]; + dest[128 + actual_write_pos] = x1[8]; + dest[144 + actual_write_pos] = x1[9]; + dest[160 + actual_write_pos] = x1[10]; + dest[176 + actual_write_pos] = x1[11]; + dest[192 + actual_write_pos] = x1[12]; + dest[208 + actual_write_pos] = x1[13]; + dest[224 + actual_write_pos] = x1[14]; + dest[240 + actual_write_pos] = x1[15]; + + // V[16] is always 0.0: + dest[256 + actual_write_pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + dest[272 + actual_write_pos] = -x1[15]; + dest[288 + actual_write_pos] = -x1[14]; + dest[304 + actual_write_pos] = -x1[13]; + dest[320 + actual_write_pos] = -x1[12]; + dest[336 + actual_write_pos] = -x1[11]; + dest[352 + actual_write_pos] = -x1[10]; + dest[368 + actual_write_pos] = -x1[9]; + dest[384 + actual_write_pos] = -x1[8]; + dest[400 + actual_write_pos] = -x1[7]; + dest[416 + actual_write_pos] = -x1[6]; + dest[432 + actual_write_pos] = -x1[5]; + dest[448 + actual_write_pos] = -x1[4]; + dest[464 + actual_write_pos] = -x1[3]; + dest[480 + actual_write_pos] = -x1[2]; + dest[496 + actual_write_pos] = -x1[1]; + + // insert V[32] (== -new_v[0]) into other v: + + } + + /** + * Compute PCM Samples. + */ + + private float[] _tmpOut = new float[32]; + + + private void compute_pcm_samples0(Obuffer buffer) + { + final float[] vp = actual_v; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + float pcm_sample; + final float[] dp = d16[i]; + pcm_sample = (float)(((vp[0 + dvp] * dp[0]) + + (vp[15 + dvp] * dp[1]) + + (vp[14 + dvp] * dp[2]) + + (vp[13 + dvp] * dp[3]) + + (vp[12 + dvp] * dp[4]) + + (vp[11 + dvp] * dp[5]) + + (vp[10 + dvp] * dp[6]) + + (vp[9 + dvp] * dp[7]) + + (vp[8 + dvp] * dp[8]) + + (vp[7 + dvp] * dp[9]) + + (vp[6 + dvp] * dp[10]) + + (vp[5 + dvp] * dp[11]) + + (vp[4 + dvp] * dp[12]) + + (vp[3 + dvp] * dp[13]) + + (vp[2 + dvp] * dp[14]) + + (vp[1 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples1(Obuffer buffer) + { + final float[] vp = actual_v; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[1 + dvp] * dp[0]) + + (vp[0 + dvp] * dp[1]) + + (vp[15 + dvp] * dp[2]) + + (vp[14 + dvp] * dp[3]) + + (vp[13 + dvp] * dp[4]) + + (vp[12 + dvp] * dp[5]) + + (vp[11 + dvp] * dp[6]) + + (vp[10 + dvp] * dp[7]) + + (vp[9 + dvp] * dp[8]) + + (vp[8 + dvp] * dp[9]) + + (vp[7 + dvp] * dp[10]) + + (vp[6 + dvp] * dp[11]) + + (vp[5 + dvp] * dp[12]) + + (vp[4 + dvp] * dp[13]) + + (vp[3 + dvp] * dp[14]) + + (vp[2 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples2(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[2 + dvp] * dp[0]) + + (vp[1 + dvp] * dp[1]) + + (vp[0 + dvp] * dp[2]) + + (vp[15 + dvp] * dp[3]) + + (vp[14 + dvp] * dp[4]) + + (vp[13 + dvp] * dp[5]) + + (vp[12 + dvp] * dp[6]) + + (vp[11 + dvp] * dp[7]) + + (vp[10 + dvp] * dp[8]) + + (vp[9 + dvp] * dp[9]) + + (vp[8 + dvp] * dp[10]) + + (vp[7 + dvp] * dp[11]) + + (vp[6 + dvp] * dp[12]) + + (vp[5 + dvp] * dp[13]) + + (vp[4 + dvp] * dp[14]) + + (vp[3 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples3(Obuffer buffer) + { + final float[] vp = actual_v; + + int idx = 0; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[3 + dvp] * dp[0]) + + (vp[2 + dvp] * dp[1]) + + (vp[1 + dvp] * dp[2]) + + (vp[0 + dvp] * dp[3]) + + (vp[15 + dvp] * dp[4]) + + (vp[14 + dvp] * dp[5]) + + (vp[13 + dvp] * dp[6]) + + (vp[12 + dvp] * dp[7]) + + (vp[11 + dvp] * dp[8]) + + (vp[10 + dvp] * dp[9]) + + (vp[9 + dvp] * dp[10]) + + (vp[8 + dvp] * dp[11]) + + (vp[7 + dvp] * dp[12]) + + (vp[6 + dvp] * dp[13]) + + (vp[5 + dvp] * dp[14]) + + (vp[4 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples4(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[4 + dvp] * dp[0]) + + (vp[3 + dvp] * dp[1]) + + (vp[2 + dvp] * dp[2]) + + (vp[1 + dvp] * dp[3]) + + (vp[0 + dvp] * dp[4]) + + (vp[15 + dvp] * dp[5]) + + (vp[14 + dvp] * dp[6]) + + (vp[13 + dvp] * dp[7]) + + (vp[12 + dvp] * dp[8]) + + (vp[11 + dvp] * dp[9]) + + (vp[10 + dvp] * dp[10]) + + (vp[9 + dvp] * dp[11]) + + (vp[8 + dvp] * dp[12]) + + (vp[7 + dvp] * dp[13]) + + (vp[6 + dvp] * dp[14]) + + (vp[5 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples5(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[5 + dvp] * dp[0]) + + (vp[4 + dvp] * dp[1]) + + (vp[3 + dvp] * dp[2]) + + (vp[2 + dvp] * dp[3]) + + (vp[1 + dvp] * dp[4]) + + (vp[0 + dvp] * dp[5]) + + (vp[15 + dvp] * dp[6]) + + (vp[14 + dvp] * dp[7]) + + (vp[13 + dvp] * dp[8]) + + (vp[12 + dvp] * dp[9]) + + (vp[11 + dvp] * dp[10]) + + (vp[10 + dvp] * dp[11]) + + (vp[9 + dvp] * dp[12]) + + (vp[8 + dvp] * dp[13]) + + (vp[7 + dvp] * dp[14]) + + (vp[6 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples6(Obuffer buffer) + { + final float[] vp = actual_v; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[6 + dvp] * dp[0]) + + (vp[5 + dvp] * dp[1]) + + (vp[4 + dvp] * dp[2]) + + (vp[3 + dvp] * dp[3]) + + (vp[2 + dvp] * dp[4]) + + (vp[1 + dvp] * dp[5]) + + (vp[0 + dvp] * dp[6]) + + (vp[15 + dvp] * dp[7]) + + (vp[14 + dvp] * dp[8]) + + (vp[13 + dvp] * dp[9]) + + (vp[12 + dvp] * dp[10]) + + (vp[11 + dvp] * dp[11]) + + (vp[10 + dvp] * dp[12]) + + (vp[9 + dvp] * dp[13]) + + (vp[8 + dvp] * dp[14]) + + (vp[7 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples7(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[7 + dvp] * dp[0]) + + (vp[6 + dvp] * dp[1]) + + (vp[5 + dvp] * dp[2]) + + (vp[4 + dvp] * dp[3]) + + (vp[3 + dvp] * dp[4]) + + (vp[2 + dvp] * dp[5]) + + (vp[1 + dvp] * dp[6]) + + (vp[0 + dvp] * dp[7]) + + (vp[15 + dvp] * dp[8]) + + (vp[14 + dvp] * dp[9]) + + (vp[13 + dvp] * dp[10]) + + (vp[12 + dvp] * dp[11]) + + (vp[11 + dvp] * dp[12]) + + (vp[10 + dvp] * dp[13]) + + (vp[9 + dvp] * dp[14]) + + (vp[8 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples8(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[8 + dvp] * dp[0]) + + (vp[7 + dvp] * dp[1]) + + (vp[6 + dvp] * dp[2]) + + (vp[5 + dvp] * dp[3]) + + (vp[4 + dvp] * dp[4]) + + (vp[3 + dvp] * dp[5]) + + (vp[2 + dvp] * dp[6]) + + (vp[1 + dvp] * dp[7]) + + (vp[0 + dvp] * dp[8]) + + (vp[15 + dvp] * dp[9]) + + (vp[14 + dvp] * dp[10]) + + (vp[13 + dvp] * dp[11]) + + (vp[12 + dvp] * dp[12]) + + (vp[11 + dvp] * dp[13]) + + (vp[10 + dvp] * dp[14]) + + (vp[9 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples9(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[9 + dvp] * dp[0]) + + (vp[8 + dvp] * dp[1]) + + (vp[7 + dvp] * dp[2]) + + (vp[6 + dvp] * dp[3]) + + (vp[5 + dvp] * dp[4]) + + (vp[4 + dvp] * dp[5]) + + (vp[3 + dvp] * dp[6]) + + (vp[2 + dvp] * dp[7]) + + (vp[1 + dvp] * dp[8]) + + (vp[0 + dvp] * dp[9]) + + (vp[15 + dvp] * dp[10]) + + (vp[14 + dvp] * dp[11]) + + (vp[13 + dvp] * dp[12]) + + (vp[12 + dvp] * dp[13]) + + (vp[11 + dvp] * dp[14]) + + (vp[10 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + private void compute_pcm_samples10(Obuffer buffer) + { + final float[] vp = actual_v; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[10 + dvp] * dp[0]) + + (vp[9 + dvp] * dp[1]) + + (vp[8 + dvp] * dp[2]) + + (vp[7 + dvp] * dp[3]) + + (vp[6 + dvp] * dp[4]) + + (vp[5 + dvp] * dp[5]) + + (vp[4 + dvp] * dp[6]) + + (vp[3 + dvp] * dp[7]) + + (vp[2 + dvp] * dp[8]) + + (vp[1 + dvp] * dp[9]) + + (vp[0 + dvp] * dp[10]) + + (vp[15 + dvp] * dp[11]) + + (vp[14 + dvp] * dp[12]) + + (vp[13 + dvp] * dp[13]) + + (vp[12 + dvp] * dp[14]) + + (vp[11 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples11(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[11 + dvp] * dp[0]) + + (vp[10 + dvp] * dp[1]) + + (vp[9 + dvp] * dp[2]) + + (vp[8 + dvp] * dp[3]) + + (vp[7 + dvp] * dp[4]) + + (vp[6 + dvp] * dp[5]) + + (vp[5 + dvp] * dp[6]) + + (vp[4 + dvp] * dp[7]) + + (vp[3 + dvp] * dp[8]) + + (vp[2 + dvp] * dp[9]) + + (vp[1 + dvp] * dp[10]) + + (vp[0 + dvp] * dp[11]) + + (vp[15 + dvp] * dp[12]) + + (vp[14 + dvp] * dp[13]) + + (vp[13 + dvp] * dp[14]) + + (vp[12 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples12(Obuffer buffer) + { + final float[] vp = actual_v; + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[12 + dvp] * dp[0]) + + (vp[11 + dvp] * dp[1]) + + (vp[10 + dvp] * dp[2]) + + (vp[9 + dvp] * dp[3]) + + (vp[8 + dvp] * dp[4]) + + (vp[7 + dvp] * dp[5]) + + (vp[6 + dvp] * dp[6]) + + (vp[5 + dvp] * dp[7]) + + (vp[4 + dvp] * dp[8]) + + (vp[3 + dvp] * dp[9]) + + (vp[2 + dvp] * dp[10]) + + (vp[1 + dvp] * dp[11]) + + (vp[0 + dvp] * dp[12]) + + (vp[15 + dvp] * dp[13]) + + (vp[14 + dvp] * dp[14]) + + (vp[13 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples13(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[13 + dvp] * dp[0]) + + (vp[12 + dvp] * dp[1]) + + (vp[11 + dvp] * dp[2]) + + (vp[10 + dvp] * dp[3]) + + (vp[9 + dvp] * dp[4]) + + (vp[8 + dvp] * dp[5]) + + (vp[7 + dvp] * dp[6]) + + (vp[6 + dvp] * dp[7]) + + (vp[5 + dvp] * dp[8]) + + (vp[4 + dvp] * dp[9]) + + (vp[3 + dvp] * dp[10]) + + (vp[2 + dvp] * dp[11]) + + (vp[1 + dvp] * dp[12]) + + (vp[0 + dvp] * dp[13]) + + (vp[15 + dvp] * dp[14]) + + (vp[14 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples14(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + final float[] dp = d16[i]; + float pcm_sample; + + pcm_sample = (float)(((vp[14 + dvp] * dp[0]) + + (vp[13 + dvp] * dp[1]) + + (vp[12 + dvp] * dp[2]) + + (vp[11 + dvp] * dp[3]) + + (vp[10 + dvp] * dp[4]) + + (vp[9 + dvp] * dp[5]) + + (vp[8 + dvp] * dp[6]) + + (vp[7 + dvp] * dp[7]) + + (vp[6 + dvp] * dp[8]) + + (vp[5 + dvp] * dp[9]) + + (vp[4 + dvp] * dp[10]) + + (vp[3 + dvp] * dp[11]) + + (vp[2 + dvp] * dp[12]) + + (vp[1 + dvp] * dp[13]) + + (vp[0 + dvp] * dp[14]) + + (vp[15 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + private void compute_pcm_samples15(Obuffer buffer) + { + final float[] vp = actual_v; + + //int inc = v_inc; + final float[] tmpOut = _tmpOut; + int dvp =0; + + // fat chance of having this loop unroll + for( int i=0; i<32; i++) + { + float pcm_sample; + final float dp[] = d16[i]; + pcm_sample = (float)(((vp[15 + dvp] * dp[0]) + + (vp[14 + dvp] * dp[1]) + + (vp[13 + dvp] * dp[2]) + + (vp[12 + dvp] * dp[3]) + + (vp[11 + dvp] * dp[4]) + + (vp[10 + dvp] * dp[5]) + + (vp[9 + dvp] * dp[6]) + + (vp[8 + dvp] * dp[7]) + + (vp[7 + dvp] * dp[8]) + + (vp[6 + dvp] * dp[9]) + + (vp[5 + dvp] * dp[10]) + + (vp[4 + dvp] * dp[11]) + + (vp[3 + dvp] * dp[12]) + + (vp[2 + dvp] * dp[13]) + + (vp[1 + dvp] * dp[14]) + + (vp[0 + dvp] * dp[15]) + ) * scalefactor); + + tmpOut[i] = pcm_sample; + dvp += 16; + } // for + } + +private void compute_pcm_samples(Obuffer buffer) +{ + + switch (actual_write_pos) + { + case 0: + compute_pcm_samples0(buffer); + break; + case 1: + compute_pcm_samples1(buffer); + break; + case 2: + compute_pcm_samples2(buffer); + break; + case 3: + compute_pcm_samples3(buffer); + break; + case 4: + compute_pcm_samples4(buffer); + break; + case 5: + compute_pcm_samples5(buffer); + break; + case 6: + compute_pcm_samples6(buffer); + break; + case 7: + compute_pcm_samples7(buffer); + break; + case 8: + compute_pcm_samples8(buffer); + break; + case 9: + compute_pcm_samples9(buffer); + break; + case 10: + compute_pcm_samples10(buffer); + break; + case 11: + compute_pcm_samples11(buffer); + break; + case 12: + compute_pcm_samples12(buffer); + break; + case 13: + compute_pcm_samples13(buffer); + break; + case 14: + compute_pcm_samples14(buffer); + break; + case 15: + compute_pcm_samples15(buffer); + break; + } + + if (buffer!=null) + { + buffer.appendSamples(channel, _tmpOut); + } + +/* + // MDM: I was considering putting in quality control for + // low-spec CPUs, but the performance gain (about 10-15%) + // did not justify the considerable drop in audio quality. + switch (inc) + { + case 16: + buffer.appendSamples(channel, tmpOut); + break; + case 32: + for (int i=0; i<16; i++) + { + buffer.append(channel, (short)tmpOut[i]); + buffer.append(channel, (short)tmpOut[i]); + } + break; + case 64: + for (int i=0; i<8; i++) + { + buffer.append(channel, (short)tmpOut[i]); + buffer.append(channel, (short)tmpOut[i]); + buffer.append(channel, (short)tmpOut[i]); + buffer.append(channel, (short)tmpOut[i]); + } + break; + + } +*/ + } + + /** + * Calculate 32 PCM samples and put the into the Obuffer-object. + */ + + public void calculate_pcm_samples(Obuffer buffer) + { + compute_new_v(); + compute_pcm_samples(buffer); + + actual_write_pos = (actual_write_pos + 1) & 0xf; + actual_v = (actual_v == v1) ? v2 : v1; + + // initialize samples[]: + //for (register float *floatp = samples + 32; floatp > samples; ) + // *--floatp = 0.0f; + + // MDM: this may not be necessary. The Layer III decoder always + // outputs 32 subband samples, but I haven't checked layer I & II. + for (int p=0;p<32;p++) + samples[p] = 0.0f; + } + + + private static final double MY_PI = 3.14159265358979323846; + private static final float cos1_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 64.0))); + private static final float cos3_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 64.0))); + private static final float cos5_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 64.0))); + private static final float cos7_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 64.0))); + private static final float cos9_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 64.0))); + private static final float cos11_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 64.0))); + private static final float cos13_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 64.0))); + private static final float cos15_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 64.0))); + private static final float cos17_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 17.0 / 64.0))); + private static final float cos19_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 19.0 / 64.0))); + private static final float cos21_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 21.0 / 64.0))); + private static final float cos23_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 23.0 / 64.0))); + private static final float cos25_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 25.0 / 64.0))); + private static final float cos27_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 27.0 / 64.0))); + private static final float cos29_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 29.0 / 64.0))); + private static final float cos31_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 31.0 / 64.0))); + private static final float cos1_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 32.0))); + private static final float cos3_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 32.0))); + private static final float cos5_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 32.0))); + private static final float cos7_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 32.0))); + private static final float cos9_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 32.0))); + private static final float cos11_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 32.0))); + private static final float cos13_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 32.0))); + private static final float cos15_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 32.0))); + private static final float cos1_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 16.0))); + private static final float cos3_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 16.0))); + private static final float cos5_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 16.0))); + private static final float cos7_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 16.0))); + private static final float cos1_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 8.0))); + private static final float cos3_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 8.0))); + private static final float cos1_4 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 4.0))); + + // Note: These values are not in the same order + // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3 + // private float d[] = {0.000000000, -4.000442505}; + + private static float d[] = null; + + /** + * d[] split into subarrays of length 16. This provides for + * more faster access by allowing a block of 16 to be addressed + * with constant offset. + **/ + private static float d16[][] = null; + + /** + * Loads the data for the d[] from the resource SFd.ser. + * @return the loaded values for d[]. + */ + static private float[] load_d() + { + try + { + Class elemType = Float.TYPE; + Object o = JavaLayerUtils.deserializeArrayResource("sfd.ser", elemType, 512); + return (float[])o; + } + catch (IOException ex) + { + throw new ExceptionInInitializerError(ex); + } + } + + /** + * Converts a 1D array into a number of smaller arrays. This is used + * to achieve offset + constant indexing into an array. Each sub-array + * represents a block of values of the original array. + * @param array The array to split up into blocks. + * @param blockSize The size of the blocks to split the array + * into. This must be an exact divisor of + * the length of the array, or some data + * will be lost from the main array. + * + * @return An array of arrays in which each element in the returned + * array will be of length blockSize. + */ + static private float[][] splitArray(final float[] array, final int blockSize) + { + int size = array.length / blockSize; + float[][] split = new float[size][]; + for (int i=0; i array.length) + { + len = array.length-offs; + } + + if (len < 0) + len = 0; + + float[] subarray = new float[len]; + for (int i=0; i}_?=j-U~>Fw(7>+kIF?eXsO@AUAr@ipgn^*Qyr_B!^v z_dEBz_&oTX_}%#(`Cj>+`QG{-`d|8=`rrE>`(XQ^`{4W_{9*i&{IUGe{PFz}{WASh z{c`=1{j&Yi{qp`2{xkkl{&W6|{+s@*{=5Fm{@ecR{`>z6{~Z4;|2+Rp|6KoU|9t<5 z|B(Nf|DgY<|FHkK|G@vq|Iq)~|KR`V|M36#004dfdHi+warABPY3pU@VdGujS=v?B zQPNG$Ny$aULBT%0JiI!&IJY*nG_x|XFt0AHEUPN0D5fT)B%&gqAf6u_9vdAR92pxJ z8W$NB7!?;3784Z`6cG~;5)Tm#5DX7Y4$BTp4ayBl49N^g3&;yc3dagY3C0OU2*n6Q z2gCa0Hgqv0E7T|0B`_k d0AK)E08ju(06+jZ05AY303ZMu01yBO001A}1w;S< literal 0 HcmV?d00001 diff --git a/src/javazoom/jl/decoder/huffcodetab.java b/src/javazoom/jl/decoder/huffcodetab.java new file mode 100644 index 0000000..8697564 --- /dev/null +++ b/src/javazoom/jl/decoder/huffcodetab.java @@ -0,0 +1,600 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 16/11/99 Renamed class, added javadoc, and changed table + * name from String to 3 chars. mdm@techie.com + * 02/15/99 Java Conversion by E.B, javalayer@javazoom.net + * + * 04/19/97 : Adapted from the ISO MPEG Audio Subgroup Software Simulation + * Group's public c source for its MPEG audio decoder. Miscellaneous + * changes by Jeff Tsay (ctsay@pasteur.eecs.berkeley.edu). + *----------------------------------------------------------------------- + * Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved + * MPEG/audio coding/decoding software, work in progress + * NOT for public distribution until verified and approved by the + * MPEG/audio committee. For further information, please contact + * Davis Pan, 508-493-2241, e-mail: pan@3d.enet.dec.com + * + * VERSION 4.1 + * changes made since last update: + * date programmers comment + * 27.2.92 F.O.Witte (ITT Intermetall) + * 8/24/93 M. Iwadare Changed for 1 pass decoding. + * 7/14/94 J. Koller useless 'typedef' before huffcodetab removed + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +/** + * Class to implements Huffman decoder. + */ +final class huffcodetab +{ + private static final int MXOFF=250; + private static final int HTN=34; + + private char tablename0 = ' '; /* string, containing table_description */ + private char tablename1 = ' '; /* string, containing table_description */ + private char tablename2 = ' '; /* string, containing table_description */ + + private int xlen; /* max. x-index+ */ + private int ylen; /* max. y-index+ */ + private int linbits; /* number of linbits */ + private int linmax; /* max number to be stored in linbits */ + private int ref; /* a positive value indicates a reference */ + private int[] table=null; /* pointer to array[xlen][ylen] */ + private int[] hlen=null; /* pointer to array[xlen][ylen] */ + private int[][] val=null; /* decoder tree */ + private int treelen; /* length of decoder tree */ + + private static int ValTab0[][] = { + {0,0} // dummy + }; + + private static int ValTab1[][] = { + {2,1},{0,0},{2,1},{0,16},{2,1},{0,1},{0,17}, + }; + + private static int ValTab2[][] = { + {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1},{2,1}, + {0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34}, + }; + + private static int ValTab3[][] = { + {4,1},{2,1},{0,0},{0,1},{2,1},{0,17},{2,1},{0,16},{4,1},{2,1}, + {0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34}, + }; + + private static int ValTab4[][] = {{0,0}}; // dummy + + private static int ValTab5[][] = { + {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{8,1},{4,1}, + {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{8,1},{4,1},{2,1},{0,34}, + {0,48},{2,1},{0,3},{0,19},{2,1},{0,49},{2,1},{0,50},{2,1},{0,35}, + {0,51}, + }; + + private static int ValTab6[][] = { + {6,1},{4,1},{2,1},{0,0},{0,16},{0,17},{6,1},{2,1},{0,1},{2,1}, + {0,32},{0,33},{6,1},{2,1},{0,18},{2,1},{0,2},{0,34},{4,1},{2,1}, + {0,49},{0,19},{4,1},{2,1},{0,48},{0,50},{2,1},{0,35},{2,1},{0,3}, + {0,51}, + }; + + private static int ValTab7[][] = { + {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{8,1},{2,1},{0,17},{4,1}, + {2,1},{0,32},{0,2},{0,33},{18,1},{6,1},{2,1},{0,18},{2,1},{0,34}, + {0,48},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1},{0,3},{0,50},{2,1}, + {0,35},{0,4},{10,1},{4,1},{2,1},{0,64},{0,65},{2,1},{0,20},{2,1}, + {0,66},{0,36},{12,1},{6,1},{4,1},{2,1},{0,51},{0,67},{0,80},{4,1}, + {2,1},{0,52},{0,5},{0,81},{6,1},{2,1},{0,21},{2,1},{0,82},{0,37}, + {4,1},{2,1},{0,68},{0,53},{4,1},{2,1},{0,83},{0,84},{2,1},{0,69}, + {0,85}, + }; + + private static int ValTab8[][] = { + {6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1},{2,1}, + {0,33},{0,18},{14,1},{4,1},{2,1},{0,32},{0,2},{2,1},{0,34},{4,1}, + {2,1},{0,48},{0,3},{2,1},{0,49},{0,19},{14,1},{8,1},{4,1},{2,1}, + {0,50},{0,35},{2,1},{0,64},{0,4},{2,1},{0,65},{2,1},{0,20},{0,66}, + {12,1},{6,1},{2,1},{0,36},{2,1},{0,51},{0,80},{4,1},{2,1},{0,67}, + {0,52},{0,81},{6,1},{2,1},{0,21},{2,1},{0,5},{0,82},{6,1},{2,1}, + {0,37},{2,1},{0,68},{0,53},{2,1},{0,83},{2,1},{0,69},{2,1},{0,84}, + {0,85}, + }; + + private static int ValTab9[][] = { + {8,1},{4,1},{2,1},{0,0},{0,16},{2,1},{0,1},{0,17},{10,1},{4,1}, + {2,1},{0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34},{12,1},{6,1}, + {4,1},{2,1},{0,48},{0,3},{0,49},{2,1},{0,19},{2,1},{0,50},{0,35}, + {12,1},{4,1},{2,1},{0,65},{0,20},{4,1},{2,1},{0,64},{0,51},{2,1}, + {0,66},{0,36},{10,1},{6,1},{4,1},{2,1},{0,4},{0,80},{0,67},{2,1}, + {0,52},{0,81},{8,1},{4,1},{2,1},{0,21},{0,82},{2,1},{0,37},{0,68}, + {6,1},{4,1},{2,1},{0,5},{0,84},{0,83},{2,1},{0,53},{2,1},{0,69}, + {0,85}, + }; + + private static int ValTab10[][] = { + {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{10,1},{2,1},{0,17},{4,1}, + {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{28,1},{8,1},{4,1},{2,1}, + {0,34},{0,48},{2,1},{0,49},{0,19},{8,1},{4,1},{2,1},{0,3},{0,50}, + {2,1},{0,35},{0,64},{4,1},{2,1},{0,65},{0,20},{4,1},{2,1},{0,4}, + {0,51},{2,1},{0,66},{0,36},{28,1},{10,1},{6,1},{4,1},{2,1},{0,80}, + {0,5},{0,96},{2,1},{0,97},{0,22},{12,1},{6,1},{4,1},{2,1},{0,67}, + {0,52},{0,81},{2,1},{0,21},{2,1},{0,82},{0,37},{4,1},{2,1},{0,38}, + {0,54},{0,113},{20,1},{8,1},{2,1},{0,23},{4,1},{2,1},{0,68},{0,83}, + {0,6},{6,1},{4,1},{2,1},{0,53},{0,69},{0,98},{2,1},{0,112},{2,1}, + {0,7},{0,100},{14,1},{4,1},{2,1},{0,114},{0,39},{6,1},{2,1},{0,99}, + {2,1},{0,84},{0,85},{2,1},{0,70},{0,115},{8,1},{4,1},{2,1},{0,55}, + {0,101},{2,1},{0,86},{0,116},{6,1},{2,1},{0,71},{2,1},{0,102},{0,117}, + {4,1},{2,1},{0,87},{0,118},{2,1},{0,103},{0,119}, + }; + + private static int ValTab11[][] = { + {6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{8,1},{2,1},{0,17},{4,1}, + {2,1},{0,32},{0,2},{0,18},{24,1},{8,1},{2,1},{0,33},{2,1},{0,34}, + {2,1},{0,48},{0,3},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1},{0,50}, + {0,35},{4,1},{2,1},{0,64},{0,4},{2,1},{0,65},{0,20},{30,1},{16,1}, + {10,1},{4,1},{2,1},{0,66},{0,36},{4,1},{2,1},{0,51},{0,67},{0,80}, + {4,1},{2,1},{0,52},{0,81},{0,97},{6,1},{2,1},{0,22},{2,1},{0,6}, + {0,38},{2,1},{0,98},{2,1},{0,21},{2,1},{0,5},{0,82},{16,1},{10,1}, + {6,1},{4,1},{2,1},{0,37},{0,68},{0,96},{2,1},{0,99},{0,54},{4,1}, + {2,1},{0,112},{0,23},{0,113},{16,1},{6,1},{4,1},{2,1},{0,7},{0,100}, + {0,114},{2,1},{0,39},{4,1},{2,1},{0,83},{0,53},{2,1},{0,84},{0,69}, + {10,1},{4,1},{2,1},{0,70},{0,115},{2,1},{0,55},{2,1},{0,101},{0,86}, + {10,1},{6,1},{4,1},{2,1},{0,85},{0,87},{0,116},{2,1},{0,71},{0,102}, + {4,1},{2,1},{0,117},{0,118},{2,1},{0,103},{0,119}, + }; + + private static int ValTab12[][] = { + {12,1},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{2,1},{0,0},{2,1}, + {0,32},{0,2},{16,1},{4,1},{2,1},{0,33},{0,18},{4,1},{2,1},{0,34}, + {0,49},{2,1},{0,19},{2,1},{0,48},{2,1},{0,3},{0,64},{26,1},{8,1}, + {4,1},{2,1},{0,50},{0,35},{2,1},{0,65},{0,51},{10,1},{4,1},{2,1}, + {0,20},{0,66},{2,1},{0,36},{2,1},{0,4},{0,80},{4,1},{2,1},{0,67}, + {0,52},{2,1},{0,81},{0,21},{28,1},{14,1},{8,1},{4,1},{2,1},{0,82}, + {0,37},{2,1},{0,83},{0,53},{4,1},{2,1},{0,96},{0,22},{0,97},{4,1}, + {2,1},{0,98},{0,38},{6,1},{4,1},{2,1},{0,5},{0,6},{0,68},{2,1}, + {0,84},{0,69},{18,1},{10,1},{4,1},{2,1},{0,99},{0,54},{4,1},{2,1}, + {0,112},{0,7},{0,113},{4,1},{2,1},{0,23},{0,100},{2,1},{0,70},{0,114}, + {10,1},{6,1},{2,1},{0,39},{2,1},{0,85},{0,115},{2,1},{0,55},{0,86}, + {8,1},{4,1},{2,1},{0,101},{0,116},{2,1},{0,71},{0,102},{4,1},{2,1}, + {0,117},{0,87},{2,1},{0,118},{2,1},{0,103},{0,119}, + }; + + private static int ValTab13[][] = { + {2,1},{0,0},{6,1},{2,1},{0,16},{2,1},{0,1},{0,17},{28,1},{8,1}, + {4,1},{2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{8,1},{4,1},{2,1}, + {0,34},{0,48},{2,1},{0,3},{0,49},{6,1},{2,1},{0,19},{2,1},{0,50}, + {0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{70,1},{28,1},{14,1},{6,1}, + {2,1},{0,20},{2,1},{0,51},{0,66},{4,1},{2,1},{0,36},{0,80},{2,1}, + {0,67},{0,52},{4,1},{2,1},{0,81},{0,21},{4,1},{2,1},{0,5},{0,82}, + {2,1},{0,37},{2,1},{0,68},{0,83},{14,1},{8,1},{4,1},{2,1},{0,96}, + {0,6},{2,1},{0,97},{0,22},{4,1},{2,1},{0,128},{0,8},{0,129},{16,1}, + {8,1},{4,1},{2,1},{0,53},{0,98},{2,1},{0,38},{0,84},{4,1},{2,1}, + {0,69},{0,99},{2,1},{0,54},{0,112},{6,1},{4,1},{2,1},{0,7},{0,85}, + {0,113},{2,1},{0,23},{2,1},{0,39},{0,55},{72,1},{24,1},{12,1},{4,1}, + {2,1},{0,24},{0,130},{2,1},{0,40},{4,1},{2,1},{0,100},{0,70},{0,114}, + {8,1},{4,1},{2,1},{0,132},{0,72},{2,1},{0,144},{0,9},{2,1},{0,145}, + {0,25},{24,1},{14,1},{8,1},{4,1},{2,1},{0,115},{0,101},{2,1},{0,86}, + {0,116},{4,1},{2,1},{0,71},{0,102},{0,131},{6,1},{2,1},{0,56},{2,1}, + {0,117},{0,87},{2,1},{0,146},{0,41},{14,1},{8,1},{4,1},{2,1},{0,103}, + {0,133},{2,1},{0,88},{0,57},{2,1},{0,147},{2,1},{0,73},{0,134},{6,1}, + {2,1},{0,160},{2,1},{0,104},{0,10},{2,1},{0,161},{0,26},{68,1},{24,1}, + {12,1},{4,1},{2,1},{0,162},{0,42},{4,1},{2,1},{0,149},{0,89},{2,1}, + {0,163},{0,58},{8,1},{4,1},{2,1},{0,74},{0,150},{2,1},{0,176},{0,11}, + {2,1},{0,177},{0,27},{20,1},{8,1},{2,1},{0,178},{4,1},{2,1},{0,118}, + {0,119},{0,148},{6,1},{4,1},{2,1},{0,135},{0,120},{0,164},{4,1},{2,1}, + {0,105},{0,165},{0,43},{12,1},{6,1},{4,1},{2,1},{0,90},{0,136},{0,179}, + {2,1},{0,59},{2,1},{0,121},{0,166},{6,1},{4,1},{2,1},{0,106},{0,180}, + {0,192},{4,1},{2,1},{0,12},{0,152},{0,193},{60,1},{22,1},{10,1},{6,1}, + {2,1},{0,28},{2,1},{0,137},{0,181},{2,1},{0,91},{0,194},{4,1},{2,1}, + {0,44},{0,60},{4,1},{2,1},{0,182},{0,107},{2,1},{0,196},{0,76},{16,1}, + {8,1},{4,1},{2,1},{0,168},{0,138},{2,1},{0,208},{0,13},{2,1},{0,209}, + {2,1},{0,75},{2,1},{0,151},{0,167},{12,1},{6,1},{2,1},{0,195},{2,1}, + {0,122},{0,153},{4,1},{2,1},{0,197},{0,92},{0,183},{4,1},{2,1},{0,29}, + {0,210},{2,1},{0,45},{2,1},{0,123},{0,211},{52,1},{28,1},{12,1},{4,1}, + {2,1},{0,61},{0,198},{4,1},{2,1},{0,108},{0,169},{2,1},{0,154},{0,212}, + {8,1},{4,1},{2,1},{0,184},{0,139},{2,1},{0,77},{0,199},{4,1},{2,1}, + {0,124},{0,213},{2,1},{0,93},{0,224},{10,1},{4,1},{2,1},{0,225},{0,30}, + {4,1},{2,1},{0,14},{0,46},{0,226},{8,1},{4,1},{2,1},{0,227},{0,109}, + {2,1},{0,140},{0,228},{4,1},{2,1},{0,229},{0,186},{0,240},{38,1},{16,1}, + {4,1},{2,1},{0,241},{0,31},{6,1},{4,1},{2,1},{0,170},{0,155},{0,185}, + {2,1},{0,62},{2,1},{0,214},{0,200},{12,1},{6,1},{2,1},{0,78},{2,1}, + {0,215},{0,125},{2,1},{0,171},{2,1},{0,94},{0,201},{6,1},{2,1},{0,15}, + {2,1},{0,156},{0,110},{2,1},{0,242},{0,47},{32,1},{16,1},{6,1},{4,1}, + {2,1},{0,216},{0,141},{0,63},{6,1},{2,1},{0,243},{2,1},{0,230},{0,202}, + {2,1},{0,244},{0,79},{8,1},{4,1},{2,1},{0,187},{0,172},{2,1},{0,231}, + {0,245},{4,1},{2,1},{0,217},{0,157},{2,1},{0,95},{0,232},{30,1},{12,1}, + {6,1},{2,1},{0,111},{2,1},{0,246},{0,203},{4,1},{2,1},{0,188},{0,173}, + {0,218},{8,1},{2,1},{0,247},{4,1},{2,1},{0,126},{0,127},{0,142},{6,1}, + {4,1},{2,1},{0,158},{0,174},{0,204},{2,1},{0,248},{0,143},{18,1},{8,1}, + {4,1},{2,1},{0,219},{0,189},{2,1},{0,234},{0,249},{4,1},{2,1},{0,159}, + {0,235},{2,1},{0,190},{2,1},{0,205},{0,250},{14,1},{4,1},{2,1},{0,221}, + {0,236},{6,1},{4,1},{2,1},{0,233},{0,175},{0,220},{2,1},{0,206},{0,251}, + {8,1},{4,1},{2,1},{0,191},{0,222},{2,1},{0,207},{0,238},{4,1},{2,1}, + {0,223},{0,239},{2,1},{0,255},{2,1},{0,237},{2,1},{0,253},{2,1},{0,252}, + {0,254}, + }; + + private static int ValTab14[][] = { + {0,0} // dummy + }; + + private static int ValTab15[][] = { + {16,1},{6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1}, + {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{50,1},{16,1},{6,1},{2,1}, + {0,34},{2,1},{0,48},{0,49},{6,1},{2,1},{0,19},{2,1},{0,3},{0,64}, + {2,1},{0,50},{0,35},{14,1},{6,1},{4,1},{2,1},{0,4},{0,20},{0,65}, + {4,1},{2,1},{0,51},{0,66},{2,1},{0,36},{0,67},{10,1},{6,1},{2,1}, + {0,52},{2,1},{0,80},{0,5},{2,1},{0,81},{0,21},{4,1},{2,1},{0,82}, + {0,37},{4,1},{2,1},{0,68},{0,83},{0,97},{90,1},{36,1},{18,1},{10,1}, + {6,1},{2,1},{0,53},{2,1},{0,96},{0,6},{2,1},{0,22},{0,98},{4,1}, + {2,1},{0,38},{0,84},{2,1},{0,69},{0,99},{10,1},{6,1},{2,1},{0,54}, + {2,1},{0,112},{0,7},{2,1},{0,113},{0,85},{4,1},{2,1},{0,23},{0,100}, + {2,1},{0,114},{0,39},{24,1},{16,1},{8,1},{4,1},{2,1},{0,70},{0,115}, + {2,1},{0,55},{0,101},{4,1},{2,1},{0,86},{0,128},{2,1},{0,8},{0,116}, + {4,1},{2,1},{0,129},{0,24},{2,1},{0,130},{0,40},{16,1},{8,1},{4,1}, + {2,1},{0,71},{0,102},{2,1},{0,131},{0,56},{4,1},{2,1},{0,117},{0,87}, + {2,1},{0,132},{0,72},{6,1},{4,1},{2,1},{0,144},{0,25},{0,145},{4,1}, + {2,1},{0,146},{0,118},{2,1},{0,103},{0,41},{92,1},{36,1},{18,1},{10,1}, + {4,1},{2,1},{0,133},{0,88},{4,1},{2,1},{0,9},{0,119},{0,147},{4,1}, + {2,1},{0,57},{0,148},{2,1},{0,73},{0,134},{10,1},{6,1},{2,1},{0,104}, + {2,1},{0,160},{0,10},{2,1},{0,161},{0,26},{4,1},{2,1},{0,162},{0,42}, + {2,1},{0,149},{0,89},{26,1},{14,1},{6,1},{2,1},{0,163},{2,1},{0,58}, + {0,135},{4,1},{2,1},{0,120},{0,164},{2,1},{0,74},{0,150},{6,1},{4,1}, + {2,1},{0,105},{0,176},{0,177},{4,1},{2,1},{0,27},{0,165},{0,178},{14,1}, + {8,1},{4,1},{2,1},{0,90},{0,43},{2,1},{0,136},{0,151},{2,1},{0,179}, + {2,1},{0,121},{0,59},{8,1},{4,1},{2,1},{0,106},{0,180},{2,1},{0,75}, + {0,193},{4,1},{2,1},{0,152},{0,137},{2,1},{0,28},{0,181},{80,1},{34,1}, + {16,1},{6,1},{4,1},{2,1},{0,91},{0,44},{0,194},{6,1},{4,1},{2,1}, + {0,11},{0,192},{0,166},{2,1},{0,167},{0,122},{10,1},{4,1},{2,1},{0,195}, + {0,60},{4,1},{2,1},{0,12},{0,153},{0,182},{4,1},{2,1},{0,107},{0,196}, + {2,1},{0,76},{0,168},{20,1},{10,1},{4,1},{2,1},{0,138},{0,197},{4,1}, + {2,1},{0,208},{0,92},{0,209},{4,1},{2,1},{0,183},{0,123},{2,1},{0,29}, + {2,1},{0,13},{0,45},{12,1},{4,1},{2,1},{0,210},{0,211},{4,1},{2,1}, + {0,61},{0,198},{2,1},{0,108},{0,169},{6,1},{4,1},{2,1},{0,154},{0,184}, + {0,212},{4,1},{2,1},{0,139},{0,77},{2,1},{0,199},{0,124},{68,1},{34,1}, + {18,1},{10,1},{4,1},{2,1},{0,213},{0,93},{4,1},{2,1},{0,224},{0,14}, + {0,225},{4,1},{2,1},{0,30},{0,226},{2,1},{0,170},{0,46},{8,1},{4,1}, + {2,1},{0,185},{0,155},{2,1},{0,227},{0,214},{4,1},{2,1},{0,109},{0,62}, + {2,1},{0,200},{0,140},{16,1},{8,1},{4,1},{2,1},{0,228},{0,78},{2,1}, + {0,215},{0,125},{4,1},{2,1},{0,229},{0,186},{2,1},{0,171},{0,94},{8,1}, + {4,1},{2,1},{0,201},{0,156},{2,1},{0,241},{0,31},{6,1},{4,1},{2,1}, + {0,240},{0,110},{0,242},{2,1},{0,47},{0,230},{38,1},{18,1},{8,1},{4,1}, + {2,1},{0,216},{0,243},{2,1},{0,63},{0,244},{6,1},{2,1},{0,79},{2,1}, + {0,141},{0,217},{2,1},{0,187},{0,202},{8,1},{4,1},{2,1},{0,172},{0,231}, + {2,1},{0,126},{0,245},{8,1},{4,1},{2,1},{0,157},{0,95},{2,1},{0,232}, + {0,142},{2,1},{0,246},{0,203},{34,1},{18,1},{10,1},{6,1},{4,1},{2,1}, + {0,15},{0,174},{0,111},{2,1},{0,188},{0,218},{4,1},{2,1},{0,173},{0,247}, + {2,1},{0,127},{0,233},{8,1},{4,1},{2,1},{0,158},{0,204},{2,1},{0,248}, + {0,143},{4,1},{2,1},{0,219},{0,189},{2,1},{0,234},{0,249},{16,1},{8,1}, + {4,1},{2,1},{0,159},{0,220},{2,1},{0,205},{0,235},{4,1},{2,1},{0,190}, + {0,250},{2,1},{0,175},{0,221},{14,1},{6,1},{4,1},{2,1},{0,236},{0,206}, + {0,251},{4,1},{2,1},{0,191},{0,237},{2,1},{0,222},{0,252},{6,1},{4,1}, + {2,1},{0,207},{0,253},{0,238},{4,1},{2,1},{0,223},{0,254},{2,1},{0,239}, + {0,255}, + }; + + private static int ValTab16[][] = { + {2,1},{0,0},{6,1},{2,1},{0,16},{2,1},{0,1},{0,17},{42,1},{8,1}, + {4,1},{2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{10,1},{6,1},{2,1}, + {0,34},{2,1},{0,48},{0,3},{2,1},{0,49},{0,19},{10,1},{4,1},{2,1}, + {0,50},{0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{6,1},{2,1},{0,20}, + {2,1},{0,51},{0,66},{4,1},{2,1},{0,36},{0,80},{2,1},{0,67},{0,52}, + {138,1},{40,1},{16,1},{6,1},{4,1},{2,1},{0,5},{0,21},{0,81},{4,1}, + {2,1},{0,82},{0,37},{4,1},{2,1},{0,68},{0,53},{0,83},{10,1},{6,1}, + {4,1},{2,1},{0,96},{0,6},{0,97},{2,1},{0,22},{0,98},{8,1},{4,1}, + {2,1},{0,38},{0,84},{2,1},{0,69},{0,99},{4,1},{2,1},{0,54},{0,112}, + {0,113},{40,1},{18,1},{8,1},{2,1},{0,23},{2,1},{0,7},{2,1},{0,85}, + {0,100},{4,1},{2,1},{0,114},{0,39},{4,1},{2,1},{0,70},{0,101},{0,115}, + {10,1},{6,1},{2,1},{0,55},{2,1},{0,86},{0,8},{2,1},{0,128},{0,129}, + {6,1},{2,1},{0,24},{2,1},{0,116},{0,71},{2,1},{0,130},{2,1},{0,40}, + {0,102},{24,1},{14,1},{8,1},{4,1},{2,1},{0,131},{0,56},{2,1},{0,117}, + {0,132},{4,1},{2,1},{0,72},{0,144},{0,145},{6,1},{2,1},{0,25},{2,1}, + {0,9},{0,118},{2,1},{0,146},{0,41},{14,1},{8,1},{4,1},{2,1},{0,133}, + {0,88},{2,1},{0,147},{0,57},{4,1},{2,1},{0,160},{0,10},{0,26},{8,1}, + {2,1},{0,162},{2,1},{0,103},{2,1},{0,87},{0,73},{6,1},{2,1},{0,148}, + {2,1},{0,119},{0,134},{2,1},{0,161},{2,1},{0,104},{0,149},{220,1},{126,1}, + {50,1},{26,1},{12,1},{6,1},{2,1},{0,42},{2,1},{0,89},{0,58},{2,1}, + {0,163},{2,1},{0,135},{0,120},{8,1},{4,1},{2,1},{0,164},{0,74},{2,1}, + {0,150},{0,105},{4,1},{2,1},{0,176},{0,11},{0,177},{10,1},{4,1},{2,1}, + {0,27},{0,178},{2,1},{0,43},{2,1},{0,165},{0,90},{6,1},{2,1},{0,179}, + {2,1},{0,166},{0,106},{4,1},{2,1},{0,180},{0,75},{2,1},{0,12},{0,193}, + {30,1},{14,1},{6,1},{4,1},{2,1},{0,181},{0,194},{0,44},{4,1},{2,1}, + {0,167},{0,195},{2,1},{0,107},{0,196},{8,1},{2,1},{0,29},{4,1},{2,1}, + {0,136},{0,151},{0,59},{4,1},{2,1},{0,209},{0,210},{2,1},{0,45},{0,211}, + {18,1},{6,1},{4,1},{2,1},{0,30},{0,46},{0,226},{6,1},{4,1},{2,1}, + {0,121},{0,152},{0,192},{2,1},{0,28},{2,1},{0,137},{0,91},{14,1},{6,1}, + {2,1},{0,60},{2,1},{0,122},{0,182},{4,1},{2,1},{0,76},{0,153},{2,1}, + {0,168},{0,138},{6,1},{2,1},{0,13},{2,1},{0,197},{0,92},{4,1},{2,1}, + {0,61},{0,198},{2,1},{0,108},{0,154},{88,1},{86,1},{36,1},{16,1},{8,1}, + {4,1},{2,1},{0,139},{0,77},{2,1},{0,199},{0,124},{4,1},{2,1},{0,213}, + {0,93},{2,1},{0,224},{0,14},{8,1},{2,1},{0,227},{4,1},{2,1},{0,208}, + {0,183},{0,123},{6,1},{4,1},{2,1},{0,169},{0,184},{0,212},{2,1},{0,225}, + {2,1},{0,170},{0,185},{24,1},{10,1},{6,1},{4,1},{2,1},{0,155},{0,214}, + {0,109},{2,1},{0,62},{0,200},{6,1},{4,1},{2,1},{0,140},{0,228},{0,78}, + {4,1},{2,1},{0,215},{0,229},{2,1},{0,186},{0,171},{12,1},{4,1},{2,1}, + {0,156},{0,230},{4,1},{2,1},{0,110},{0,216},{2,1},{0,141},{0,187},{8,1}, + {4,1},{2,1},{0,231},{0,157},{2,1},{0,232},{0,142},{4,1},{2,1},{0,203}, + {0,188},{0,158},{0,241},{2,1},{0,31},{2,1},{0,15},{0,47},{66,1},{56,1}, + {2,1},{0,242},{52,1},{50,1},{20,1},{8,1},{2,1},{0,189},{2,1},{0,94}, + {2,1},{0,125},{0,201},{6,1},{2,1},{0,202},{2,1},{0,172},{0,126},{4,1}, + {2,1},{0,218},{0,173},{0,204},{10,1},{6,1},{2,1},{0,174},{2,1},{0,219}, + {0,220},{2,1},{0,205},{0,190},{6,1},{4,1},{2,1},{0,235},{0,237},{0,238}, + {6,1},{4,1},{2,1},{0,217},{0,234},{0,233},{2,1},{0,222},{4,1},{2,1}, + {0,221},{0,236},{0,206},{0,63},{0,240},{4,1},{2,1},{0,243},{0,244},{2,1}, + {0,79},{2,1},{0,245},{0,95},{10,1},{2,1},{0,255},{4,1},{2,1},{0,246}, + {0,111},{2,1},{0,247},{0,127},{12,1},{6,1},{2,1},{0,143},{2,1},{0,248}, + {0,249},{4,1},{2,1},{0,159},{0,250},{0,175},{8,1},{4,1},{2,1},{0,251}, + {0,191},{2,1},{0,252},{0,207},{4,1},{2,1},{0,253},{0,223},{2,1},{0,254}, + {0,239}, + }; + + private static int ValTab24[][] = { + {60,1},{8,1},{4,1},{2,1},{0,0},{0,16},{2,1},{0,1},{0,17},{14,1}, + {6,1},{4,1},{2,1},{0,32},{0,2},{0,33},{2,1},{0,18},{2,1},{0,34}, + {2,1},{0,48},{0,3},{14,1},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1}, + {0,50},{0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{8,1},{4,1},{2,1}, + {0,20},{0,51},{2,1},{0,66},{0,36},{6,1},{4,1},{2,1},{0,67},{0,52}, + {0,81},{6,1},{4,1},{2,1},{0,80},{0,5},{0,21},{2,1},{0,82},{0,37}, + {250,1},{98,1},{34,1},{18,1},{10,1},{4,1},{2,1},{0,68},{0,83},{2,1}, + {0,53},{2,1},{0,96},{0,6},{4,1},{2,1},{0,97},{0,22},{2,1},{0,98}, + {0,38},{8,1},{4,1},{2,1},{0,84},{0,69},{2,1},{0,99},{0,54},{4,1}, + {2,1},{0,113},{0,85},{2,1},{0,100},{0,70},{32,1},{14,1},{6,1},{2,1}, + {0,114},{2,1},{0,39},{0,55},{2,1},{0,115},{4,1},{2,1},{0,112},{0,7}, + {0,23},{10,1},{4,1},{2,1},{0,101},{0,86},{4,1},{2,1},{0,128},{0,8}, + {0,129},{4,1},{2,1},{0,116},{0,71},{2,1},{0,24},{0,130},{16,1},{8,1}, + {4,1},{2,1},{0,40},{0,102},{2,1},{0,131},{0,56},{4,1},{2,1},{0,117}, + {0,87},{2,1},{0,132},{0,72},{8,1},{4,1},{2,1},{0,145},{0,25},{2,1}, + {0,146},{0,118},{4,1},{2,1},{0,103},{0,41},{2,1},{0,133},{0,88},{92,1}, + {34,1},{16,1},{8,1},{4,1},{2,1},{0,147},{0,57},{2,1},{0,148},{0,73}, + {4,1},{2,1},{0,119},{0,134},{2,1},{0,104},{0,161},{8,1},{4,1},{2,1}, + {0,162},{0,42},{2,1},{0,149},{0,89},{4,1},{2,1},{0,163},{0,58},{2,1}, + {0,135},{2,1},{0,120},{0,74},{22,1},{12,1},{4,1},{2,1},{0,164},{0,150}, + {4,1},{2,1},{0,105},{0,177},{2,1},{0,27},{0,165},{6,1},{2,1},{0,178}, + {2,1},{0,90},{0,43},{2,1},{0,136},{0,179},{16,1},{10,1},{6,1},{2,1}, + {0,144},{2,1},{0,9},{0,160},{2,1},{0,151},{0,121},{4,1},{2,1},{0,166}, + {0,106},{0,180},{12,1},{6,1},{2,1},{0,26},{2,1},{0,10},{0,176},{2,1}, + {0,59},{2,1},{0,11},{0,192},{4,1},{2,1},{0,75},{0,193},{2,1},{0,152}, + {0,137},{67,1},{34,1},{16,1},{8,1},{4,1},{2,1},{0,28},{0,181},{2,1}, + {0,91},{0,194},{4,1},{2,1},{0,44},{0,167},{2,1},{0,122},{0,195},{10,1}, + {6,1},{2,1},{0,60},{2,1},{0,12},{0,208},{2,1},{0,182},{0,107},{4,1}, + {2,1},{0,196},{0,76},{2,1},{0,153},{0,168},{16,1},{8,1},{4,1},{2,1}, + {0,138},{0,197},{2,1},{0,92},{0,209},{4,1},{2,1},{0,183},{0,123},{2,1}, + {0,29},{0,210},{9,1},{4,1},{2,1},{0,45},{0,211},{2,1},{0,61},{0,198}, + {85,250},{4,1},{2,1},{0,108},{0,169},{2,1},{0,154},{0,212},{32,1},{16,1}, + {8,1},{4,1},{2,1},{0,184},{0,139},{2,1},{0,77},{0,199},{4,1},{2,1}, + {0,124},{0,213},{2,1},{0,93},{0,225},{8,1},{4,1},{2,1},{0,30},{0,226}, + {2,1},{0,170},{0,185},{4,1},{2,1},{0,155},{0,227},{2,1},{0,214},{0,109}, + {20,1},{10,1},{6,1},{2,1},{0,62},{2,1},{0,46},{0,78},{2,1},{0,200}, + {0,140},{4,1},{2,1},{0,228},{0,215},{4,1},{2,1},{0,125},{0,171},{0,229}, + {10,1},{4,1},{2,1},{0,186},{0,94},{2,1},{0,201},{2,1},{0,156},{0,110}, + {8,1},{2,1},{0,230},{2,1},{0,13},{2,1},{0,224},{0,14},{4,1},{2,1}, + {0,216},{0,141},{2,1},{0,187},{0,202},{74,1},{2,1},{0,255},{64,1},{58,1}, + {32,1},{16,1},{8,1},{4,1},{2,1},{0,172},{0,231},{2,1},{0,126},{0,217}, + {4,1},{2,1},{0,157},{0,232},{2,1},{0,142},{0,203},{8,1},{4,1},{2,1}, + {0,188},{0,218},{2,1},{0,173},{0,233},{4,1},{2,1},{0,158},{0,204},{2,1}, + {0,219},{0,189},{16,1},{8,1},{4,1},{2,1},{0,234},{0,174},{2,1},{0,220}, + {0,205},{4,1},{2,1},{0,235},{0,190},{2,1},{0,221},{0,236},{8,1},{4,1}, + {2,1},{0,206},{0,237},{2,1},{0,222},{0,238},{0,15},{4,1},{2,1},{0,240}, + {0,31},{0,241},{4,1},{2,1},{0,242},{0,47},{2,1},{0,243},{0,63},{18,1}, + {8,1},{4,1},{2,1},{0,244},{0,79},{2,1},{0,245},{0,95},{4,1},{2,1}, + {0,246},{0,111},{2,1},{0,247},{2,1},{0,127},{0,143},{10,1},{4,1},{2,1}, + {0,248},{0,249},{4,1},{2,1},{0,159},{0,175},{0,250},{8,1},{4,1},{2,1}, + {0,251},{0,191},{2,1},{0,252},{0,207},{4,1},{2,1},{0,253},{0,223},{2,1}, + {0,254},{0,239}, + }; + + private static int ValTab32[][] = { + {2,1},{0,0},{8,1},{4,1},{2,1},{0,8},{0,4},{2,1},{0,1},{0,2}, + {8,1},{4,1},{2,1},{0,12},{0,10},{2,1},{0,3},{0,6},{6,1},{2,1}, + {0,9},{2,1},{0,5},{0,7},{4,1},{2,1},{0,14},{0,13},{2,1},{0,15}, + {0,11}, + }; + + private static int ValTab33[][] = { + {16,1},{8,1},{4,1},{2,1},{0,0},{0,1},{2,1},{0,2},{0,3},{4,1}, + {2,1},{0,4},{0,5},{2,1},{0,6},{0,7},{8,1},{4,1},{2,1},{0,8}, + {0,9},{2,1},{0,10},{0,11},{4,1},{2,1},{0,12},{0,13},{2,1},{0,14}, + {0,15}, + }; + + + public static huffcodetab[] ht = null; /* Simulate extern struct */ + + private static int[] bitbuf = new int[32]; + + /** + * Big Constructor : Computes all Huffman Tables. + */ + private huffcodetab(String S,int XLEN, int YLEN, int LINBITS, int LINMAX, int REF, + int[] TABLE, int[] HLEN, int[][] VAL, int TREELEN) + { + tablename0 = S.charAt(0); + tablename1 = S.charAt(1); + tablename2 = S.charAt(2); + xlen = XLEN; + ylen = YLEN; + linbits = LINBITS; + linmax = LINMAX; + ref = REF; + table = TABLE; + hlen = HLEN; + val = VAL; + treelen = TREELEN; + } + + + + /** + * Do the huffman-decoding. + * note! for counta,countb -the 4 bit value is returned in y, + * discard x. + */ + public static int huffman_decoder(huffcodetab h, int[] x, int[] y, int[] v, int[] w, BitReserve br) + { + // array of all huffcodtable headers + // 0..31 Huffman code table 0..31 + // 32,33 count1-tables + + int dmask = 1 << ((4 * 8) - 1); + int hs = 4 * 8; + int level; + int point = 0; + int error = 1; + level = dmask; + + if (h.val == null) return 2; + + /* table 0 needs no bits */ + if ( h.treelen == 0) + { + x[0] = y[0] = 0; + return 0; + } + + /* Lookup in Huffman table. */ + + /*int bitsAvailable = 0; + int bitIndex = 0; + + int bits[] = bitbuf;*/ + do + { + if (h.val[point][0]==0) + { /*end of tree*/ + x[0] = h.val[point][1] >>> 4; + y[0] = h.val[point][1] & 0xf; + error = 0; + break; + } + + // hget1bit() is called thousands of times, and so needs to be + // ultra fast. + /* + if (bitIndex==bitsAvailable) + { + bitsAvailable = br.readBits(bits, 32); + bitIndex = 0; + } + */ + //if (bits[bitIndex++]!=0) + if (br.hget1bit()!=0) + { + while (h.val[point][1] >= MXOFF) point += h.val[point][1]; + point += h.val[point][1]; + } + else + { + while (h.val[point][0] >= MXOFF) point += h.val[point][0]; + point += h.val[point][0]; + } + level >>>= 1; + // MDM: ht[0] is always 0; + } while ((level !=0 ) || (point < 0 /*ht[0].treelen*/) ); + + // put back any bits not consumed + /* + int unread = (bitsAvailable-bitIndex); + if (unread>0) + br.rewindNbits(unread); + */ + /* Process sign encodings for quadruples tables. */ + // System.out.println(h.tablename); + if (h.tablename0 == '3' && (h.tablename1 == '2' || h.tablename1 == '3')) + { + v[0] = (y[0]>>3) & 1; + w[0] = (y[0]>>2) & 1; + x[0] = (y[0]>>1) & 1; + y[0] = y[0] & 1; + + /* v, w, x and y are reversed in the bitstream. + switch them around to make test bistream work. */ + + if (v[0]!=0) + if (br.hget1bit() != 0) v[0] = -v[0]; + if (w[0]!=0) + if (br.hget1bit() != 0) w[0] = -w[0]; + if (x[0]!=0) + if (br.hget1bit() != 0) x[0] = -x[0]; + if (y[0]!=0) + if (br.hget1bit() != 0) y[0] = -y[0]; + } + else + { + // Process sign and escape encodings for dual tables. + // x and y are reversed in the test bitstream. + // Reverse x and y here to make test bitstream work. + + if (h.linbits != 0) + if ((h.xlen-1) == x[0]) + x[0] += br.hgetbits(h.linbits); + if (x[0] != 0) + if (br.hget1bit() != 0) x[0] = -x[0]; + if (h.linbits != 0) + if ((h.ylen-1) == y[0]) + y[0] += br.hgetbits(h.linbits); + if (y[0] != 0) + if (br.hget1bit() != 0) y[0] = -y[0]; + } + return error; + } + + public static void inithuff() + { + + if (ht!=null) + return; + + ht = new huffcodetab[HTN]; + ht[0] = new huffcodetab("0 ",0,0,0,0,-1,null,null,ValTab0,0); + ht[1] = new huffcodetab("1 ",2,2,0,0,-1,null,null,ValTab1,7); + ht[2] = new huffcodetab("2 ",3,3,0,0,-1,null,null,ValTab2,17); + ht[3] = new huffcodetab("3 ",3,3,0,0,-1,null,null,ValTab3,17); + ht[4] = new huffcodetab("4 ",0,0,0,0,-1,null,null,ValTab4,0); + ht[5] = new huffcodetab("5 ",4,4,0,0,-1,null,null,ValTab5,31); + ht[6] = new huffcodetab("6 ",4,4,0,0,-1,null,null,ValTab6,31); + ht[7] = new huffcodetab("7 ",6,6,0,0,-1,null,null,ValTab7,71); + ht[8] = new huffcodetab("8 ",6,6,0,0,-1,null,null,ValTab8,71); + ht[9] = new huffcodetab("9 ",6,6,0,0,-1,null,null,ValTab9,71); + ht[10] = new huffcodetab("10 ",8,8,0,0,-1,null,null,ValTab10,127); + ht[11] = new huffcodetab("11 ",8,8,0,0,-1,null,null,ValTab11,127); + ht[12] = new huffcodetab("12 ",8,8,0,0,-1,null,null,ValTab12,127); + ht[13] = new huffcodetab("13 ",16,16,0,0,-1,null,null,ValTab13,511); + ht[14] = new huffcodetab("14 ",0,0,0,0,-1,null,null,ValTab14,0); + ht[15] = new huffcodetab("15 ",16,16,0,0,-1,null,null,ValTab15,511); + ht[16] = new huffcodetab("16 ",16,16,1,1,-1,null,null,ValTab16,511); + ht[17] = new huffcodetab("17 ",16,16,2,3,16,null,null,ValTab16,511); + ht[18] = new huffcodetab("18 ",16,16,3,7,16,null,null,ValTab16,511); + ht[19] = new huffcodetab("19 ",16,16,4,15,16,null,null,ValTab16,511); + ht[20] = new huffcodetab("20 ",16,16,6,63,16,null,null,ValTab16,511); + ht[21] = new huffcodetab("21 ",16,16,8,255,16,null,null,ValTab16,511); + ht[22] = new huffcodetab("22 ",16,16,10,1023,16,null,null,ValTab16,511); + ht[23] = new huffcodetab("23 ",16,16,13,8191,16,null,null,ValTab16,511); + ht[24] = new huffcodetab("24 ",16,16,4,15,-1,null,null,ValTab24,512); + ht[25] = new huffcodetab("25 ",16,16,5,31,24,null,null,ValTab24,512); + ht[26] = new huffcodetab("26 ",16,16,6,63,24,null,null,ValTab24,512); + ht[27] = new huffcodetab("27 ",16,16,7,127,24,null,null,ValTab24,512); + ht[28] = new huffcodetab("28 ",16,16,8,255,24,null,null,ValTab24,512); + ht[29] = new huffcodetab("29 ",16,16,9,511,24,null,null,ValTab24,512); + ht[30] = new huffcodetab("30 ",16,16,11,2047,24,null,null,ValTab24,512); + ht[31] = new huffcodetab("31 ",16,16,13,8191,24,null,null,ValTab24,512); + ht[32] = new huffcodetab("32 ",1,16,0,0,-1,null,null,ValTab32,31); + ht[33] = new huffcodetab("33 ",1,16,0,0,-1,null,null,ValTab33,31); + } +} diff --git a/src/javazoom/jl/decoder/l3reorder.ser b/src/javazoom/jl/decoder/l3reorder.ser new file mode 100644 index 0000000000000000000000000000000000000000..da216fcf469620b74fadec2ab33eb91cc99572d5 GIT binary patch literal 13925 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�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 interface provides an abstraction for + * a device capable of sounding audio samples. Samples are written to + * the device wia the write() method. The device assumes + * that these samples are signed 16-bit samples taken at the output frequency + * of the decoder. If the decoder outputs more than one channel, the samples for + * each channel are assumed to appear consecutively, with the lower numbered + * channels preceeding higher-numbered channels. E.g. if there are two + * channels, the samples will appear in this order: + *


+ * 
+ *		l0, r0, l1, r1, l2, r2...
+ * 
+ * where 
+ *	lx indicates the xth sample on channel 0
+ *  rx indicates the xth sample on channel 1
+ * 
+ * + * @since 0.0.8 + * @author Mat McGowan + */ +public interface AudioDevice +{ + /** + * Prepares the AudioDevice for playback of audio samples. + * @param decoder The decoder that will be providing the audio + * samples. + * + * If the audio device is already open, this method returns silently. + * + */ + public void open(Decoder decoder) throws JavaLayerException; + + /** + * Retrieves the open state of this audio device. + * + * @return true if this audio device is open and playing + * audio samples, or false otherwise. + */ + public boolean isOpen(); + + /** + * Writes a number of samples to this AudioDevice. + * + * @param samples The array of signed 16-bit samples to write + * to the audio device. + * @param offs The offset of the first sample. + * @param len The number of samples to write. + * + * This method may return prior to the samples actually being played + * by the audio device. + */ + public void write(short[] samples, int offs, int len) throws JavaLayerException; + + + /** + * Closes this audio device. Any currently playing audio is stopped + * as soon as possible. Any previously written audio data that has not been heard + * is discarded. + * + * The implementation should ensure that any threads currently blocking + * on the device (e.g. during a write or flush + * operation should be unblocked by this method. + */ + public void close(); + + + /** + * Blocks until all audio samples previously written to this audio device have + * been heard. + */ + public void flush(); + + /** + * Retrieves the current playback position in milliseconds. + */ + public int getPosition(); +} diff --git a/src/javazoom/jl/player/AudioDeviceBase.java b/src/javazoom/jl/player/AudioDeviceBase.java new file mode 100644 index 0000000..d9c84f0 --- /dev/null +++ b/src/javazoom/jl/player/AudioDeviceBase.java @@ -0,0 +1,177 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.JavaLayerException; + +/** + * The AudioDeviceBase class provides a simple thread-safe + * implementation of the AudioDevice interface. + * Template methods are provided for subclasses to override and + * in doing so provide the implementation for the main operations + * of the AudioDevice interface. + * + * @since 0.0.8 + * @author Mat McGowan + */ +/* + * REVIEW: It is desirable to be able to use the decoder whe + * in the implementation of open(), but the decoder + * has not yet read a frame, and so much of the + * desired information (sample rate, channels etc.) + * are not available. + */ +public abstract class AudioDeviceBase implements AudioDevice +{ + private boolean open = false; + + private Decoder decoder = null; + + /** + * Opens this audio device. + * + * @param decoder The decoder that will provide audio data + * to this audio device. + */ + public synchronized void open(Decoder decoder) throws JavaLayerException + { + if (!isOpen()) + { + this.decoder = decoder; + openImpl(); + setOpen(true); + } + } + + /** + * Template method to provide the + * implementation for the opening of the audio device. + */ + protected void openImpl() throws JavaLayerException + { + } + + /** + * Sets the open state for this audio device. + */ + protected void setOpen(boolean open) + { + this.open = open; + } + + /** + * Determines if this audio device is open or not. + * + * @return true if the audio device is open, + * false if it is not. + */ + public synchronized boolean isOpen() + { + return open; + } + + /** + * Closes this audio device. If the device is currently playing + * audio, playback is stopped immediately without flushing + * any buffered audio data. + */ + public synchronized void close() + { + if (isOpen()) + { + closeImpl(); + setOpen(false); + decoder = null; + } + } + + /** + * Template method to provide the implementation for + * closing the audio device. + */ + protected void closeImpl() + { + } + + /** + * Writes audio data to this audio device. Audio data is + * assumed to be in the output format of the decoder. This + * method may return before the data has actually been sounded + * by the device if the device buffers audio samples. + * + * @param samples The samples to write to the audio device. + * @param offs The offset into the array of the first sample to write. + * @param len The number of samples from the array to write. + * @throws JavaLayerException if the audio data could not be + * written to the audio device. + * If the audio device is not open, this method does nthing. + */ + public void write(short[] samples, int offs, int len) + throws JavaLayerException + { + if (isOpen()) + { + writeImpl(samples, offs, len); + } + } + + /** + * Template method to provide the implementation for + * writing audio samples to the audio device. + */ + protected void writeImpl(short[] samples, int offs, int len) + throws JavaLayerException + { + } + + /** + * Waits for any buffered audio samples to be played by the + * audio device. This method should only be called prior + * to closing the device. + */ + public void flush() + { + if (isOpen()) + { + flushImpl(); + } + } + + /** + * Template method to provide the implementation for + * flushing any buffered audio data. + */ + protected void flushImpl() + { + } + + /** + * Retrieves the decoder that provides audio data to this + * audio device. + * + * @return The associated decoder. + */ + protected Decoder getDecoder() + { + return decoder; + } +} diff --git a/src/javazoom/jl/player/AudioDeviceFactory.java b/src/javazoom/jl/player/AudioDeviceFactory.java new file mode 100644 index 0000000..2d502d2 --- /dev/null +++ b/src/javazoom/jl/player/AudioDeviceFactory.java @@ -0,0 +1,87 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * An AudioDeviceFactory class is responsible for creating + * a specific AudioDevice implementation. A factory implementation + * can be as simple or complex as desired and may support just one implementation + * or may return several implementations depending upon the execution + * environment. + *

+ * When implementing a factory that provides an AudioDevice that uses + * class that may not be present, the factory should dynamically link to any + * specific implementation classes required to instantiate or test the audio + * implementation. This is so that the application as a whole + * can run without these classes being present. The audio + * device implementation, however, will usually statically link to the classes + * required. (See the JavaSound deivce and factory for an example + * of this.) + * + * @see FactoryRegistry + * + * @since 0.0.8 + * @author Mat McGowan + */ +public abstract class AudioDeviceFactory +{ + /** + * Creates a new AudioDevice. + * + * @return a new instance of a specific class of AudioDevice. + * @throws JavaLayerException if an instance of AudioDevice could not + * be created. + */ + public abstract AudioDevice createAudioDevice() throws JavaLayerException; + + /** + * Creates an instance of an AudioDevice implementation. + * @param loader The ClassLoader to use to + * load the named class, or null to use the + * system class loader. + * @param name The name of the class to load. + * @return A newly-created instance of the audio device class. + */ + protected AudioDevice instantiate(ClassLoader loader, String name) + throws ClassNotFoundException, + IllegalAccessException, + InstantiationException + { + AudioDevice dev = null; + + Class cls = null; + if (loader==null) + { + cls = Class.forName(name); + } + else + { + cls = loader.loadClass(name); + } + + Object o = cls.newInstance(); + dev = (AudioDevice)o; + + return dev; + } +} diff --git a/src/javazoom/jl/player/FactoryRegistry.java b/src/javazoom/jl/player/FactoryRegistry.java new file mode 100644 index 0000000..8919995 --- /dev/null +++ b/src/javazoom/jl/player/FactoryRegistry.java @@ -0,0 +1,129 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import java.util.Enumeration; +import java.util.Hashtable; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * The FactoryRegistry class stores the factories + * for all the audio device implementations available in the system. + *

+ * Instances of this class are thread-safe. + * + * @since 0.0.8 + * @author Mat McGowan + */ + +public class FactoryRegistry extends AudioDeviceFactory +{ + static private FactoryRegistry instance = null; + + static synchronized public FactoryRegistry systemRegistry() + { + if (instance==null) + { + instance = new FactoryRegistry(); + instance.registerDefaultFactories(); + } + return instance; + } + + + protected Hashtable factories = new Hashtable(); + + /** + * Registers an AudioDeviceFactory instance + * with this registry. + */ + public void addFactory(AudioDeviceFactory factory) + { + factories.put(factory.getClass(), factory); + } + + public void removeFactoryType(Class cls) + { + factories.remove(cls); + } + + public void removeFactory(AudioDeviceFactory factory) + { + factories.remove(factory.getClass()); + } + + public AudioDevice createAudioDevice() throws JavaLayerException + { + AudioDevice device = null; + AudioDeviceFactory[] factories = getFactoriesPriority(); + + if (factories==null) + throw new JavaLayerException(this+": no factories registered"); + + JavaLayerException lastEx = null; + for (int i=0; (device==null) && (iJavaSoundAudioDevice implements an audio + * device by using the JavaSound API. + * + * @since 0.0.8 + * @author Mat McGowan + */ +public class JavaSoundAudioDevice extends AudioDeviceBase +{ + private SourceDataLine source = null; + + private AudioFormat fmt = null; + + private byte[] byteBuf = new byte[4096]; + + protected void setAudioFormat(AudioFormat fmt0) + { + fmt = fmt0; + } + + protected AudioFormat getAudioFormat() + { + if (fmt==null) + { + Decoder decoder = getDecoder(); + fmt = new AudioFormat(decoder.getOutputFrequency(), + 16, + decoder.getOutputChannels(), + true, + false); + } + return fmt; + } + + protected DataLine.Info getSourceLineInfo() + { + AudioFormat fmt = getAudioFormat(); + //DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt, 4000); + DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt); + return info; + } + + public void open(AudioFormat fmt) throws JavaLayerException + { + if (!isOpen()) + { + setAudioFormat(fmt); + openImpl(); + setOpen(true); + } + } + + protected void openImpl() + throws JavaLayerException + { + } + + + // createSource fix. + protected void createSource() throws JavaLayerException + { + Throwable t = null; + try + { + Line line = AudioSystem.getLine(getSourceLineInfo()); + if (line instanceof SourceDataLine) + { + source = (SourceDataLine)line; + //source.open(fmt, millisecondsToBytes(fmt, 2000)); + source.open(fmt); + /* + if (source.isControlSupported(FloatControl.Type.MASTER_GAIN)) + { + FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN); + c.setValue(c.getMaximum()); + }*/ + source.start(); + + } + } catch (RuntimeException ex) + { + t = ex; + } + catch (LinkageError ex) + { + t = ex; + } + catch (LineUnavailableException ex) + { + t = ex; + } + if (source==null) throw new JavaLayerException("cannot obtain source audio line", t); + } + + public int millisecondsToBytes(AudioFormat fmt, int time) + { + return (int)(time*(fmt.getSampleRate()*fmt.getChannels()*fmt.getSampleSizeInBits())/8000.0); + } + + protected void closeImpl() + { + if (source!=null) + { + source.close(); + } + } + + protected void writeImpl(short[] samples, int offs, int len) + throws JavaLayerException + { + if (source==null) + createSource(); + + byte[] b = toByteArray(samples, offs, len); + source.write(b, 0, len*2); + } + + protected byte[] getByteArray(int length) + { + if (byteBuf.length < length) + { + byteBuf = new byte[length+1024]; + } + return byteBuf; + } + + protected byte[] toByteArray(short[] samples, int offs, int len) + { + byte[] b = getByteArray(len*2); + int idx = 0; + short s; + while (len-- > 0) + { + s = samples[offs++]; + b[idx++] = (byte)s; + b[idx++] = (byte)(s>>>8); + } + return b; + } + + protected void flushImpl() + { + if (source!=null) + { + source.drain(); + } + } + + public int getPosition() + { + int pos = 0; + if (source!=null) + { + pos = (int)(source.getMicrosecondPosition()/1000); + } + return pos; + } + + /** + * Runs a short test by playing a short silent sound. + */ + public void test() + throws JavaLayerException + { + try + { + open(new AudioFormat(22050, 16, 1, true, false)); + short[] data = new short[22050/10]; + write(data, 0, data.length); + flush(); + close(); + } + catch (RuntimeException ex) + { + throw new JavaLayerException("Device test failed: "+ex); + } + + } +} diff --git a/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java b/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java new file mode 100644 index 0000000..92af492 --- /dev/null +++ b/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java @@ -0,0 +1,85 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * This class is responsible for creating instances of the + * JavaSoundAudioDevice. The audio device implementation is loaded + * and tested dynamically as not all systems will have support + * for JavaSound, or they may have the incorrect version. + */ +public class JavaSoundAudioDeviceFactory extends AudioDeviceFactory +{ + private boolean tested = false; + + static private final String DEVICE_CLASS_NAME = "javazoom.jl.player.JavaSoundAudioDevice"; + + public synchronized AudioDevice createAudioDevice() + throws JavaLayerException + { + if (!tested) + { + testAudioDevice(); + tested = true; + } + + try + { + return createAudioDeviceImpl(); + } + catch (Exception ex) + { + throw new JavaLayerException("unable to create JavaSound device: "+ex); + } + catch (LinkageError ex) + { + throw new JavaLayerException("unable to create JavaSound device: "+ex); + } + } + + protected JavaSoundAudioDevice createAudioDeviceImpl() + throws JavaLayerException + { + ClassLoader loader = getClass().getClassLoader(); + try + { + JavaSoundAudioDevice dev = (JavaSoundAudioDevice)instantiate(loader, DEVICE_CLASS_NAME); + return dev; + } + catch (Exception ex) + { + throw new JavaLayerException("Cannot create JavaSound device", ex); + } + catch (LinkageError ex) + { + throw new JavaLayerException("Cannot create JavaSound device", ex); + } + + } + + public void testAudioDevice() throws JavaLayerException + { + JavaSoundAudioDevice dev = createAudioDeviceImpl(); + dev.test(); + } +} diff --git a/src/javazoom/jl/player/NullAudioDevice.java b/src/javazoom/jl/player/NullAudioDevice.java new file mode 100644 index 0000000..4145fee --- /dev/null +++ b/src/javazoom/jl/player/NullAudioDevice.java @@ -0,0 +1,37 @@ +/* + * 11/19/04 1.0 moved o LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +/** + * The NullAudioDevice implements a silent, no-op + * audio device. This is useful for testing purposes. + * + * @since 0.0.8 + * @author Mat McGowan + */ +public class NullAudioDevice extends AudioDeviceBase +{ + + public int getPosition() + { + return 0; + } +} diff --git a/src/javazoom/jl/player/Player.java b/src/javazoom/jl/player/Player.java new file mode 100644 index 0000000..32fb1f3 --- /dev/null +++ b/src/javazoom/jl/player/Player.java @@ -0,0 +1,251 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import java.io.InputStream; + +import javazoom.jl.decoder.Bitstream; +import javazoom.jl.decoder.BitstreamException; +import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.Header; +import javazoom.jl.decoder.JavaLayerException; +import javazoom.jl.decoder.SampleBuffer; + +/** + * The Player class implements a simple player for playback + * of an MPEG audio stream. + * + * @author Mat McGowan + * @since 0.0.8 + */ + +// REVIEW: the audio device should not be opened until the +// first MPEG audio frame has been decoded. +public class Player +{ + /** + * The current frame number. + */ + private int frame = 0; + + /** + * The MPEG audio bitstream. + */ + // javac blank final bug. + /*final*/ private Bitstream bitstream; + + /** + * The MPEG audio decoder. + */ + /*final*/ private Decoder decoder; + + /** + * The AudioDevice the audio samples are written to. + */ + private AudioDevice audio; + + /** + * Has the player been closed? + */ + private boolean closed = false; + + /** + * Has the player played back all frames from the stream? + */ + private boolean complete = false; + + private int lastPosition = 0; + + /** + * Creates a new Player instance. + */ + public Player(InputStream stream) throws JavaLayerException + { + this(stream, null); + } + + public Player(InputStream stream, AudioDevice device) throws JavaLayerException + { + bitstream = new Bitstream(stream); + decoder = new Decoder(); + + if (device!=null) + { + audio = device; + } + else + { + FactoryRegistry r = FactoryRegistry.systemRegistry(); + audio = r.createAudioDevice(); + } + audio.open(decoder); + } + + public void play() throws JavaLayerException + { + play(Integer.MAX_VALUE); + } + + /** + * Plays a number of MPEG audio frames. + * + * @param frames The number of frames to play. + * @return true if the last frame was played, or false if there are + * more frames. + */ + public boolean play(int frames) throws JavaLayerException + { + boolean ret = true; + + while (frames-- > 0 && ret) + { + ret = decodeFrame(); + } + + if (!ret) + { + // last frame, ensure all data flushed to the audio device. + AudioDevice out = audio; + if (out!=null) + { + out.flush(); + synchronized (this) + { + complete = (!closed); + close(); + } + } + } + return ret; + } + + /** + * Cloases this player. Any audio currently playing is stopped + * immediately. + */ + public synchronized void close() + { + AudioDevice out = audio; + if (out!=null) + { + closed = true; + audio = null; + // this may fail, so ensure object state is set up before + // calling this method. + out.close(); + lastPosition = out.getPosition(); + try + { + bitstream.close(); + } + catch (BitstreamException ex) + { + } + } + } + + /** + * Returns the completed status of this player. + * + * @return true if all available MPEG audio frames have been + * decoded, or false otherwise. + */ + public synchronized boolean isComplete() + { + return complete; + } + + /** + * Retrieves the position in milliseconds of the current audio + * sample being played. This method delegates to the + * AudioDevice that is used by this player to sound + * the decoded audio samples. + */ + public int getPosition() + { + int position = lastPosition; + + AudioDevice out = audio; + if (out!=null) + { + position = out.getPosition(); + } + return position; + } + + /** + * Decodes a single frame. + * + * @return true if there are no more frames to decode, false otherwise. + */ + protected boolean decodeFrame() throws JavaLayerException + { + try + { + AudioDevice out = audio; + if (out==null) + return false; + + Header h = bitstream.readFrame(); + + if (h==null) + return false; + + // sample buffer set when decoder constructed + SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream); + + synchronized (this) + { + out = audio; + if (out!=null) + { + out.write(output.getBuffer(), 0, output.getBufferLength()); + } + } + + bitstream.closeFrame(); + } + catch (RuntimeException ex) + { + throw new JavaLayerException("Exception decoding audio frame", ex); + } +/* + catch (IOException ex) + { + System.out.println("exception decoding audio frame: "+ex); + return false; + } + catch (BitstreamException bitex) + { + System.out.println("exception decoding audio frame: "+bitex); + return false; + } + catch (DecoderException decex) + { + System.out.println("exception decoding audio frame: "+decex); + return false; + } +*/ + return true; + } + + +} diff --git a/src/javazoom/jl/player/PlayerApplet.java b/src/javazoom/jl/player/PlayerApplet.java new file mode 100644 index 0000000..d7c7dc2 --- /dev/null +++ b/src/javazoom/jl/player/PlayerApplet.java @@ -0,0 +1,246 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import java.applet.Applet; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * A simple applet that plays an MPEG audio file. + * The URL (relative to the document base) + * is passed as the "audioURL" parameter. + * + * @author Mat McGowan + * @since 0.0.8 + */ +public class PlayerApplet extends Applet implements Runnable +{ + static public final String AUDIO_PARAMETER = "audioURL"; + + /** + * The Player used to play the MPEG audio file. + */ + private Player player = null; + + /** + * The thread that runs the player. + */ + private Thread playerThread = null; + + private String fileName = null; + + + /** + * Retrieves the AudioDevice instance that will + * be used to sound the audio data. + * + * @return an audio device instance that will be used to + * sound the audio stream. + */ + protected AudioDevice getAudioDevice() throws JavaLayerException + { + return FactoryRegistry.systemRegistry().createAudioDevice(); + } + + /** + * Retrieves the InputStream that provides the MPEG audio + * stream data. + * + * @return an InputStream from which the MPEG audio data + * is read, or null if an error occurs. + */ + protected InputStream getAudioStream() + { + InputStream in = null; + + try + { + URL url = getAudioURL(); + if (url!=null) + in = url.openStream(); + } + catch (IOException ex) + { + System.err.println(ex); + } + return in; + } + + protected String getAudioFileName() + { + String urlString = fileName; + if (urlString==null) + { + urlString = getParameter(AUDIO_PARAMETER); + } + return urlString; + } + + protected URL getAudioURL() + { + String urlString = getAudioFileName(); + URL url = null; + if (urlString!=null) + { + try + { + url = new URL(getDocumentBase(), urlString); + } + catch (Exception ex) + { + System.err.println(ex); + } + } + return url; + } + + /** + * Sets the URL of the audio stream to play. + */ + public void setFileName(String name) + { + fileName = name; + } + + public String getFileName() + { + return fileName; + } + + /** + * Stops the audio player. If the player is already stopped + * this method is a no-op. + */ + protected void stopPlayer() throws JavaLayerException + { + if (player!=null) + { + player.close(); + player = null; + playerThread = null; + } + } + + /** + * Decompresses audio data from an InputStream and plays it + * back through an AudioDevice. The playback is run on a newly + * created thread. + * + * @param in The InputStream that provides the MPEG audio data. + * @param dev The AudioDevice to use to sound the decompressed data. + * + * @throws JavaLayerException if there was a problem decoding + * or playing the audio data. + */ + protected void play(InputStream in, AudioDevice dev) throws JavaLayerException + { + stopPlayer(); + + if (in!=null && dev!=null) + { + player = new Player(in, dev); + playerThread = createPlayerThread(); + playerThread.start(); + } + } + + /** + * Creates a new thread used to run the audio player. + * @return A new Thread that, once started, runs the audio player. + */ + protected Thread createPlayerThread() + { + return new Thread(this, "Audio player thread"); + } + + /** + * Initializes this applet. + */ + public void init() + { + } + + /** + * Starts this applet. An input stream and audio device + * are created and passed to the play() method. + */ + public void start() + { + String name = getAudioFileName(); + try + { + InputStream in = getAudioStream(); + AudioDevice dev = getAudioDevice(); + play(in, dev); + } + catch (JavaLayerException ex) + { + synchronized (System.err) + { + System.err.println("Unable to play "+name); + ex.printStackTrace(System.err); + } + } + } + + /** + * Stops this applet. If audio is currently playing, it is + * stopped. + */ + public void stop() + { + try + { + stopPlayer(); + } + catch (JavaLayerException ex) + { + System.err.println(ex); + } + } + + public void destroy() + { + } + + /** + * The run method for the audio player thread. Simply calls + * play() on the player to play the entire stream. + */ + public void run() + { + if (player!=null) + { + try + { + player.play(); + } + catch (JavaLayerException ex) + { + System.err.println("Problem playing audio: "+ex); + } + } + } +} diff --git a/src/javazoom/jl/player/advanced/AdvancedPlayer.java b/src/javazoom/jl/player/advanced/AdvancedPlayer.java new file mode 100644 index 0000000..45a31e4 --- /dev/null +++ b/src/javazoom/jl/player/advanced/AdvancedPlayer.java @@ -0,0 +1,242 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player.advanced; + +import java.io.InputStream; + +import javazoom.jl.decoder.Bitstream; +import javazoom.jl.decoder.BitstreamException; +import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.Header; +import javazoom.jl.decoder.JavaLayerException; +import javazoom.jl.decoder.SampleBuffer; +import javazoom.jl.player.AudioDevice; +import javazoom.jl.player.FactoryRegistry; + +/** + * a hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame) + * hopefully this will be included in the api + */ +public class AdvancedPlayer +{ + /** The MPEG audio bitstream.*/ + private Bitstream bitstream; + /** The MPEG audio decoder. */ + private Decoder decoder; + /** The AudioDevice the audio samples are written to. */ + private AudioDevice audio; + /** Has the player been closed? */ + private boolean closed = false; + /** Has the player played back all frames from the stream? */ + private boolean complete = false; + private int lastPosition = 0; + /** Listener for the playback process */ + private PlaybackListener listener; + + /** + * Creates a new Player instance. + */ + public AdvancedPlayer(InputStream stream) throws JavaLayerException + { + this(stream, null); + } + + public AdvancedPlayer(InputStream stream, AudioDevice device) throws JavaLayerException + { + bitstream = new Bitstream(stream); + + if (device!=null) audio = device; + else audio = FactoryRegistry.systemRegistry().createAudioDevice(); + audio.open(decoder = new Decoder()); + } + + public void play() throws JavaLayerException + { + play(Integer.MAX_VALUE); + } + + /** + * Plays a number of MPEG audio frames. + * + * @param frames The number of frames to play. + * @return true if the last frame was played, or false if there are + * more frames. + */ + public boolean play(int frames) throws JavaLayerException + { + boolean ret = true; + + // report to listener + if(listener != null) listener.playbackStarted(createEvent(PlaybackEvent.STARTED)); + + while (frames-- > 0 && ret) + { + ret = decodeFrame(); + } + +// if (!ret) + { + // last frame, ensure all data flushed to the audio device. + AudioDevice out = audio; + if (out != null) + { +// System.out.println(audio.getPosition()); + out.flush(); +// System.out.println(audio.getPosition()); + synchronized (this) + { + complete = (!closed); + close(); + } + + // report to listener + if(listener != null) listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED)); + } + } + return ret; + } + + /** + * Cloases this player. Any audio currently playing is stopped + * immediately. + */ + public synchronized void close() + { + AudioDevice out = audio; + if (out != null) + { + closed = true; + audio = null; + // this may fail, so ensure object state is set up before + // calling this method. + out.close(); + lastPosition = out.getPosition(); + try + { + bitstream.close(); + } + catch (BitstreamException ex) + {} + } + } + + /** + * Decodes a single frame. + * + * @return true if there are no more frames to decode, false otherwise. + */ + protected boolean decodeFrame() throws JavaLayerException + { + try + { + AudioDevice out = audio; + if (out == null) return false; + + Header h = bitstream.readFrame(); + if (h == null) return false; + + // sample buffer set when decoder constructed + SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream); + + synchronized (this) + { + out = audio; + if(out != null) + { + out.write(output.getBuffer(), 0, output.getBufferLength()); + } + } + + bitstream.closeFrame(); + } + catch (RuntimeException ex) + { + throw new JavaLayerException("Exception decoding audio frame", ex); + } + return true; + } + + /** + * skips over a single frame + * @return false if there are no more frames to decode, true otherwise. + */ + protected boolean skipFrame() throws JavaLayerException + { + Header h = bitstream.readFrame(); + if (h == null) return false; + bitstream.closeFrame(); + return true; + } + + /** + * Plays a range of MPEG audio frames + * @param start The first frame to play + * @param end The last frame to play + * @return true if the last frame was played, or false if there are more frames. + */ + public boolean play(final int start, final int end) throws JavaLayerException + { + boolean ret = true; + int offset = start; + while (offset-- > 0 && ret) ret = skipFrame(); + return play(end - start); + } + + /** + * Constructs a PlaybackEvent + */ + private PlaybackEvent createEvent(int id) + { + return createEvent(audio, id); + } + + /** + * Constructs a PlaybackEvent + */ + private PlaybackEvent createEvent(AudioDevice dev, int id) + { + return new PlaybackEvent(this, id, dev.getPosition()); + } + + /** + * sets the PlaybackListener + */ + public void setPlayBackListener(PlaybackListener listener) + { + this.listener = listener; + } + + /** + * gets the PlaybackListener + */ + public PlaybackListener getPlayBackListener() + { + return listener; + } + + /** + * closes the player and notifies PlaybackListener + */ + public void stop() + { + listener.playbackFinished(createEvent(PlaybackEvent.STOPPED)); + close(); + } +} \ No newline at end of file diff --git a/src/javazoom/jl/player/advanced/PlaybackEvent.java b/src/javazoom/jl/player/advanced/PlaybackEvent.java new file mode 100644 index 0000000..08e3cae --- /dev/null +++ b/src/javazoom/jl/player/advanced/PlaybackEvent.java @@ -0,0 +1,51 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player.advanced; + +/** + * An event which indicates a Player has performed an 'playback action' + * @author Paul Stanton (http://wanto.f2o.org/) + */ +public class PlaybackEvent +{ + public static int STOPPED = 1; + public static int STARTED = 2; + + private AdvancedPlayer source; + private int frame; + private int id; + + public PlaybackEvent(AdvancedPlayer source, int id, int frame) + { + this.id = id; + this.source = source; + this.frame = frame; + } + + public int getId(){return id;} + public void setId(int id){this.id = id;} + + public int getFrame(){return frame;} + public void setFrame(int frame){this.frame = frame;} + + public AdvancedPlayer getSource(){return source;} + public void setSource(AdvancedPlayer source){this.source = source;} + +} diff --git a/src/javazoom/jl/player/advanced/PlaybackListener.java b/src/javazoom/jl/player/advanced/PlaybackListener.java new file mode 100644 index 0000000..9b04298 --- /dev/null +++ b/src/javazoom/jl/player/advanced/PlaybackListener.java @@ -0,0 +1,30 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player.advanced; + +/** + * Listener for javalayer Player playback + * @author Paul Stanton (http://wanto.f2o.org/) + */ +public abstract class PlaybackListener +{ + public void playbackStarted(PlaybackEvent evt){} + public void playbackFinished(PlaybackEvent evt){} +} diff --git a/src/javazoom/jl/player/advanced/jlap.java b/src/javazoom/jl/player/advanced/jlap.java new file mode 100644 index 0000000..beedea6 --- /dev/null +++ b/src/javazoom/jl/player/advanced/jlap.java @@ -0,0 +1,116 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player.advanced; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * This class implements a sample player using Playback listener. + */ +public class jlap +{ + + public static void main(String[] args) + { + jlap test = new jlap(); + if (args.length != 1) + { + test.showUsage(); + System.exit(0); + } + else + { + try + { + test.play(args[0]); + } + catch (Exception ex) + { + System.err.println(ex.getMessage()); + System.exit(0); + } + } + } + + public void play(String filename) throws JavaLayerException, IOException + { + InfoListener lst = new InfoListener(); + playMp3(new File(filename), lst); + } + + public void showUsage() + { + System.out.println("Usage: jla "); + System.out.println(""); + System.out.println(" e.g. : java javazoom.jl.player.advanced.jlap localfile.mp3"); + } + + public static AdvancedPlayer playMp3(File mp3, PlaybackListener listener) throws IOException, JavaLayerException + { + return playMp3(mp3, 0, Integer.MAX_VALUE, listener); + } + + public static AdvancedPlayer playMp3(File mp3, int start, int end, PlaybackListener listener) throws IOException, JavaLayerException + { + return playMp3(new BufferedInputStream(new FileInputStream(mp3)), start, end, listener); + } + + public static AdvancedPlayer playMp3(final InputStream is, final int start, final int end, PlaybackListener listener) throws JavaLayerException + { + final AdvancedPlayer player = new AdvancedPlayer(is); + player.setPlayBackListener(listener); + // run in new thread + new Thread() + { + public void run() + { + try + { + player.play(start, end); + } + catch (Exception e) + { + throw new RuntimeException(e.getMessage()); + } + } + }.start(); + return player; + } + + public class InfoListener extends PlaybackListener + { + public void playbackStarted(PlaybackEvent evt) + { + System.out.println("Play started from frame " + evt.getFrame()); + } + + public void playbackFinished(PlaybackEvent evt) + { + System.out.println("Play completed at frame " + evt.getFrame()); + System.exit(0); + } + } +} \ No newline at end of file diff --git a/src/javazoom/jl/player/jlp.java b/src/javazoom/jl/player/jlp.java new file mode 100644 index 0000000..ddb3d5e --- /dev/null +++ b/src/javazoom/jl/player/jlp.java @@ -0,0 +1,176 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 06/04/01 Streaming support added. javalayer@javazoom.net + * + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javazoom.jl.decoder.JavaLayerException; + +/** + * The jlp class implements a simple command-line + * player for MPEG audio files. + * + * @author Mat McGowan (mdm@techie.com) + */ +public class jlp +{ + private String fFilename = null; + private boolean remote = false; + + public static void main(String[] args) + { + int retval = 0; + try + { + jlp player = createInstance(args); + if (player!=null) + player.play(); + } + catch (Exception ex) + { + System.err.println(ex); + ex.printStackTrace(System.err); + retval = 1; + } + System.exit(retval); + } + + static public jlp createInstance(String[] args) + { + jlp player = new jlp(); + if (!player.parseArgs(args)) + player = null; + return player; + } + + private jlp() + { + } + + public jlp(String filename) + { + init(filename); + } + + protected void init(String filename) + { + fFilename = filename; + } + + protected boolean parseArgs(String[] args) + { + boolean parsed = false; + if (args.length == 1) + { + init(args[0]); + parsed = true; + remote = false; + } + else if (args.length == 2) + { + if (!(args[0].equals("-url"))) + { + showUsage(); + } + else + { + init(args[1]); + parsed = true; + remote = true; + } + } + else + { + showUsage(); + } + return parsed; + } + + public void showUsage() + { + System.out.println("Usage: jlp [-url] "); + System.out.println(""); + System.out.println(" e.g. : java javazoom.jl.player.jlp localfile.mp3"); + System.out.println(" java javazoom.jl.player.jlp -url http://www.server.com/remotefile.mp3"); + System.out.println(" java javazoom.jl.player.jlp -url http://www.shoutcastserver.com:8000"); + } + + public void play() + throws JavaLayerException + { + try + { + System.out.println("playing "+fFilename+"..."); + InputStream in = null; + if (remote == true) in = getURLInputStream(); + else in = getInputStream(); + AudioDevice dev = getAudioDevice(); + Player player = new Player(in, dev); + player.play(); + } + catch (IOException ex) + { + throw new JavaLayerException("Problem playing file "+fFilename, ex); + } + catch (Exception ex) + { + throw new JavaLayerException("Problem playing file "+fFilename, ex); + } + } + + /** + * Playing file from URL (Streaming). + */ + protected InputStream getURLInputStream() + throws Exception + { + + URL url = new URL(fFilename); + InputStream fin = url.openStream(); + BufferedInputStream bin = new BufferedInputStream(fin); + return bin; + } + + /** + * Playing file from FileInputStream. + */ + protected InputStream getInputStream() + throws IOException + { + FileInputStream fin = new FileInputStream(fFilename); + BufferedInputStream bin = new BufferedInputStream(fin); + return bin; + } + + protected AudioDevice getAudioDevice() + throws JavaLayerException + { + return FactoryRegistry.systemRegistry().createAudioDevice(); + } + +} diff --git a/srctest/AllTests.java b/srctest/AllTests.java new file mode 100644 index 0000000..976f5f3 --- /dev/null +++ b/srctest/AllTests.java @@ -0,0 +1,39 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +import javazoom.jl.decoder.BitstreamTest; +import javazoom.jl.player.jlpTest; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * JavaLayer test suite. + */ +public class AllTests +{ + public static Test suite() + { + TestSuite suite = new TestSuite("Test for javazoom.jl.decoder"); + //$JUnit-BEGIN$ + suite.addTest(new TestSuite(BitstreamTest.class)); + suite.addTest(new TestSuite(jlpTest.class)); + //$JUnit-END$ + return suite; + } +} diff --git a/srctest/javazoom/jl/decoder/BitstreamTest.java b/srctest/javazoom/jl/decoder/BitstreamTest.java new file mode 100644 index 0000000..746f089 --- /dev/null +++ b/srctest/javazoom/jl/decoder/BitstreamTest.java @@ -0,0 +1,155 @@ +/* + * 11/19/2004 : 1.0 moved to LGPL. + * 01/01/2004 : Initial version by E.B javalayer@javazoom.net + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.decoder; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Properties; + +import junit.framework.TestCase; + +/** + * Bitstream unit test. + * It matches test.mp3 properties to test.mp3.properties expected results. + * As we don't ship test.mp3, you have to generate your own test.mp3.properties + * Uncomment out = System.out; in setUp() method to generated it on stdout from + * your own MP3 file. + * @since 0.4 + */ +public class BitstreamTest extends TestCase +{ + private String basefile = null; + private String name = null; + private String filename = null; + private PrintStream out = null; + private Properties props = null; + private FileInputStream mp3in = null; + private Bitstream in = null; + + /** + * Constructor for BitstreamTest. + * @param arg0 + */ + public BitstreamTest(String arg0) + { + super(arg0); + } + /* + * @see TestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + props = new Properties(); + InputStream pin = getClass().getClassLoader().getResourceAsStream("test.mp3.properties"); + props.load(pin); + basefile = (String) props.getProperty("basefile"); + name = (String) props.getProperty("filename"); + filename = basefile + name; + mp3in = new FileInputStream(filename); + in = new Bitstream(mp3in); + //out = System.out; + } + /* + * @see TestCase#tearDown() + */ + protected void tearDown() throws Exception + { + super.tearDown(); + in.close(); + mp3in.close(); + } + + public void testStream() + { + try + { + InputStream id3in = in.getRawID3v2(); + int size = id3in.available(); + Header header = in.readFrame(); + if (out != null) + { + out.println("--- "+filename+" ---"); + out.println("ID3v2Size="+size); + out.println("version="+header.version()); + out.println("version_string="+header.version_string()); + out.println("layer="+header.layer()); + out.println("frequency="+header.frequency()); + out.println("frequency_string="+header.sample_frequency_string()); + out.println("bitrate="+header.bitrate()); + out.println("bitrate_string="+header.bitrate_string()); + out.println("mode="+header.mode()); + out.println("mode_string="+header.mode_string()); + out.println("slots="+header.slots()); + out.println("vbr="+header.vbr()); + out.println("vbr_scale="+header.vbr_scale()); + out.println("max_number_of_frames="+header.max_number_of_frames(mp3in.available())); + out.println("min_number_of_frames="+header.min_number_of_frames(mp3in.available())); + out.println("ms_per_frame="+header.ms_per_frame()); + out.println("frames_per_second="+(float) ((1.0 / (header.ms_per_frame())) * 1000.0)); + out.println("total_ms="+header.total_ms(mp3in.available())); + out.println("SyncHeader="+header.getSyncHeader()); + out.println("checksums="+header.checksums()); + out.println("copyright="+header.copyright()); + out.println("original="+header.original()); + out.println("padding="+header.padding()); + out.println("framesize="+header.calculate_framesize()); + out.println("number_of_subbands="+header.number_of_subbands()); + } + assertEquals("ID3v2Size",Integer.parseInt((String)props.getProperty("ID3v2Size")),size); + assertEquals("version",Integer.parseInt((String)props.getProperty("version")),header.version()); + assertEquals("version_string",(String)props.getProperty("version_string"),header.version_string()); + assertEquals("layer",Integer.parseInt((String)props.getProperty("layer")),header.layer()); + assertEquals("frequency",Integer.parseInt((String)props.getProperty("frequency")),header.frequency()); + assertEquals("frequency_string",(String)props.getProperty("frequency_string"),header.sample_frequency_string()); + assertEquals("bitrate",Integer.parseInt((String)props.getProperty("bitrate")),header.bitrate()); + assertEquals("bitrate_string",(String)props.getProperty("bitrate_string"),header.bitrate_string()); + assertEquals("mode",Integer.parseInt((String)props.getProperty("mode")),header.mode()); + assertEquals("mode_string",(String)props.getProperty("mode_string"),header.mode_string()); + assertEquals("slots",Integer.parseInt((String)props.getProperty("slots")),header.slots()); + assertEquals("vbr",Boolean.valueOf((String)props.getProperty("vbr")),new Boolean(header.vbr())); + assertEquals("vbr_scale",Integer.parseInt((String)props.getProperty("vbr_scale")),header.vbr_scale()); + assertEquals("max_number_of_frames",Integer.parseInt((String)props.getProperty("max_number_of_frames")),header.max_number_of_frames(mp3in.available())); + assertEquals("min_number_of_frames",Integer.parseInt((String)props.getProperty("min_number_of_frames")),header.min_number_of_frames(mp3in.available())); + assertTrue("ms_per_frame",Float.parseFloat((String)props.getProperty("ms_per_frame"))==header.ms_per_frame()); + assertTrue("frames_per_second",Float.parseFloat((String)props.getProperty("frames_per_second"))==(float) ((1.0 / (header.ms_per_frame())) * 1000.0)); + assertTrue("total_ms",Float.parseFloat((String)props.getProperty("total_ms"))==header.total_ms(mp3in.available())); + assertEquals("SyncHeader",Integer.parseInt((String)props.getProperty("SyncHeader")),header.getSyncHeader()); + assertEquals("checksums",Boolean.valueOf((String)props.getProperty("checksums")),new Boolean(header.checksums())); + assertEquals("copyright",Boolean.valueOf((String)props.getProperty("copyright")),new Boolean(header.copyright())); + assertEquals("original",Boolean.valueOf((String)props.getProperty("original")),new Boolean(header.original())); + assertEquals("padding",Boolean.valueOf((String)props.getProperty("padding")),new Boolean(header.padding())); + assertEquals("framesize",Integer.parseInt((String)props.getProperty("framesize")),header.calculate_framesize()); + assertEquals("number_of_subbands",Integer.parseInt((String)props.getProperty("number_of_subbands")),header.number_of_subbands()); + in.closeFrame(); + } + catch (BitstreamException e) + { + assertTrue("BitstreamException : "+e.getMessage(),false); + } + catch (IOException e) + { + assertTrue("IOException : "+e.getMessage(),false); + } + } +} diff --git a/srctest/javazoom/jl/player/jlpTest.java b/srctest/javazoom/jl/player/jlpTest.java new file mode 100644 index 0000000..c885769 --- /dev/null +++ b/srctest/javazoom/jl/player/jlpTest.java @@ -0,0 +1,87 @@ +/* + * 11/19/2004 : 1.0 moved to LGPL. + * 01/01/2004 : Initial version by E.B javalayer@javazoom.net + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +package javazoom.jl.player; + +import java.io.InputStream; +import java.util.Properties; + +import javazoom.jl.decoder.JavaLayerException; +import junit.framework.TestCase; + +/** + * Simple player unit test. + * It takes around 3-6% of CPU and 10MB RAM under Win2K/PIII/1GHz/JDK1.5.0 + * It takes around 10-12% of CPU and 10MB RAM under Win2K/PIII/1GHz/JDK1.4.1 + * It takes around 08-10% of CPU and 10MB RAM under Win2K/PIII/1GHz/JDK1.3.1 + * @since 0.4 + */ +public class jlpTest extends TestCase +{ + private Properties props = null; + private String filename = null; + + /** + * Constructor for jlpTest. + * @param arg0 + */ + public jlpTest(String arg0) + { + super(arg0); + } + /* + * @see TestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + props = new Properties(); + InputStream pin = getClass().getClassLoader().getResourceAsStream("test.mp3.properties"); + props.load(pin); + String basefile = (String) props.getProperty("basefile"); + String name = (String) props.getProperty("filename"); + filename = basefile + name; + //out = System.out; + } + /* + * @see TestCase#tearDown() + */ + protected void tearDown() throws Exception + { + super.tearDown(); + } + + public void testPlay() + { + String[] args = new String[1]; + args[0] = filename; + jlp player = jlp.createInstance(args); + try + { + player.play(); + assertTrue("Play",true); + } + catch (JavaLayerException e) + { + e.printStackTrace(); + assertTrue("JavaLayerException : "+e.getMessage(),false); + } + } +} diff --git a/srctest/test.mp3.properties b/srctest/test.mp3.properties new file mode 100644 index 0000000..a536d2a --- /dev/null +++ b/srctest/test.mp3.properties @@ -0,0 +1,30 @@ +# MP3 file +basefile=c:/data/ +filename=test.mp3 + +# BitStream properties +ID3v2Size=2150 +version=1 +version_string=MPEG-1 +layer=3 +frequency=44100 +frequency_string=44.1 kHz +bitrate=229000 +bitrate_string=229 kb/s +mode=1 +mode_string=Joint stereo +slots=381 +vbr=true +vbr_scale=78 +max_number_of_frames=8122 +min_number_of_frames=8122 +ms_per_frame=26.12245 +frames_per_second=38.28125 +total_ms=212166.53 +SyncHeader=-290752 +checksums=false +copyright=false +original=false +padding=false +framesize=413 +number_of_subbands=27 \ No newline at end of file